codeflash/tests/test_module_name_from_file_path.py

86 lines
3.6 KiB
Python
Raw Permalink Normal View History

"""Tests for module_name_from_file_path with co-located test directories."""
import pytest
from pathlib import Path
from codeflash.code_utils.code_utils import module_name_from_file_path
class TestModuleNameFromFilePath:
"""Test module name resolution for various directory structures."""
def test_file_inside_project_root(self, tmp_path: Path) -> None:
"""Test normal case where file is inside project root."""
project_root = tmp_path / "project"
project_root.mkdir()
test_file = project_root / "test" / "test_foo.py"
test_file.parent.mkdir()
test_file.touch()
result = module_name_from_file_path(test_file, project_root)
assert result == "test.test_foo"
def test_file_outside_project_root_without_traverse_up(self, tmp_path: Path) -> None:
"""Test that file outside project root raises ValueError by default."""
project_root = tmp_path / "project" / "test"
project_root.mkdir(parents=True)
# File is in a sibling directory, not under project_root
test_file = tmp_path / "project" / "src" / "__tests__" / "test_foo.py"
test_file.parent.mkdir(parents=True)
test_file.touch()
with pytest.raises(ValueError, match="is not within the project root"):
module_name_from_file_path(test_file, project_root)
def test_file_outside_project_root_with_traverse_up(self, tmp_path: Path) -> None:
"""Test that traverse_up=True handles files outside project root."""
project_root = tmp_path / "project" / "test"
project_root.mkdir(parents=True)
# File is in a sibling directory, not under project_root
test_file = tmp_path / "project" / "src" / "__tests__" / "codeflash-generated" / "test_foo.py"
test_file.parent.mkdir(parents=True)
test_file.touch()
# With traverse_up=True, it should find a common ancestor
result = module_name_from_file_path(test_file, project_root, traverse_up=True)
# Should return a relative path from some ancestor directory
assert "test_foo" in result
assert not result.startswith(".")
def test_colocated_test_directory_structure(self, tmp_path: Path) -> None:
"""Test real-world scenario with co-located __tests__ directory.
This reproduces the bug from trace 7b97ddba-6ecd-42fd-b572-d40658746836:
- Source: /workspace/target/src/gateway/server/ws-connection/connect-policy.ts
- Tests root: /workspace/target/test
- Generated test: /workspace/target/src/gateway/server/__tests__/codeflash-generated/test_xxx.test.ts
Without traverse_up=True, this should fail.
"""
project_root = tmp_path / "target"
project_root.mkdir()
tests_root = project_root / "test"
tests_root.mkdir()
# Source file location
source_file = project_root / "src" / "gateway" / "server" / "ws-connection" / "connect-policy.ts"
source_file.parent.mkdir(parents=True)
source_file.touch()
# Generated test in co-located __tests__ directory
test_file = project_root / "src" / "gateway" / "server" / "__tests__" / "codeflash-generated" / "test_resolveControlUiAuthPolicy.test.ts"
test_file.parent.mkdir(parents=True)
test_file.touch()
# This should fail WITHOUT traverse_up
with pytest.raises(ValueError, match="is not within the project root"):
module_name_from_file_path(test_file, tests_root)
# This should succeed WITH traverse_up
result = module_name_from_file_path(test_file, tests_root, traverse_up=True)
assert "test_resolveControlUiAuthPolicy" in result