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}