Skip to content

Commit f955b56

Browse files
committed
Let a regression fixer fix the module's other earlier tests in the same fix
In a shrinq render one functionality's new component broke the earlier functionalities' conformance tests (their Spring context scans the whole package), and each earlier test folder was fixed in its own fixer session with its own test runs, for the same cause. When the failing tests belong to an earlier functionality, the fixer may now write the current module's whole conformance tests folder, and the folder is sent to the server as writable_module_tests_folder.
1 parent 538ba40 commit f955b56

4 files changed

Lines changed: 43 additions & 1 deletion

File tree

‎render_machine/actions/fix_conformance_test.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,17 @@ def _agents_for_current_tests(render_context: RenderContext) -> ConformanceFixAg
180180
conformance_tests_folder=FixConformanceTest._writable_conformance_tests_folder(render_context),
181181
readable_tests_folders=FixConformanceTest._readable_conformance_tests_folders(render_context),
182182
plain_modules_folder=agent_tools.rendered_modules_folder(render_context),
183+
writable_module_tests_folder=(
184+
os.path.normpath(
185+
os.path.abspath(
186+
render_context.conformance_tests.get_module_conformance_tests_folder(
187+
render_context.module_name
188+
)
189+
)
190+
)
191+
if FixConformanceTest._is_regression(render_context)
192+
else ""
193+
),
183194
)
184195
return ctx.conformance_fix_agents
185196

@@ -248,6 +259,7 @@ def _common_params(render_context: RenderContext, agents: ConformanceFixAgents)
248259
"build_folder": os.path.normpath(os.path.abspath(render_context.build_folder)),
249260
"conformance_tests_folder": agents.conformance_tests_folder,
250261
**agent_tools.modules_layout_params(render_context),
262+
"writable_module_tests_folder": agents.writable_module_tests_folder,
251263
"readable_conformance_tests_folders": agents.readable_tests_folders,
252264
"conformance_tests_script_content": FixUnitTests._read_script(render_context.conformance_tests_script),
253265
"prepare_environment_script_content": FixUnitTests._read_script(render_context.prepare_environment_script),

‎render_machine/conformance_fix_conversation.py‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ def __init__(self, render_context, agents: ConformanceFixAgents, fixer_params: d
8686
self.build_folder = os.path.normpath(os.path.abspath(render_context.build_folder))
8787
self.fixer_workspace = agent_tools.AgentWorkspace(
8888
build_folder=self.build_folder,
89-
writable_folders=[self.build_folder, agents.conformance_tests_folder],
89+
writable_folders=[
90+
self.build_folder,
91+
agents.conformance_tests_folder,
92+
*([agents.writable_module_tests_folder] if agents.writable_module_tests_folder else []),
93+
],
9094
readable_folders=[agents.plain_modules_folder, *agents.readable_tests_folders],
9195
readable_log_paths=agents.readable_log_paths,
9296
tool_result_cache=agents.fixer_tool_result_cache,

‎render_machine/render_types.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ class ConformanceFixAgents:
113113
readable_tests_folders: list[str] = field(default_factory=list)
114114
# The rendered modules folder (plain_modules): both agents may read every module's code and tests.
115115
plain_modules_folder: str = ""
116+
# For a regression (earlier tests broken by the current functionality): the current module's conformance tests
117+
# folder, which the fixer may write so it fixes the other earlier tests that share the cause in the same fix.
118+
writable_module_tests_folder: str = ""
116119
fixer: AgentSessionState = field(default_factory=AgentSessionState)
117120
reviewer: AgentSessionState = field(default_factory=AgentSessionState)
118121
# Content of every file the current fix changed, from before the fix (None: the file did not exist), so the fix

‎tests/test_conformance_fix_conversation.py‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,29 @@ def test_agents_read_every_rendered_module_and_are_told_the_layout(project):
467467
assert start_params["required_module_names"] == ["base"]
468468

469469

470+
@pytest.mark.parametrize("regression", [True, False])
471+
def test_a_regression_fixer_may_fix_the_other_earlier_tests_of_the_module(project, regression):
472+
sibling = project.root / "conformance" / "login" / "test_login.py"
473+
sibling.parent.mkdir()
474+
sibling.write_text("OLD SETUP\n")
475+
api = ScriptedAgentAPI(
476+
fixer_turns=[[write(str(sibling), "NEW SETUP\n"), write("app.py", "v1\n")], [submit_fix()]],
477+
reviewer_turns=[[review("approve")]],
478+
)
479+
render_context = make_render_context(project, api, testing_frid="1", frid="2" if regression else "1")
480+
481+
run_fix(render_context)
482+
483+
result = api.of("continue", conversation.FIXER_TASK)[0][3][0]["output"]
484+
[(_, _, _, start_params)] = api.of("start", conversation.FIXER_TASK)
485+
if regression:
486+
assert sibling.read_text() == "NEW SETUP\n"
487+
assert start_params["writable_module_tests_folder"] == str(project.root / "conformance")
488+
else:
489+
assert result.startswith("Error: write access denied") and sibling.read_text() == "OLD SETUP\n"
490+
assert start_params["writable_module_tests_folder"] == ""
491+
492+
470493
def test_reviewer_last_verdict_counts_and_the_next_review_starts_a_new_session(project):
471494
api = ScriptedAgentAPI(
472495
fixer_turns=[[write("app.py", "v1\n")], [submit_fix()], [write("app.py", "v2\n")], [submit_fix()]],

0 commit comments

Comments
 (0)