dev_server_tests.rs

  1use std::path::Path;
  2
  3use editor::Editor;
  4use fs::Fs;
  5use gpui::VisualTestContext;
  6use rpc::proto::DevServerStatus;
  7use serde_json::json;
  8
  9use crate::tests::TestServer;
 10
 11#[gpui::test]
 12async fn test_dev_server(cx: &mut gpui::TestAppContext, cx2: &mut gpui::TestAppContext) {
 13    let (server, client) = TestServer::start1(cx).await;
 14
 15    let channel_id = server
 16        .make_channel("test", None, (&client, cx), &mut [])
 17        .await;
 18
 19    let resp = client
 20        .channel_store()
 21        .update(cx, |store, cx| {
 22            store.create_dev_server(channel_id, "server-1".to_string(), cx)
 23        })
 24        .await
 25        .unwrap();
 26
 27    client.channel_store().update(cx, |store, _| {
 28        assert_eq!(store.dev_servers_for_id(channel_id).len(), 1);
 29        assert_eq!(store.dev_servers_for_id(channel_id)[0].name, "server-1");
 30        assert_eq!(
 31            store.dev_servers_for_id(channel_id)[0].status,
 32            DevServerStatus::Offline
 33        );
 34    });
 35
 36    let dev_server = server.create_dev_server(resp.access_token, cx2).await;
 37    cx.executor().run_until_parked();
 38    client.channel_store().update(cx, |store, _| {
 39        assert_eq!(
 40            store.dev_servers_for_id(channel_id)[0].status,
 41            DevServerStatus::Online
 42        );
 43    });
 44
 45    dev_server
 46        .fs()
 47        .insert_tree(
 48            "/remote",
 49            json!({
 50                "1.txt": "remote\nremote\nremote",
 51                "2.js": "function two() { return 2; }",
 52                "3.rs": "mod test",
 53            }),
 54        )
 55        .await;
 56
 57    client
 58        .channel_store()
 59        .update(cx, |store, cx| {
 60            store.create_remote_project(
 61                channel_id,
 62                client::DevServerId(resp.dev_server_id),
 63                "project-1".to_string(),
 64                "/remote".to_string(),
 65                cx,
 66            )
 67        })
 68        .await
 69        .unwrap();
 70
 71    cx.executor().run_until_parked();
 72
 73    let remote_workspace = client
 74        .channel_store()
 75        .update(cx, |store, cx| {
 76            let projects = store.remote_projects_for_id(channel_id);
 77            assert_eq!(projects.len(), 1);
 78            assert_eq!(projects[0].name, "project-1");
 79            workspace::join_remote_project(
 80                projects[0].project_id.unwrap(),
 81                client.app_state.clone(),
 82                cx,
 83            )
 84        })
 85        .await
 86        .unwrap();
 87
 88    cx.executor().run_until_parked();
 89
 90    let cx2 = VisualTestContext::from_window(remote_workspace.into(), cx).as_mut();
 91    cx2.simulate_keystrokes("cmd-p 1 enter");
 92
 93    let editor = remote_workspace
 94        .update(cx2, |ws, cx| {
 95            ws.active_item_as::<Editor>(cx).unwrap().clone()
 96        })
 97        .unwrap();
 98    editor.update(cx2, |ed, cx| {
 99        assert_eq!(ed.text(cx).to_string(), "remote\nremote\nremote");
100    });
101    cx2.simulate_input("wow!");
102    cx2.simulate_keystrokes("cmd-s");
103
104    let content = dev_server
105        .fs()
106        .load(&Path::new("/remote/1.txt"))
107        .await
108        .unwrap();
109    assert_eq!(content, "wow!remote\nremote\nremote\n");
110}