1use std::sync::Arc;
  2
  3use crate::lsp_log_view::LogMenuItem;
  4
  5use super::*;
  6use futures::StreamExt;
  7use gpui::{AppContext as _, SemanticVersion, TestAppContext, VisualTestContext};
  8use language::{FakeLspAdapter, Language, LanguageConfig, LanguageMatcher, tree_sitter_rust};
  9use lsp::LanguageServerName;
 10use project::{
 11    FakeFs, Project,
 12    lsp_store::log_store::{LanguageServerKind, LogKind, LogStore},
 13};
 14use serde_json::json;
 15use settings::SettingsStore;
 16use util::path;
 17
 18#[gpui::test]
 19async fn test_lsp_log_view(cx: &mut TestAppContext) {
 20    zlog::init_test();
 21
 22    init_test(cx);
 23
 24    let fs = FakeFs::new(cx.background_executor.clone());
 25    fs.insert_tree(
 26        path!("/the-root"),
 27        json!({
 28            "test.rs": "",
 29            "package.json": "",
 30        }),
 31    )
 32    .await;
 33
 34    let project = Project::test(fs.clone(), [path!("/the-root").as_ref()], cx).await;
 35
 36    let language_registry = project.read_with(cx, |project, _| project.languages().clone());
 37    language_registry.add(Arc::new(Language::new(
 38        LanguageConfig {
 39            name: "Rust".into(),
 40            matcher: LanguageMatcher {
 41                path_suffixes: vec!["rs".to_string()],
 42                ..Default::default()
 43            },
 44            ..Default::default()
 45        },
 46        Some(tree_sitter_rust::LANGUAGE.into()),
 47    )));
 48    let mut fake_rust_servers = language_registry.register_fake_lsp(
 49        "Rust",
 50        FakeLspAdapter {
 51            name: "the-rust-language-server",
 52            ..Default::default()
 53        },
 54    );
 55
 56    let log_store = cx.new(|cx| LogStore::new(false, cx));
 57    log_store.update(cx, |store, cx| store.add_project(&project, cx));
 58
 59    let _rust_buffer = project
 60        .update(cx, |project, cx| {
 61            project.open_local_buffer_with_lsp(path!("/the-root/test.rs"), cx)
 62        })
 63        .await
 64        .unwrap();
 65
 66    let mut language_server = fake_rust_servers.next().await.unwrap();
 67    language_server
 68        .receive_notification::<lsp::notification::DidOpenTextDocument>()
 69        .await;
 70
 71    let window =
 72        cx.add_window(|window, cx| LspLogView::new(project.clone(), log_store.clone(), window, cx));
 73    let log_view = window.root(cx).unwrap();
 74    let mut cx = VisualTestContext::from_window(*window, cx);
 75
 76    language_server.notify::<lsp::notification::LogMessage>(lsp::LogMessageParams {
 77        message: "hello from the server".into(),
 78        typ: lsp::MessageType::INFO,
 79    });
 80    cx.executor().run_until_parked();
 81
 82    log_view.update(&mut cx, |view, cx| {
 83        assert_eq!(
 84            view.menu_items(cx).unwrap(),
 85            &[LogMenuItem {
 86                server_id: language_server.server.server_id(),
 87                server_name: LanguageServerName("the-rust-language-server".into()),
 88                worktree_root_name: project
 89                    .read(cx)
 90                    .worktrees(cx)
 91                    .next()
 92                    .unwrap()
 93                    .read(cx)
 94                    .root_name_str()
 95                    .to_string(),
 96                rpc_trace_enabled: false,
 97                selected_entry: LogKind::Logs,
 98                trace_level: lsp::TraceValue::Off,
 99                server_kind: LanguageServerKind::Local {
100                    project: project.downgrade()
101                }
102            }]
103        );
104        assert_eq!(view.editor.read(cx).text(cx), "hello from the server\n");
105    });
106}
107
108fn init_test(cx: &mut gpui::TestAppContext) {
109    cx.update(|cx| {
110        let settings_store = SettingsStore::test(cx);
111        cx.set_global(settings_store);
112        workspace::init_settings(cx);
113        theme::init(theme::LoadThemes::JustBase, cx);
114        release_channel::init(SemanticVersion::default(), cx);
115        language::init(cx);
116        client::init_settings(cx);
117        Project::init_settings(cx);
118        editor::init_settings(cx);
119    });
120}