|
8 | 8 | from render_machine.actions.base_action import BaseAction |
9 | 9 | from render_machine.implementation_code_helpers import ImplementationCodeHelpers |
10 | 10 | from render_machine.render_context import RenderContext |
11 | | -from render_machine.render_types import AcceptanceTestPhase, TestExecutionPhase |
| 11 | +from render_machine.render_types import AcceptanceTestPhase, RenderError, TestExecutionPhase |
12 | 12 |
|
13 | 13 |
|
14 | 14 | class RenderConformanceTests(BaseAction): |
15 | 15 | SUCCESSFUL_OUTCOME = "conformance_test_rendered" |
| 16 | + RESPONSE_VALIDATION_FAILED_OUTCOME = "conformance_test_response_validation_failed" |
16 | 17 |
|
17 | 18 | def execute(self, render_context: RenderContext, _previous_action_payload: Any | None): |
18 | 19 | if self._should_render_conformance_tests(render_context): |
@@ -123,33 +124,64 @@ def _render_conformance_tests(self, render_context: RenderContext): |
123 | 124 | if not file_name.startswith(current_subfolder_prefix) |
124 | 125 | } |
125 | 126 |
|
126 | | - response_files, implementation_plan_summary = render_context.codeplain_api.render_conformance_tests( |
127 | | - render_context.frid_context.frid, |
128 | | - render_context.conformance_tests_running_context.current_testing_frid, |
129 | | - render_context.plain_source_tree, |
130 | | - render_context.frid_context.linked_resources, |
131 | | - existing_files_content, |
132 | | - memory_files_content, |
133 | | - render_context.module_name, |
134 | | - render_context.get_required_modules_functionalities(), |
135 | | - conformance_tests_folder_name, |
136 | | - render_context.conformance_tests_running_context.get_conformance_tests_json( |
137 | | - render_context.conformance_tests_running_context.current_testing_module_name |
138 | | - ), |
139 | | - all_acceptance_tests, |
140 | | - existing_conformance_tests_files, |
141 | | - run_state=render_context.run_state, |
| 127 | + current_subfolder_name = os.path.basename(conformance_tests_folder_name) |
| 128 | + module_conformance_tests_folder = render_context.conformance_tests.get_module_conformance_tests_folder( |
| 129 | + render_context.module_name |
142 | 130 | ) |
143 | 131 |
|
| 132 | + for attempt in range(2): |
| 133 | + response_files, implementation_plan_summary = render_context.codeplain_api.render_conformance_tests( |
| 134 | + render_context.frid_context.frid, |
| 135 | + render_context.conformance_tests_running_context.current_testing_frid, |
| 136 | + render_context.plain_source_tree, |
| 137 | + render_context.frid_context.linked_resources, |
| 138 | + existing_files_content, |
| 139 | + memory_files_content, |
| 140 | + render_context.module_name, |
| 141 | + render_context.get_required_modules_functionalities(), |
| 142 | + conformance_tests_folder_name, |
| 143 | + render_context.conformance_tests_running_context.get_conformance_tests_json( |
| 144 | + render_context.conformance_tests_running_context.current_testing_module_name |
| 145 | + ), |
| 146 | + all_acceptance_tests, |
| 147 | + existing_conformance_tests_files, |
| 148 | + run_state=render_context.run_state, |
| 149 | + ) |
| 150 | + |
| 151 | + violations = render_context.conformance_tests.find_response_file_violations( |
| 152 | + render_context.module_name, |
| 153 | + current_subfolder_name, |
| 154 | + response_files, |
| 155 | + ) |
| 156 | + |
| 157 | + if not violations: |
| 158 | + break |
| 159 | + |
| 160 | + console.warning( |
| 161 | + "Generated conformance test files violate the suite layout rules:\n " |
| 162 | + + "\n ".join(violations) |
| 163 | + + ("\nRetrying the generation." if attempt == 0 else "") |
| 164 | + ) |
| 165 | + else: |
| 166 | + return ( |
| 167 | + self.RESPONSE_VALIDATION_FAILED_OUTCOME, |
| 168 | + RenderError.encode( |
| 169 | + message="Generated conformance test files repeatedly violated the suite layout rules " |
| 170 | + "(files outside the functionality's subfolder or invalid changes to shared setup files).", |
| 171 | + error_type="CONFORMANCE_TESTS_VALIDATION_ERROR", |
| 172 | + violations="\n".join(violations), |
| 173 | + ).to_payload(), |
| 174 | + ) |
| 175 | + |
144 | 176 | render_context.conformance_tests_running_context.current_testing_frid_high_level_implementation_plan = ( |
145 | 177 | implementation_plan_summary |
146 | 178 | ) |
147 | 179 |
|
148 | | - file_utils.store_response_files(conformance_tests_folder_name, response_files, []) |
| 180 | + file_utils.store_response_files(module_conformance_tests_folder, response_files, []) |
149 | 181 |
|
150 | 182 | console.print_files( |
151 | 183 | "Conformance test files generated:", |
152 | | - conformance_tests_folder_name, |
| 184 | + module_conformance_tests_folder, |
153 | 185 | response_files, |
154 | 186 | style=console.OUTPUT_STYLE, |
155 | 187 | ) |
|
0 commit comments