瀏覽代碼

improve radio tests, make them less timing sensitive

Falko Schindler 7 月之前
父節點
當前提交
1f0bc6dd72
共有 2 個文件被更改,包括 50 次插入83 次删除
  1. 50 7
      tests/test_radio.py
  2. 0 76
      tests/test_radio_element.py

+ 50 - 7
tests/test_radio.py

@@ -2,14 +2,57 @@ from nicegui import ui
 from nicegui.testing import Screen
 
 
-def test_changing_options(screen: Screen):
-    r = ui.radio([10, 20, 30], value=10)
-    ui.label().bind_text_from(r, 'value', lambda v: f'value = {v}')
-    ui.button('reverse', on_click=lambda: (r.options.reverse(), r.update()))
-    ui.button('clear', on_click=lambda: (r.options.clear(), r.update()))
+def test_radio_click(screen: Screen):
+    radio = ui.radio(['A', 'B', 'C'])
+    ui.label().bind_text_from(radio, 'value', lambda x: f'Value: {x}')
 
     screen.open('/')
+    screen.click('A')
+    screen.should_contain('Value: A')
+    screen.click('B')
+    screen.should_contain('Value: B')
+
+    screen.click('B')  # already selected, should not change
+    screen.wait(0.5)
+    screen.should_contain('Value: B')
+
+
+def test_radio_set_value(screen: Screen):
+    radio = ui.radio(['A', 'B', 'C'])
+    ui.label().bind_text_from(radio, 'value', lambda x: f'Value: {x}')
+
+    screen.open('/')
+    radio.set_value('B')
+    screen.should_contain('Value: B')
+
+
+def test_radio_set_options(screen: Screen):
+    radio = ui.radio(['A', 'B', 'C'], value='C', on_change=lambda e: ui.notify(f'Event: {e.value}'))
+    ui.label().bind_text_from(radio, 'value', lambda x: f'Value: {x}')
+
+    ui.button('reverse', on_click=lambda: (radio.options.reverse(), radio.update()))  # type: ignore
+    ui.button('clear', on_click=lambda: (radio.options.clear(), radio.update()))  # type: ignore
+
+    screen.open('/')
+    radio.set_options(['C', 'D', 'E'])
+    screen.should_contain('D')
+    screen.should_contain('E')
+    screen.should_contain('Value: C')
+
+    radio.set_options(['X', 'Y', 'Z'])
+    screen.should_contain('X')
+    screen.should_contain('Y')
+    screen.should_contain('Z')
+    screen.should_contain('Value: None')
+    screen.should_contain('Event: None')
+
+    radio.set_options(['1', '2', '3'], value='3')
+    screen.should_contain('Value: 3')
+    screen.should_contain('Event: 3')
+
     screen.click('reverse')
-    screen.should_contain('value = 10')
+    screen.should_contain('Value: 3')
+    screen.should_contain('Event: 3')
+
     screen.click('clear')
-    screen.should_contain('value = None')
+    screen.should_contain('Value: None')

+ 0 - 76
tests/test_radio_element.py

@@ -1,76 +0,0 @@
-from nicegui import events, ui
-from nicegui.testing import Screen
-
-
-def test_radio_click(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'])
-
-    screen.open('/')
-    screen.click('A')
-    assert r.value == 'A'
-    screen.click('B')
-    assert r.value == 'B'
-
-
-def test_radio_click_already_selected(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'], value='B')
-
-    screen.open('/')
-    screen.click('B')
-    assert r.value == 'B'
-
-
-def test_radio_set_value(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'])
-
-    screen.open('/')
-    r.set_value('B')
-    assert r.value == 'B'
-
-
-def test_radio_set_options(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'])
-
-    screen.open('/')
-    r.set_options(['D', 'E', 'F'])
-    assert r.options == ['D', 'E', 'F']
-
-
-def test_radio_set_options_value_still_valid(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'], value='C')
-
-    screen.open('/')
-    r.set_options(['C', 'D', 'E'])
-    assert r.value == 'C'
-
-
-def test_radio_set_options_value_none(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'], value='C')
-
-    screen.open('/')
-    r.set_options(['D', 'E', 'F'])
-    assert r.value is None
-
-
-def test_radio_set_options_value(screen: Screen):
-    r = ui.radio(['A', 'B', 'C'])
-
-    screen.open('/')
-    r.set_options(['D', 'E', 'F'], value='E')
-    assert r.value == 'E'
-
-
-def test_radio_set_options_value_callback(screen: Screen):
-    """Fix for https://github.com/zauberzeug/nicegui/issues/3733.
-
-    When using `set_options` with the value argument set and the `on_change` callback active on the element,
-    `on_change` should never pass `None` through, even if the old value is not within the new list of element options.
-    """
-
-    def check_change_is_not_none(e: events.ValueChangeEventArguments):
-        assert e.value is not None
-
-    r = ui.radio(['A', 'B', 'C'], on_change=check_change_is_not_none)
-
-    screen.open('/')
-    r.set_options(['D', 'E', 'F'], value='F')