Coverage for tests/core/test_page_contract.py: 100%
28 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-03 15:51 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-03 15:51 +0000
1import inspect
2import pytest
4from main.page import Page
5from main.ui.dl_execution_page import DlExecutionPage
6from main.ui.dl_selection_page import DlNiftiSelectionPage
7from main.ui.import_page import ImportPage
8from main.ui.nifti_mask_selection_page import MaskNiftiSelectionPage
9from main.ui.patient_selection_page import PatientSelectionPage
10from main.ui.pipeline_execution_page import PipelineExecutionPage
11from main.ui.pipeline_patient_selection_page import PipelinePatientSelectionPage
12from main.ui.pipeline_review_page import PipelineReviewPage
13from main.ui.skull_stripping_page import SkullStrippingPage
14from main.ui.tool_selection_page import ToolSelectionPage
16# You can add other child classes here if there are more
17ALL_PAGE_SUBCLASSES = [
18 ImportPage,
19 PatientSelectionPage,
20 ToolSelectionPage,
21 SkullStrippingPage,
22 MaskNiftiSelectionPage,
23 PipelinePatientSelectionPage,
24 PipelineReviewPage,
25 PipelineExecutionPage,
26 DlNiftiSelectionPage,
27 DlExecutionPage,
28]
31def get_method_signatures(cls):
32 """Return a dict {method_name: signature} for all public methods."""
33 methods = {}
34 for name, member in inspect.getmembers(cls, predicate=inspect.isfunction):
35 # exclude private methods like _setup_ui
36 if not name.startswith("_"):
37 methods[name] = inspect.signature(member)
38 return methods
41@pytest.mark.parametrize("subclass", ALL_PAGE_SUBCLASSES)
42def test_page_subclass_contract(subclass):
43 """Verify that each subclass of Page respects the contract of public methods."""
44 base_methods = get_method_signatures(Page)
45 subclass_methods = get_method_signatures(subclass)
47 for method_name, base_sig in base_methods.items():
48 assert method_name in subclass_methods, (
49 f"The class {subclass.__name__} does not implement the required method '{method_name}'"
50 )
52 subclass_sig = subclass_methods[method_name]
53 assert subclass_sig == base_sig, (
54 f"The signature of the method '{method_name}' in {subclass.__name__} "
55 f"does not match the one in Page.\n"
56 f"Expected: {base_sig}\nFound: {subclass_sig}"
57 )