@@ -112,6 +112,13 @@ def pytest_addoption(parser: pytest.Parser) -> None:
112
112
default = False ,
113
113
help = "Whether service is a legacy service (no sidecar)" ,
114
114
)
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
+ )
115
122
group .addoption (
116
123
"--template-id" ,
117
124
action = "store" ,
@@ -272,6 +279,14 @@ def is_service_legacy(request: pytest.FixtureRequest) -> bool:
272
279
return TypeAdapter (bool ).validate_python (autoscaled )
273
280
274
281
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
+
275
290
@pytest .fixture (scope = "session" )
276
291
def template_id (request : pytest .FixtureRequest ) -> str | None :
277
292
if key := request .config .getoption ("--template-id" ):
@@ -438,23 +453,42 @@ def _open_with_resources(page: Page, *, click_it: bool):
438
453
return open_with_resources_button
439
454
440
455
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
+
441
472
@pytest .fixture
442
473
def create_new_project_and_delete (
443
474
page : Page ,
444
475
log_in_and_out : RestartableWebSocket ,
445
476
is_product_billable : bool ,
446
477
api_request_context : APIRequestContext ,
447
478
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
+ ]:
449
482
"""The first available service currently displayed in the dashboard will be opened
450
483
NOTE: cannot be used multiple times or going back to dashboard will fail!!
451
484
"""
452
485
created_project_uuids = []
453
486
454
487
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 ,
458
492
) -> dict [str , Any ]:
459
493
assert (
460
494
len (created_project_uuids ) == 0
@@ -527,6 +561,8 @@ def wait_for_done(response):
527
561
# not expected in the sim4life context though
528
562
...
529
563
else :
564
+ if service_version is not None :
565
+ _select_service_version (page , version = service_version )
530
566
open_button .click ()
531
567
if is_product_billable :
532
568
_open_with_resources (page , click_it = True )
@@ -618,7 +654,9 @@ def find_and_start_service_in_dashboard(
618
654
page : Page ,
619
655
) -> Callable [[ServiceType , str , str | None ], None ]:
620
656
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 ,
622
660
) -> None :
623
661
with log_context (logging .INFO , f"Finding { service_name = } in dashboard" ):
624
662
page .get_by_test_id ("servicesTabBtn" ).click ()
@@ -638,45 +676,54 @@ def _(
638
676
def create_project_from_new_button (
639
677
start_study_from_plus_button : Callable [[str ], None ],
640
678
create_new_project_and_delete : Callable [
641
- [tuple [RunningState ], bool ], dict [str , Any ]
679
+ [tuple [RunningState ], bool , str | None , str | None ], dict [str , Any ]
642
680
],
643
681
) -> Callable [[str ], dict [str , Any ]]:
644
682
def _ (plus_button_test_id : str ) -> dict [str , Any ]:
645
683
start_study_from_plus_button (plus_button_test_id )
646
684
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 )
648
686
649
687
return _
650
688
651
689
652
690
@pytest .fixture
653
691
def create_project_from_template_dashboard (
654
692
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 ]]:
657
697
def _ (template_id : str ) -> dict [str , Any ]:
658
698
find_and_click_template_in_dashboard (template_id )
659
699
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 )
661
701
662
702
return _
663
703
664
704
665
705
@pytest .fixture
666
706
def create_project_from_service_dashboard (
667
707
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 ]]:
670
712
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 ,
672
717
) -> dict [str , Any ]:
673
718
find_and_start_service_in_dashboard (
674
719
service_type , service_name , service_key_prefix
675
720
)
676
721
expected_states = (RunningState .UNKNOWN ,)
677
722
if service_type is ServiceType .COMPUTATIONAL :
678
723
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
+ )
680
727
681
728
return _
682
729
0 commit comments