use warpui::integration::TestStep; use warpui::windowing::WindowManager; use warpui::{SingletonEntity, WindowId, async_assert}; use super::open_workflow_count; use crate::cloud_object::model::persistence::CloudModel; use crate::cloud_object::{CloudObjectEventEntrypoint, Space}; use crate::drive::OpenWarpDriveObjectSettings; use crate::integration_testing::view_getters::workspace_view; use crate::server::cloud_objects::update_manager::UpdateManager; use crate::server::ids::{ClientId, SyncId}; use crate::workflows::WorkflowViewMode; use crate::workflows::manager::WorkflowOpenSource; use crate::workflows::workflow::Workflow; use crate::workspaces::user_workspaces::UserWorkspaces; /// Create a personal workflow and save its sync ID into the step data. pub fn create_a_personal_workflow(key: impl Into) -> TestStep { let key = key.into(); let workflow = Workflow::new("personal workflow", "echo 'name'"); TestStep::new("Create a personal workflow") .with_action(move |app, _, data| { let client_id = ClientId::new(); let sync_id = SyncId::ClientId(client_id); UpdateManager::handle(app).update(app, |update_manager, ctx| { update_manager.create_workflow( workflow.clone(), UserWorkspaces::as_ref(ctx) .personal_drive(ctx) .expect("User UID must be set in tests"), None, client_id, CloudObjectEventEntrypoint::ManagementUI, true, ctx, ); }); data.insert(key.clone(), sync_id); }) .add_assertion(move |app, _| { CloudModel::handle(app).read(app, |cloud_model, ctx| { async_assert!( cloud_model .active_cloud_objects_in_space(Space::Personal, ctx) .count() > 0, "Workflow exists" ) }) }) } /// Open the workflow saved at `workflow_key` in the active tab of the window saved at `window_key` pub fn open_workflow(window_key: impl Into, workflow_key: impl Into) -> TestStep { let window_key = window_key.into(); let workflow_key = workflow_key.into(); let workflow_other_key = workflow_key.clone(); TestStep::new("Open workflow") .with_action(move |app, _, data| { let workflow_id: &SyncId = data.get(&workflow_key).expect("No saved workflow ID"); let window_id: &WindowId = data.get(&window_key).expect("No saved window ID"); workspace_view(app, *window_id).update(app, |workspace, ctx| { // If the workflow isn't open yet, opening it won't focus the window (we only change // focus if switching to an already-open window). Since the user wouldn't be able to // open a workflow in an unfocused window, switch focus explicitly here. WindowManager::as_ref(ctx).show_window_and_focus_app(*window_id); workspace.open_workflow_in_pane( &WorkflowOpenSource::Existing(*workflow_id), &OpenWarpDriveObjectSettings::default(), WorkflowViewMode::View, ctx, ); }) }) .add_named_assertion_with_data_from_prior_step( "Check workflow is open", move |app, _, data| { let workflow_id: &SyncId = data.get(&workflow_other_key).expect("No workflow ID found"); async_assert!(open_workflow_count(app, *workflow_id) == 1) }, ) }