- Rename `_get_js_project_root` → `get_js_project_root` (no leading underscores per convention) - Remove redundant `from pathlib import Path` import inside method (already imported at top) - Remove unnecessary docstring from new method - Rewrite tests to use `tmp_path` fixture instead of `tempfile.TemporaryDirectory()` - Add `.resolve()` calls and `encoding="utf-8"` per project conventions - Simplify second test file to focus on the actual caching behavior Co-authored-by: mohammed ahmed <undefined@users.noreply.github.com>
66 lines
3 KiB
Python
66 lines
3 KiB
Python
"""Test that js_project_root is recalculated per function, not cached."""
|
|
|
|
from pathlib import Path
|
|
|
|
from codeflash.languages.javascript.test_runner import find_node_project_root
|
|
|
|
|
|
def test_find_node_project_root_returns_different_roots_for_different_files(tmp_path: Path) -> None:
|
|
"""Test that find_node_project_root returns the correct root for each file."""
|
|
# Create main project structure
|
|
main_project = (tmp_path / "project").resolve()
|
|
main_project.mkdir()
|
|
(main_project / "package.json").write_text("{}", encoding="utf-8")
|
|
(main_project / "src").mkdir()
|
|
main_file = (main_project / "src" / "main.ts").resolve()
|
|
main_file.write_text("// main file", encoding="utf-8")
|
|
|
|
# Create extension subdirectory with its own package.json
|
|
extension_dir = (main_project / "extensions" / "discord").resolve()
|
|
extension_dir.mkdir(parents=True)
|
|
(extension_dir / "package.json").write_text("{}", encoding="utf-8")
|
|
(extension_dir / "src").mkdir()
|
|
extension_file = (extension_dir / "src" / "accounts.ts").resolve()
|
|
extension_file.write_text("// extension file", encoding="utf-8")
|
|
|
|
# Extension file should return extension directory
|
|
result1 = find_node_project_root(extension_file)
|
|
assert result1 == extension_dir, f"Expected {extension_dir}, got {result1}"
|
|
|
|
# Main file should return main project directory
|
|
result2 = find_node_project_root(main_file)
|
|
assert result2 == main_project, f"Expected {main_project}, got {result2}"
|
|
|
|
# Calling again with extension file should still return extension dir
|
|
result3 = find_node_project_root(extension_file)
|
|
assert result3 == extension_dir, f"Expected {extension_dir}, got {result3}"
|
|
|
|
|
|
def test_js_project_root_recalculated_per_function(tmp_path: Path) -> None:
|
|
"""Each function in a monorepo should resolve to its own nearest package.json root."""
|
|
# Create main project
|
|
main_project = (tmp_path / "project").resolve()
|
|
main_project.mkdir()
|
|
(main_project / "package.json").write_text('{"name": "main"}', encoding="utf-8")
|
|
(main_project / "src").mkdir()
|
|
|
|
# Create extension with its own package.json
|
|
extension_dir = (main_project / "extensions" / "discord").resolve()
|
|
extension_dir.mkdir(parents=True)
|
|
(extension_dir / "package.json").write_text('{"name": "discord-extension"}', encoding="utf-8")
|
|
(extension_dir / "src").mkdir()
|
|
|
|
extension_file = (extension_dir / "src" / "accounts.ts").resolve()
|
|
extension_file.write_text("export function foo() {}", encoding="utf-8")
|
|
|
|
main_file = (main_project / "src" / "commands.ts").resolve()
|
|
main_file.write_text("export function bar() {}", encoding="utf-8")
|
|
|
|
js_project_root_1 = find_node_project_root(extension_file)
|
|
assert js_project_root_1 == extension_dir
|
|
|
|
js_project_root_2 = find_node_project_root(main_file)
|
|
assert js_project_root_2 == main_project, (
|
|
f"Expected {main_project}, got {js_project_root_2}. "
|
|
f"Happens when js_project_root is not recalculated per function."
|
|
)
|