Skip to content

Commit cced5be

Browse files
committed
Add codegen regression tests for determinism and README markers
1 parent 4b8044f commit cced5be

1 file changed

Lines changed: 81 additions & 0 deletions

File tree

tests/test_codegen.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
"""Tests for codegen determinism and README marker replacement."""
2+
3+
import sys
4+
from pathlib import Path
5+
6+
import pytest
7+
8+
# codegen/ is only present in the internal repo
9+
codegen_dir = Path(__file__).parent.parent / "codegen"
10+
if not codegen_dir.is_dir():
11+
pytest.skip("codegen/ not available (public repo)", allow_module_level=True)
12+
13+
sys.path.insert(0, str(codegen_dir))
14+
15+
from schema_to_pydantic import PydanticModelGenerator # type: ignore[import-not-found]
16+
17+
18+
@pytest.fixture
19+
def generator() -> PydanticModelGenerator:
20+
schema_dir = codegen_dir / "schemas"
21+
schema_files = sorted(schema_dir.glob("*.json"))
22+
return PydanticModelGenerator([str(f) for f in schema_files])
23+
24+
25+
class TestApiReferenceDeterminism:
26+
def test_identical_output_on_consecutive_calls(
27+
self, generator: PydanticModelGenerator
28+
) -> None:
29+
first = generator.generate_api_reference()
30+
second = generator.generate_api_reference()
31+
assert first == second
32+
33+
def test_identical_method_index_on_consecutive_calls(
34+
self, generator: PydanticModelGenerator
35+
) -> None:
36+
first = generator.generate_readme_method_index()
37+
second = generator.generate_readme_method_index()
38+
assert first == second
39+
40+
41+
class TestReadmeMarkerReplacement:
42+
def test_replaces_content_between_markers(self) -> None:
43+
readme = (
44+
"# Title\n"
45+
"<!-- METHOD_INDEX_START -->\n"
46+
"old content\n"
47+
"<!-- METHOD_INDEX_END -->\n"
48+
"## Footer\n"
49+
)
50+
start_marker = "<!-- METHOD_INDEX_START -->"
51+
end_marker = "<!-- METHOD_INDEX_END -->"
52+
new_index = "new content\n"
53+
54+
before = readme[: readme.index(start_marker) + len(start_marker)]
55+
after = readme[readme.index(end_marker) :]
56+
result = f"{before}\n{new_index}\n{after}"
57+
58+
assert "old content" not in result
59+
assert "new content" in result
60+
assert start_marker in result
61+
assert end_marker in result
62+
assert "## Footer" in result
63+
64+
def test_preserves_content_outside_markers(self) -> None:
65+
readme = (
66+
"# Title\n"
67+
"intro text\n"
68+
"<!-- METHOD_INDEX_START -->\n"
69+
"old\n"
70+
"<!-- METHOD_INDEX_END -->\n"
71+
"## Footer\n"
72+
)
73+
start_marker = "<!-- METHOD_INDEX_START -->"
74+
end_marker = "<!-- METHOD_INDEX_END -->"
75+
76+
before = readme[: readme.index(start_marker) + len(start_marker)]
77+
after = readme[readme.index(end_marker) :]
78+
result = f"{before}\nnew\n{after}"
79+
80+
assert result.startswith("# Title\nintro text\n")
81+
assert result.endswith("## Footer\n")

0 commit comments

Comments
 (0)