diff --git a/tests/unit/test_documentation_consistency.py b/tests/unit/test_documentation_consistency.py index 7fefcaa..21dc07b 100644 --- a/tests/unit/test_documentation_consistency.py +++ b/tests/unit/test_documentation_consistency.py @@ -121,9 +121,17 @@ TRAINING_M41_RELEASE_INDEX_GUARD_TEST_INVENTORY = ( "test_training_m57_release_index_required_snippet_inventory_source_shape_diagnostics_are_locked", "test_training_m58_release_index_required_snippet_inventory_source_shape_accepts_literal_fixtures", "test_training_m59_release_index_required_snippet_inventory_source_shape_preserves_literal_order", + "test_training_m60_release_index_source_shape_fixture_guard_inventory_self_lock_is_current", "test_training_m53_release_index_doc_category_coverage_is_exact", "test_training_case_product_doc_reflects_current_m40_maturity", ) +TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS = ( + "test_training_m55_release_index_required_snippet_inventory_source_shape_is_locked", + "test_training_m56_release_index_required_snippet_inventory_source_shape_rejects_dynamic_fixtures", + "test_training_m57_release_index_required_snippet_inventory_source_shape_diagnostics_are_locked", + "test_training_m58_release_index_required_snippet_inventory_source_shape_accepts_literal_fixtures", + "test_training_m59_release_index_required_snippet_inventory_source_shape_preserves_literal_order", +) TRAINING_M41_RELEASE_INDEX_REQUIRED_SNIPPET_INVENTORY = ( ( "current_m1_m40_marker", @@ -574,6 +582,9 @@ class DocumentationConsistencyTests(unittest.TestCase): "required_snippet_inventory_source_shape_literal_order": ( "test_training_m59_release_index_required_snippet_inventory_source_shape_preserves_literal_order" ), + "required_snippet_inventory_source_shape_fixture_self_lock": ( + "test_training_m60_release_index_source_shape_fixture_guard_inventory_self_lock_is_current" + ), "per_doc_helper_exact_category_coverage": ( "test_training_m53_release_index_doc_category_coverage_is_exact" ), @@ -729,6 +740,7 @@ class DocumentationConsistencyTests(unittest.TestCase): "test_training_m57_release_index_required_snippet_inventory_source_shape_diagnostics_are_locked", "test_training_m58_release_index_required_snippet_inventory_source_shape_accepts_literal_fixtures", "test_training_m59_release_index_required_snippet_inventory_source_shape_preserves_literal_order", + "test_training_m60_release_index_source_shape_fixture_guard_inventory_self_lock_is_current", "test_training_m53_release_index_doc_category_coverage_is_exact", "test_training_case_product_doc_reflects_current_m40_maturity", ) @@ -757,6 +769,56 @@ class DocumentationConsistencyTests(unittest.TestCase): self.assertEqual(loader.errors, []) self.assertEqual(suite.countTestCases(), 1) + def test_training_m60_release_index_source_shape_fixture_guard_inventory_self_lock_is_current( + self, + ) -> None: + expected_source_shape_fixture_guards = ( + "test_training_m55_release_index_required_snippet_inventory_source_shape_is_locked", + "test_training_m56_release_index_required_snippet_inventory_source_shape_rejects_dynamic_fixtures", + "test_training_m57_release_index_required_snippet_inventory_source_shape_diagnostics_are_locked", + "test_training_m58_release_index_required_snippet_inventory_source_shape_accepts_literal_fixtures", + "test_training_m59_release_index_required_snippet_inventory_source_shape_preserves_literal_order", + ) + test_case_name = f"{type(self).__module__}.{type(self).__qualname__}" + self_lock_name = ( + "test_training_m60_release_index_source_shape_fixture_guard_inventory_self_lock_is_current" + ) + discovered_method_names = _test_method_names_from_file( + Path(__file__), + "DocumentationConsistencyTests", + ) + source_shape_start = discovered_method_names.index( + expected_source_shape_fixture_guards[0] + ) + + self.assertEqual( + TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS, + expected_source_shape_fixture_guards, + ) + self.assertEqual( + len(TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS), + len(set(TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS)), + ) + self.assertEqual( + TRAINING_M41_RELEASE_INDEX_GUARD_TEST_INVENTORY[8:13], + TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS, + ) + self.assertEqual( + discovered_method_names[ + source_shape_start : source_shape_start + + len(TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS) + ], + TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS, + ) + self.assertIn(self_lock_name, TRAINING_M41_RELEASE_INDEX_GUARD_TEST_INVENTORY) + for method_name in TRAINING_M41_RELEASE_INDEX_SOURCE_SHAPE_FIXTURE_GUARD_METHODS: + with self.subTest(method_name=method_name): + loader = unittest.TestLoader() + suite = loader.loadTestsFromName(f"{test_case_name}.{method_name}") + + self.assertEqual(loader.errors, []) + self.assertEqual(suite.countTestCases(), 1) + def test_training_m47_release_index_per_doc_helper_inventory_self_lock_is_current(self) -> None: helper_name = "_release_index_missing_required_snippets_by_doc" docs_guard_name = "test_training_readmes_expose_m1_m40_release_index_without_raw_test_modules"