lsp_log_tests.rs

 1use super::*;
 2use gpui::{serde_json::json, TestAppContext};
 3use language::{tree_sitter_rust, FakeLspAdapter, Language, LanguageConfig};
 4use project::FakeFs;
 5use settings::SettingsStore;
 6
 7#[gpui::test]
 8async fn test_lsp_logs(cx: &mut TestAppContext) {
 9    if std::env::var("RUST_LOG").is_ok() {
10        env_logger::init();
11    }
12
13    init_test(cx);
14
15    let mut rust_language = Language::new(
16        LanguageConfig {
17            name: "Rust".into(),
18            path_suffixes: vec!["rs".to_string()],
19            ..Default::default()
20        },
21        Some(tree_sitter_rust::language()),
22    );
23    let mut fake_rust_servers = rust_language
24        .set_fake_lsp_adapter(Arc::new(FakeLspAdapter {
25            name: "the-rust-language-server",
26            ..Default::default()
27        }))
28        .await;
29
30    let fs = FakeFs::new(cx.background());
31    fs.insert_tree(
32        "/the-root",
33        json!({
34            "test.rs": "",
35            "package.json": "",
36        }),
37    )
38    .await;
39    let project = Project::test(fs.clone(), ["/the-root".as_ref()], cx).await;
40    project.update(cx, |project, _| {
41        project.languages().add(Arc::new(rust_language));
42    });
43
44    let log_store = cx.add_model(|cx| LogStore::new(cx));
45    log_store.update(cx, |store, cx| store.add_project(&project, cx));
46
47    let _rust_buffer = project
48        .update(cx, |project, cx| {
49            project.open_local_buffer("/the-root/test.rs", cx)
50        })
51        .await
52        .unwrap();
53
54    let mut language_server = fake_rust_servers.next().await.unwrap();
55    language_server
56        .receive_notification::<lsp::notification::DidOpenTextDocument>()
57        .await;
58
59    let (_, log_view) = cx.add_window(|cx| LspLogView::new(project.clone(), log_store.clone(), cx));
60
61    language_server.notify::<lsp::notification::LogMessage>(lsp::LogMessageParams {
62        message: "hello from the server".into(),
63        typ: lsp::MessageType::INFO,
64    });
65    cx.foreground().run_until_parked();
66
67    log_view.read_with(cx, |view, cx| {
68        assert_eq!(
69            view.menu_items(cx).unwrap(),
70            &[LogMenuItem {
71                server_id: language_server.server.server_id(),
72                server_name: LanguageServerName("the-rust-language-server".into()),
73                worktree: project.read(cx).worktrees(cx).next().unwrap(),
74                rpc_trace_enabled: false,
75                rpc_trace_selected: false,
76                logs_selected: true,
77            }]
78        );
79        assert_eq!(view.editor.read(cx).text(cx), "hello from the server\n");
80    });
81}
82
83fn init_test(cx: &mut gpui::TestAppContext) {
84    cx.foreground().forbid_parking();
85
86    cx.update(|cx| {
87        cx.set_global(SettingsStore::test(cx));
88        theme::init((), cx);
89        language::init(cx);
90        client::init_settings(cx);
91        Project::init_settings(cx);
92        editor::init_settings(cx);
93    });
94}