@@ -112,6 +112,13 @@ def pytest_addoption(parser: pytest.Parser) -> None:
112112 default = False ,
113113 help = "Whether service is a legacy service (no sidecar)" ,
114114 )
115+ group .addoption (
116+ "--service-version" ,
117+ action = "store" ,
118+ type = str ,
119+ default = None ,
120+ help = "The service version option defines a service specific version" ,
121+ )
115122 group .addoption (
116123 "--template-id" ,
117124 action = "store" ,
@@ -272,6 +279,14 @@ def is_service_legacy(request: pytest.FixtureRequest) -> bool:
272279 return TypeAdapter (bool ).validate_python (autoscaled )
273280
274281
282+ @pytest .fixture (scope = "session" )
283+ def service_version (request : pytest .FixtureRequest ) -> str | None :
284+ if key := request .config .getoption ("--service-version" ):
285+ assert isinstance (key , str )
286+ return key
287+ return None
288+
289+
275290@pytest .fixture (scope = "session" )
276291def template_id (request : pytest .FixtureRequest ) -> str | None :
277292 if key := request .config .getoption ("--template-id" ):
@@ -438,23 +453,42 @@ def _open_with_resources(page: Page, *, click_it: bool):
438453 return open_with_resources_button
439454
440455
456+ def _select_service_version (page : Page , * , version : str ) -> None :
457+ try :
458+ # since https://github.com/ITISFoundation/osparc-simcore/pull/7060
459+ with log_context (logging .INFO , msg = f"selecting version { version } " ):
460+ page .get_by_test_id ("serviceSelectBox" ).click (timeout = 5 * SECOND )
461+ with page .expect_response (
462+ re .compile (r"/catalog/services/.+/resources" ), timeout = 1.5 * 5 * SECOND
463+ ):
464+ page .get_by_test_id (f"serviceVersionItem_{ version } " ).click (
465+ timeout = 5 * SECOND
466+ )
467+ except TimeoutError :
468+ # we try the non robust way
469+ page .get_by_label ("Version" ).select_option (version )
470+
471+
441472@pytest .fixture
442473def create_new_project_and_delete (
443474 page : Page ,
444475 log_in_and_out : RestartableWebSocket ,
445476 is_product_billable : bool ,
446477 api_request_context : APIRequestContext ,
447478 product_url : AnyUrl ,
448- ) -> Iterator [Callable [[tuple [RunningState ], bool ], dict [str , Any ]]]:
479+ ) -> Iterator [
480+ Callable [[tuple [RunningState ], bool , str | None , str | None ], dict [str , Any ]]
481+ ]:
449482 """The first available service currently displayed in the dashboard will be opened
450483 NOTE: cannot be used multiple times or going back to dashboard will fail!!
451484 """
452485 created_project_uuids = []
453486
454487 def _ (
455- expected_states : tuple [RunningState ] = (RunningState .NOT_STARTED ,),
456- press_open : bool = True ,
457- template_id : str | None = None ,
488+ expected_states : tuple [RunningState ],
489+ press_open : bool ,
490+ template_id : str | None ,
491+ service_version : str | None ,
458492 ) -> dict [str , Any ]:
459493 assert (
460494 len (created_project_uuids ) == 0
@@ -527,6 +561,8 @@ def wait_for_done(response):
527561 # not expected in the sim4life context though
528562 ...
529563 else :
564+ if service_version is not None :
565+ _select_service_version (page , version = service_version )
530566 open_button .click ()
531567 if is_product_billable :
532568 _open_with_resources (page , click_it = True )
@@ -618,7 +654,9 @@ def find_and_start_service_in_dashboard(
618654 page : Page ,
619655) -> Callable [[ServiceType , str , str | None ], None ]:
620656 def _ (
621- service_type : ServiceType , service_name : str , service_key_prefix : str | None
657+ service_type : ServiceType ,
658+ service_name : str ,
659+ service_key_prefix : str | None ,
622660 ) -> None :
623661 with log_context (logging .INFO , f"Finding { service_name = } in dashboard" ):
624662 page .get_by_test_id ("servicesTabBtn" ).click ()
@@ -638,45 +676,54 @@ def _(
638676def create_project_from_new_button (
639677 start_study_from_plus_button : Callable [[str ], None ],
640678 create_new_project_and_delete : Callable [
641- [tuple [RunningState ], bool ], dict [str , Any ]
679+ [tuple [RunningState ], bool , str | None , str | None ], dict [str , Any ]
642680 ],
643681) -> Callable [[str ], dict [str , Any ]]:
644682 def _ (plus_button_test_id : str ) -> dict [str , Any ]:
645683 start_study_from_plus_button (plus_button_test_id )
646684 expected_states = (RunningState .UNKNOWN ,)
647- return create_new_project_and_delete (expected_states , False )
685+ return create_new_project_and_delete (expected_states , False , None , None )
648686
649687 return _
650688
651689
652690@pytest .fixture
653691def create_project_from_template_dashboard (
654692 find_and_click_template_in_dashboard : Callable [[str ], None ],
655- create_new_project_and_delete : Callable [[tuple [RunningState ]], dict [str , Any ]],
656- ) -> Callable [[ServiceType , str , str | None ], dict [str , Any ]]:
693+ create_new_project_and_delete : Callable [
694+ [tuple [RunningState ], bool , str | None , str | None ], dict [str , Any ]
695+ ],
696+ ) -> Callable [[str ], dict [str , Any ]]:
657697 def _ (template_id : str ) -> dict [str , Any ]:
658698 find_and_click_template_in_dashboard (template_id )
659699 expected_states = (RunningState .UNKNOWN ,)
660- return create_new_project_and_delete (expected_states , True , template_id )
700+ return create_new_project_and_delete (expected_states , True , template_id , None )
661701
662702 return _
663703
664704
665705@pytest .fixture
666706def create_project_from_service_dashboard (
667707 find_and_start_service_in_dashboard : Callable [[ServiceType , str , str | None ], None ],
668- create_new_project_and_delete : Callable [[tuple [RunningState ]], dict [str , Any ]],
669- ) -> Callable [[ServiceType , str , str | None ], dict [str , Any ]]:
708+ create_new_project_and_delete : Callable [
709+ [tuple [RunningState ], bool , str | None , str | None ], dict [str , Any ]
710+ ],
711+ ) -> Callable [[ServiceType , str , str | None , str | None ], dict [str , Any ]]:
670712 def _ (
671- service_type : ServiceType , service_name : str , service_key_prefix : str | None
713+ service_type : ServiceType ,
714+ service_name : str ,
715+ service_key_prefix : str | None ,
716+ service_version : str | None ,
672717 ) -> dict [str , Any ]:
673718 find_and_start_service_in_dashboard (
674719 service_type , service_name , service_key_prefix
675720 )
676721 expected_states = (RunningState .UNKNOWN ,)
677722 if service_type is ServiceType .COMPUTATIONAL :
678723 expected_states = (RunningState .NOT_STARTED ,)
679- return create_new_project_and_delete (expected_states , True )
724+ return create_new_project_and_delete (
725+ expected_states , True , None , service_version
726+ )
680727
681728 return _
682729
0 commit comments