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

1import inspect 

2import pytest 

3 

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 

15 

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] 

29 

30 

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 

39 

40 

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) 

46 

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 ) 

51 

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 )