mod common;
use common::{TestServer, canonicalize_workspace_edit};
use expect_test::expect;
#[tokio::test]
async fn will_create_files_psr4_mapped_generates_namespace_stub() {
let mut server = TestServer::with_fixture("psr4-mini").await;
server.wait_for_index_ready().await;
let uri = server.uri("src/Model/Product.php");
let resp = server.will_create_files(vec![uri]).await;
assert!(resp["error"].is_null(), "willCreateFiles error: {resp:?}");
let root = server.uri("");
let snap = canonicalize_workspace_edit(&resp["result"], &root);
expect![[r#"
// src/Model/Product.php
0:0-0:0 → "<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Model;\n\nclass Product\n{\n}\n""#]]
.assert_eq(&snap);
}
#[tokio::test]
async fn will_create_files_outside_psr4_root_generates_minimal_stub() {
let mut server = TestServer::with_fixture("psr4-mini").await;
server.wait_for_index_ready().await;
let uri = server.uri("scripts/bootstrap.php");
let resp = server.will_create_files(vec![uri]).await;
assert!(resp["error"].is_null(), "willCreateFiles error: {resp:?}");
let changes = resp["result"]["changes"]
.as_object()
.expect("expected a changes map");
assert_eq!(changes.len(), 1, "expected exactly one file in changes");
let edits = changes.values().next().unwrap().as_array().unwrap();
assert_eq!(edits.len(), 1);
let new_text = edits[0]["newText"].as_str().unwrap();
assert_eq!(
new_text, "<?php\n\n",
"expected minimal stub for non-PSR-4 path"
);
}
#[tokio::test]
async fn will_create_files_root_namespace_generates_stub_without_namespace() {
let mut server = TestServer::with_fixture("psr4-root").await;
server.wait_for_index_ready().await;
let uri = server.uri("src/Bootstrap.php");
let resp = server.will_create_files(vec![uri]).await;
assert!(resp["error"].is_null(), "willCreateFiles error: {resp:?}");
let root = server.uri("");
let snap = canonicalize_workspace_edit(&resp["result"], &root);
expect![[r#"
// src/Bootstrap.php
0:0-0:0 → "<?php\n\ndeclare(strict_types=1);\n\nclass Bootstrap\n{\n}\n""#]]
.assert_eq(&snap);
}
#[tokio::test]
async fn will_create_files_multiple_files_get_independent_stubs() {
let mut server = TestServer::with_fixture("psr4-mini").await;
server.wait_for_index_ready().await;
let uri_a = server.uri("src/Alpha.php");
let uri_b = server.uri("src/Beta.php");
let resp = server.will_create_files(vec![uri_a, uri_b]).await;
assert!(resp["error"].is_null(), "willCreateFiles error: {resp:?}");
let root = server.uri("");
let snap = canonicalize_workspace_edit(&resp["result"], &root);
expect![[r#"
// src/Alpha.php
0:0-0:0 → "<?php\n\ndeclare(strict_types=1);\n\nnamespace App;\n\nclass Alpha\n{\n}\n"
// src/Beta.php
0:0-0:0 → "<?php\n\ndeclare(strict_types=1);\n\nnamespace App;\n\nclass Beta\n{\n}\n""#]]
.assert_eq(&snap);
}