Coverage for tests / test_deps.py: 100%
36 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-03 20:19 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-03 20:19 +0000
1from library_skills.deps import ( 1abcdefghi
2 get_node_top_level_deps,
3 get_node_top_level_deps_from_files,
4 get_python_top_level_deps,
5 get_python_top_level_deps_from_files,
6 get_top_level_deps,
7)
10def test_get_python_top_level_deps_normalizes_required_and_optional_deps(tmp_path): 1abcdefghi
11 pyproject = tmp_path / "pyproject.toml" 1stuvwxyzA
12 pyproject.write_text( 1stuvwxyzA
13 """
14[project]
15dependencies = [
16 "Rich-Toolkit>=0.19",
17 "FastAPI~=0.115",
18 "pydantic[email]>=2 ; python_version >= '3.10'",
19]
21[project.optional-dependencies]
22dev = [
23 "PyTest_Cov>=4",
24]
25""",
26 encoding="utf-8",
27 )
29 assert get_python_top_level_deps(tmp_path) == { 1stuvwxyzA
30 "rich-toolkit",
31 "fastapi",
32 "pydantic",
33 "pytest-cov",
34 }
37def test_get_python_top_level_deps_includes_dependency_groups(tmp_path): 1abcdefghi
38 (tmp_path / "pyproject.toml").write_text( 1TUVWXYZ01
39 """
40[dependency-groups]
41dev = [
42 { include-group = "tests" },
43 { include-group = 1 },
44 "Prek>=0.2",
45]
46tests = [
47 "PyTest_Cov>=4",
48]
49docs = "mkdocs"
50cycle = [
51 { include-group = "cycle" },
52 "Ruff>=0.15",
53]
54""",
55 encoding="utf-8",
56 )
58 assert get_python_top_level_deps(tmp_path) == { 1TUVWXYZ01
59 "prek",
60 "pytest-cov",
61 "ruff",
62 }
65def test_get_python_top_level_deps_returns_none_without_pyproject(tmp_path): 1abcdefghi
66 assert get_python_top_level_deps(tmp_path) is None 1BCDEFGHIJ
67 assert get_python_top_level_deps_from_files([]) is None 1BCDEFGHIJ
68 assert get_python_top_level_deps_from_files([tmp_path / "missing.toml"]) is None 1BCDEFGHIJ
71def test_get_python_top_level_deps_returns_none_for_invalid_toml(tmp_path): 1abcdefghi
72 (tmp_path / "pyproject.toml").write_text("[project\n", encoding="utf-8") 123456789!
74 assert get_python_top_level_deps(tmp_path) is None 123456789!
77def test_get_python_top_level_deps_returns_empty_set_for_invalid_project_table( 1abcdefghi
78 tmp_path,
79):
80 (tmp_path / "pyproject.toml").write_text('project = "demo"\n', encoding="utf-8") 1#$%'()*+,
82 assert get_python_top_level_deps(tmp_path) == set() 1#$%'()*+,
85def test_get_python_top_level_deps_ignores_non_string_dependencies(tmp_path): 1abcdefghi
86 (tmp_path / "pyproject.toml").write_text( 1-./:;=?@[
87 """
88[project]
89dependencies = [
90 "rich>=13",
91 1,
92]
93""",
94 encoding="utf-8",
95 )
97 assert get_python_top_level_deps(tmp_path) == {"rich"} 1-./:;=?@[
100def test_get_node_top_level_deps_normalizes_dependency_fields(tmp_path): 1abcdefghi
101 (tmp_path / "package.json").write_text( 2] ^ _ ` { | } ~ ab
102 """
103{
104 "dependencies": {"@Scope/Demo_Pkg": "^1.0.0"},
105 "devDependencies": {"Vitest": "^4.0.0"},
106 "optionalDependencies": {"Optional.Pkg": "^1.0.0"},
107 "peerDependencies": {"Peer_Pkg": "^1.0.0"}
108}
109""",
110 encoding="utf-8",
111 )
113 assert get_node_top_level_deps(tmp_path) == { 2] ^ _ ` { | } ~ ab
114 "@scope/demo-pkg",
115 "vitest",
116 "optional-pkg",
117 "peer-pkg",
118 }
121def test_get_node_top_level_deps_handles_missing_invalid_and_non_object(tmp_path): 1abcdefghi
122 assert get_node_top_level_deps(tmp_path) is None 1jklmnopqr
123 assert get_node_top_level_deps_from_files([]) is None 1jklmnopqr
124 assert get_node_top_level_deps_from_files([tmp_path / "missing.json"]) is None 1jklmnopqr
126 (tmp_path / "package.json").write_text("{", encoding="utf-8") 1jklmnopqr
127 assert get_node_top_level_deps(tmp_path) is None 1jklmnopqr
129 (tmp_path / "package.json").write_text("[]", encoding="utf-8") 1jklmnopqr
130 assert get_node_top_level_deps(tmp_path) == set() 1jklmnopqr
133def test_get_top_level_deps_combines_python_and_node_metadata(tmp_path): 1abcdefghi
134 (tmp_path / "pyproject.toml").write_text( 1KLMNOPQRS
135 '[project]\ndependencies = ["Python_Pkg>=1"]\n',
136 encoding="utf-8",
137 )
138 (tmp_path / "package.json").write_text( 1KLMNOPQRS
139 '{"dependencies": {"node_pkg": "^1.0.0"}}',
140 encoding="utf-8",
141 )
143 assert get_top_level_deps(tmp_path) == {"python-pkg", "node-pkg"} 1KLMNOPQRS