diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index d82629ab67..30865b9d5a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -6049,8 +6049,8 @@ mod tests { } } - #[gpui::test(iterations = 100)] - async fn test_apply_code_action(cx: &mut gpui::TestAppContext) { + #[gpui::test(iterations = 10)] + async fn test_apply_code_actions_with_commands(cx: &mut gpui::TestAppContext) { let mut language = Language::new( LanguageConfig { name: "TypeScript".into(), @@ -6090,6 +6090,7 @@ mod tests { let fake_server = fake_language_servers.next().await.unwrap(); + // Language server returns code actions that contain commands, and not edits. let actions = project.update(cx, |project, cx| project.code_actions(&buffer, 0..0, cx)); fake_server .handle_request::(|_, _| async move { @@ -6116,9 +6117,15 @@ mod tests { let apply = project.update(cx, |project, cx| { project.apply_code_action(buffer.clone(), action, true, cx) }); + + // Resolving the code action does not populate its edits. In absence of + // edits, we must execute the given command. fake_server.handle_request::( |action, _| async move { Ok(action) }, ); + + // While executing the command, the language server sends the editor + // a `workspaceEdit` request. fake_server .handle_request::({ let fake = fake_server.clone(); @@ -6158,6 +6165,8 @@ mod tests { .next() .await; + // Applying the code action returns a project transaction containing the edits + // sent by the language server in its `workspaceEdit` request. let transaction = apply.await.unwrap(); assert!(transaction.0.contains_key(&buffer)); buffer.update(cx, |buffer, cx| {