177 lines · 7.0 KB · Rust
RawDownload
use warpui::integration::TestStep;use warpui::{SingletonEntity, async_assert, async_assert_eq}; use crate::cloud_object::model::persistence::CloudModel;use crate::cloud_object::{CloudObjectEventEntrypoint, CloudObjectLocation, Space};use crate::network::{NetworkStatus, NetworkStatusKind};use crate::server::cloud_objects::listener::Listener;use crate::server::cloud_objects::update_manager::UpdateManager;use crate::server::ids::ClientId;use crate::util::bindings::keybinding_name_to_display_string;use crate::workflows::workflow::Workflow;use crate::workspaces::team::{Team, TeamVisibility};use crate::workspaces::user_workspaces::UserWorkspaces;use crate::workspaces::workspace::Workspace; fn set_and_assert_network_status(status: NetworkStatusKind) -> TestStep {    TestStep::new("Set and assert network status")        .with_action(move |app, _, _| {            NetworkStatus::handle(app).update(app, |network_status, ctx| {                if matches!(status, NetworkStatusKind::Online) {                    network_status.reachability_changed(true, ctx);                } else {                    network_status.reachability_changed(false, ctx);                }            });        })        .add_assertion(move |app, _| {            NetworkStatus::handle(app).read(app, |network_status, _| {                async_assert!(                    network_status.status() == status,                    "network status is correct"                )            })        })} pub fn go_offline() -> TestStep {    set_and_assert_network_status(NetworkStatusKind::Offline)} pub fn go_online() -> TestStep {    set_and_assert_network_status(NetworkStatusKind::Online)} pub fn join_a_workspace() -> TestStep {    TestStep::new("Join a Warp Drive workspace")        .with_action(move |app, _, _| {            UserWorkspaces::handle(app).update(app, |user_workspaces, ctx| {                let workspace_uid = "workspace_uid123456789".to_string().into();                let teams: Vec<Team> = vec![Team {                    uid: "team_uid12345678912345".try_into().expect("ID is valid"),                    name: "My Team".to_string(),                    color: None,                    invite_link: Default::default(),                    members: Default::default(),                    pending_email_invites: Default::default(),                    invite_link_domain_restrictions: Default::default(),                    billing_metadata: Default::default(),                    stripe_customer_id: None,                    settings: Default::default(),                    feature_model_choice: Default::default(),                    is_eligible_for_discovery: false,                    has_billing_history: false,                    visibility: TeamVisibility::Open,                }];                let workspaces: Vec<Workspace> = vec![Workspace {                    uid: workspace_uid,                    name: "My Workspace".to_string(),                    stripe_customer_id: None,                    teams: teams.clone(),                    open_teams: Default::default(),                    billing_metadata: Default::default(),                    bonus_grants_purchased_this_month: Default::default(),                    billing_cycle_usage: None,                    has_billing_history: false,                    settings: Default::default(),                    feature_model_choice: Default::default(),                    invite_link_domain_restrictions: Default::default(),                    pending_email_invites: Default::default(),                    is_eligible_for_discovery: false,                    members: Default::default(),                    total_requests_used_since_last_refresh: 0,                }];                 user_workspaces.update_workspaces(workspaces, ctx);                user_workspaces.set_current_workspace_uid(workspace_uid, ctx)            });        })        .add_assertion(move |app, _| {            UserWorkspaces::handle(app).read(app, |user_workspaces, _| {                async_assert!(user_workspaces.has_teams(), "user is on a team")            })        })        .add_assertion(move |app, _| {            UserWorkspaces::handle(app).read(app, |user_workspaces, _| {                async_assert!(user_workspaces.has_workspaces(), "user is on a workspace")            })        })} pub fn create_a_personal_workflow() -> TestStep {    TestStep::new("Create a personal workflow")        .with_action(move |app, _, _| {            UpdateManager::handle(app).update(app, |update_manager, ctx| {                update_manager.create_workflow(                    Workflow::new("My first workflow", "ls"),                    UserWorkspaces::as_ref(ctx)                        .personal_drive(ctx)                        .expect("User UID must be set in tests"),                    None,                    ClientId::default(),                    CloudObjectEventEntrypoint::ManagementUI,                    true,                    ctx,                )            })        })        .add_assertion(move |app, _| {            CloudModel::handle(app).read(app, |cloud_model, ctx| {                async_assert!(                    cloud_model                        .active_cloud_objects_in_location_without_descendents(                            CloudObjectLocation::Space(Space::Personal),                            ctx,                        )                        .count()                        > 0,                    "cloud objects exist"                )            })        })} pub fn assert_binding_display_string(    binding: &'static str,    display_string: Option<&'static str>,) -> TestStep {    TestStep::new("Assert a binding's display string").add_named_assertion(        format!("Binding {binding} should have display string {display_string:?}"),        move |app, _| {            app.update(|ctx| {                async_assert_eq!(                    keybinding_name_to_display_string(binding, ctx).as_deref(),                    display_string                )            })        },    )} pub fn assert_websocket_has_started() -> TestStep {    TestStep::new("Assert a websocket has started").add_named_assertion(        "subscription abort handle should exist",        move |app, _| {            Listener::handle(app).read(app, |listener, _| {                async_assert!(                    listener.has_current_subscription_abort_handle(),                    "subscription has started"                )            })        },    )} pub fn assert_websocket_has_not_started() -> TestStep {    TestStep::new("Assert a websocket has not started").add_named_assertion(        "subscription abort handle should not exist",        move |app, _| {            Listener::handle(app).read(app, |listener, _| {                async_assert!(                    !listener.has_current_subscription_abort_handle(),                    "subscription has not started"                )            })        },    )}