1010from helpers import assert_contains_text
1111from nicegui import APIRouter , ui
1212from playwright .async_api import Page
13- from pytest_mock import MockerFixture
1413from simcore_service_dynamic_scheduler .api .frontend ._common .base_display_model import (
1514 BaseUpdatableDisplayModel ,
1615)
@@ -88,39 +87,37 @@ def add_to_ui(self) -> None:
8887 ui .label (f"Age: { self .display_model .age } " )
8988
9089 @ui .refreshable
91- def _ui_friend_or_pret () -> None :
90+ def _friend_or_pet_ui () -> None :
9291 if isinstance (self .display_model .companion , Friend ):
9392 FriendComponent (self .display_model .companion ).add_to_ui ()
9493
9594 elif isinstance (self .display_model .companion , Pet ):
9695 PetComponent (self .display_model .companion ).add_to_ui ()
9796
98- _ui_friend_or_pret ()
97+ _friend_or_pet_ui ()
9998
10099 # self.display_model.on_value_change("companion", comp_ui.refresh)
101- self .display_model .on_type_change ("companion" , _ui_friend_or_pret .refresh )
100+ self .display_model .on_type_change ("companion" , _friend_or_pet_ui .refresh )
102101
103102
104- @pytest .fixture
105- def use_internal_scheduler () -> bool :
106- return True
103+ def _index_page_ui (person : Person ) -> None :
104+ ui .label ("BEFORE_LABEL" )
105+ PersonComponent (person ).add_to_ui ()
106+ ui .label ("AFTER_LABEL" )
107107
108108
109109@pytest .fixture
110- def person () -> Person :
111- return Person ( name = "Alice" , age = 30 , companion = Pet ( name = "Fluffy" , species = "cat" ))
110+ def use_internal_scheduler () -> bool :
111+ return True
112112
113113
114114@pytest .fixture
115115def router (person : Person ) -> APIRouter :
116-
117116 router = APIRouter ()
118117
119118 @ui .page ("/" , api_router = router )
120119 async def index ():
121- ui .label ("BEFORE_LABEL" )
122- PersonComponent (person ).add_to_ui ()
123- ui .label ("AFTER_LABEL" )
120+ _index_page_ui (person )
124121
125122 return router
126123
@@ -143,33 +140,67 @@ def not_initialized_app(not_initialized_app: FastAPI, router: APIRouter) -> Fast
143140 return minimal_app
144141
145142
143+ async def _ensure_before_label (async_page : Page ) -> None :
144+ await assert_contains_text (async_page , "BEFORE_LABEL" )
145+
146+
147+ async def _ensure_after_label (async_page : Page ) -> None :
148+ await assert_contains_text (async_page , "AFTER_LABEL" )
149+
150+
151+ async def _ensure_person_name (async_page : Page , name : str ) -> None :
152+ await assert_contains_text (async_page , f"Name: { name } " )
153+
154+
155+ async def _ensure_person_age (async_page : Page , age : int ) -> None :
156+ await assert_contains_text (async_page , f"Age: { age } " )
157+
158+
159+ async def _esnure_person_companion (async_page : Page , companion : Pet | Friend ) -> None :
160+ if isinstance (companion , Pet ):
161+ await assert_contains_text (async_page , f"Pet Name: { companion .name } " )
162+ await assert_contains_text (async_page , f"Pet Species: { companion .species } " )
163+ elif isinstance (companion , Friend ):
164+ await assert_contains_text (async_page , f"Friend Name: { companion .name } " )
165+ await assert_contains_text (async_page , f"Friend Age: { companion .age } " )
166+
167+
168+ @pytest .mark .parametrize (
169+ "person, expected" ,
170+ [
171+ pytest .param (
172+ Person (name = "Alice" , age = 30 , companion = Pet (name = "Fluffy" , species = "cat" )),
173+ True ,
174+ id = "initial-test" ,
175+ )
176+ ],
177+ )
146178async def test_updatable_component (
147- mocker : MockerFixture ,
148179 app_runner : None ,
149180 async_page : Page ,
150181 server_host_port : str ,
151182 person : Person ,
152- # person_display: PersonDisplay ,
183+ expected : bool ,
153184):
154185 await async_page .goto (
155186 f"{ server_host_port } { get_settings ().DYNAMIC_SCHEDULER_UI_MOUNT_PATH } "
156187 )
157188
158- # ensre render worked
159- await assert_contains_text (async_page , "BEFORE_LABEL" )
160- await assert_contains_text (async_page , "AFTER_LABEL" )
189+ # INITIAL RENDER
190+ await _ensure_before_label (async_page )
191+ await _ensure_after_label (async_page )
161192
162- await assert_contains_text (async_page , "Name: Alice" )
163- await assert_contains_text (async_page , "Age: 30" )
193+ await _ensure_person_name (async_page , person .name )
194+ await _ensure_person_age (async_page , person .age )
195+ await _esnure_person_companion (async_page , person .companion )
164196
165- # _draw_spy = mocker.spy(person_display, "_draw")
166- # _recreate_ui_spy = mocker.spy(person_display, "_recrate_ui")
197+ # AFTER CHNGE RENDER
167198
168199 # # TODO: test that it changes when accessing the propeties directly
169200
170201 await assert_contains_text (async_page , "Pet Name: Fluffy" )
171202 person .companion .name = "Buddy"
172- await assert_contains_text (async_page , "Pet Name: Buddy" , timeout = 2 )
203+ await assert_contains_text (async_page , "Pet Name: Buddy" )
173204
174205 # # TODO: check that UI was rerendered with new pet name
175206
@@ -203,3 +234,6 @@ async def test_updatable_component(
203234 # # TODO: check that ui has changed as expected
204235 # assert person.requires_rerender({"companion": {"age": 28}}) is False
205236 # person_display.update_model({"companion": {"name": "Eve", "age": 28}})
237+
238+
239+ # TODO: make tests go faster since we are running differently
0 commit comments