"""Tests for graphify.paths — the shared test-path classifier (#1553).""" from __future__ import annotations import pytest from graphify.paths import ( _is_test_path, disambiguate_ambiguous_candidates, ) @pytest.mark.parametrize( "path", [ # test dir segments "tests/foo.py", "src/tests/foo.py", "test/foo.go", "spec/foo.rb", "specs/foo.rb", "app/__tests__/foo.js", "a/b/TESTS/foo.py", # case-insensitive segment # test filename conventions "src/test_service.py", "pkg/service_test.go", "src/service.test.ts", "src/service.spec.ts", "src/service_spec.rb", "ps/Module.Tests.ps1", "java/FooTest.java", "java/FooTests.java", "cs/FooTests.cs", # windows separators "src\\tests\\foo.py", "src\\service_test.py", ], ) def test_is_test_path_positive(path: str) -> None: assert _is_test_path(path) is True, path @pytest.mark.parametrize( "path", [ "", "latest.py", "contest.py", "src/contest.py", "src/greatest/x.py", "src/service.py", "lib/helper.go", "src/attestation.py", # "test" only as substring, not a segment "src/testimony.py", # filename starts with "test" but no underscore "src/contest/x.py", # "contest" is not "test" "src/greatest.cs", # ends with "test" but not "Tests.cs" "src/protest.java", # not "*Test.java" "config/manifest.json", ], ) def test_is_test_path_negative(path: str) -> None: assert _is_test_path(path) is False, path def test_disambiguate_drops_test_candidate_for_nontest_call_site() -> None: winner = disambiguate_ambiguous_candidates( ["src", "mock"], {"src": "src/service.py", "mock": "tests/test_service.py"}, "src/caller.py", ) assert winner == "src" def test_disambiguate_bails_on_two_nontest_candidates() -> None: winner = disambiguate_ambiguous_candidates( ["a", "b"], {"a": "alpha/a.py", "b": "beta/b.py"}, "pkg/caller.py", ) assert winner is None def test_disambiguate_test_call_site_prefers_test_local() -> None: winner = disambiguate_ambiguous_candidates( ["src", "local"], {"src": "src/service.py", "local": "tests/test_service.py"}, "tests/test_service.py", ) assert winner == "local" def test_disambiguate_path_proximity_same_dir() -> None: # Two non-test candidates; the one in the call site's directory wins. winner = disambiguate_ambiguous_candidates( ["near", "far"], {"near": "pkg/a/service.py", "far": "pkg/b/service.py"}, "pkg/a/caller.py", ) assert winner == "near"