Spaces:
Running on Zero
Running on Zero
Daryl Lim Claude Sonnet 4.6 commited on
Commit ·
1c01d92
1
Parent(s): 4453ebb
test: update app tests for symmetric dropdowns and swap button
Browse filesCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tests/test_app.py +32 -14
tests/test_app.py
CHANGED
|
@@ -88,31 +88,33 @@ def test_demo_has_no_sliders(demo):
|
|
| 88 |
assert len(sliders) == 0, f"Expected no sliders, found {len(sliders)}"
|
| 89 |
|
| 90 |
|
| 91 |
-
def
|
| 92 |
-
"""UI should have
|
| 93 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 94 |
-
|
| 95 |
-
|
|
|
|
| 96 |
|
| 97 |
|
| 98 |
-
def
|
| 99 |
-
"""
|
| 100 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 101 |
-
|
|
|
|
| 102 |
|
| 103 |
|
| 104 |
-
def
|
| 105 |
-
"""
|
| 106 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 107 |
-
|
| 108 |
-
assert
|
| 109 |
|
| 110 |
|
| 111 |
-
def
|
| 112 |
-
"""
|
| 113 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 114 |
interactive = [d for d in dropdowns if d.interactive is not False]
|
| 115 |
-
assert
|
| 116 |
|
| 117 |
|
| 118 |
def test_dropdown_choices_include_locale_codes(demo):
|
|
@@ -194,12 +196,28 @@ def test_demo_has_no_html_elements(demo):
|
|
| 194 |
assert len(html_blocks) == 0, f"Expected no HTML blocks, found {len(html_blocks)}"
|
| 195 |
|
| 196 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 197 |
def test_translate_handlers_wire_text_and_language(demo):
|
| 198 |
"""Translate click and submit handlers should wire input text and target language."""
|
| 199 |
translate_fns = [fn for fn in demo.fns.values() if [type(i).__name__ for i in fn.inputs] == ["Textbox", "Dropdown"]]
|
| 200 |
assert len(translate_fns) == 2, f"Expected 2 translate handlers (click + submit), found {len(translate_fns)}"
|
| 201 |
|
| 202 |
|
|
|
|
|
|
|
|
|
|
| 203 |
|
| 204 |
|
| 205 |
def test_no_title(demo):
|
|
|
|
| 88 |
assert len(sliders) == 0, f"Expected no sliders, found {len(sliders)}"
|
| 89 |
|
| 90 |
|
| 91 |
+
def test_demo_has_two_interactive_dropdowns(demo):
|
| 92 |
+
"""UI should have two interactive language dropdowns."""
|
| 93 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 94 |
+
assert len(dropdowns) == 2, f"Expected 2 dropdowns, found {len(dropdowns)}"
|
| 95 |
+
interactive = [d for d in dropdowns if d.interactive is not False]
|
| 96 |
+
assert len(interactive) == 2, f"Expected 2 interactive dropdowns, found {len(interactive)}"
|
| 97 |
|
| 98 |
|
| 99 |
+
def test_source_dropdown_default_is_english(demo):
|
| 100 |
+
"""Source dropdown should default to English (en)."""
|
| 101 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 102 |
+
english = [d for d in dropdowns if d.value == "English (en)"]
|
| 103 |
+
assert len(english) == 1, "Expected one dropdown defaulting to 'English (en)'"
|
| 104 |
|
| 105 |
|
| 106 |
+
def test_target_dropdown_default_is_french(demo):
|
| 107 |
+
"""Target dropdown should default to French (fr)."""
|
| 108 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 109 |
+
french = [d for d in dropdowns if d.value == "French (fr)"]
|
| 110 |
+
assert len(french) == 1, "Expected one dropdown defaulting to 'French (fr)'"
|
| 111 |
|
| 112 |
|
| 113 |
+
def test_both_dropdowns_filterable(demo):
|
| 114 |
+
"""Both language dropdowns should be filterable/searchable."""
|
| 115 |
dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
|
| 116 |
interactive = [d for d in dropdowns if d.interactive is not False]
|
| 117 |
+
assert all(d.filterable is True for d in interactive), "Both dropdowns should be filterable"
|
| 118 |
|
| 119 |
|
| 120 |
def test_dropdown_choices_include_locale_codes(demo):
|
|
|
|
| 196 |
assert len(html_blocks) == 0, f"Expected no HTML blocks, found {len(html_blocks)}"
|
| 197 |
|
| 198 |
|
| 199 |
+
def test_demo_has_swap_button(demo):
|
| 200 |
+
"""UI should have a swap button."""
|
| 201 |
+
buttons = [b for b in demo.blocks.values() if type(b).__name__ == "Button"]
|
| 202 |
+
swap = [b for b in buttons if "⇄" in str(b.value)]
|
| 203 |
+
assert len(swap) == 1, "Expected one swap button"
|
| 204 |
+
|
| 205 |
+
|
| 206 |
+
def test_swap_handler_wired(demo):
|
| 207 |
+
"""Swap button should have a click handler with 4 inputs and 4 outputs."""
|
| 208 |
+
swap_fns = [fn for fn in demo.fns.values() if len(fn.inputs) == 4 and len(fn.outputs) == 4]
|
| 209 |
+
assert len(swap_fns) >= 1, "Expected a handler with 4 inputs and 4 outputs (swap handler)"
|
| 210 |
+
|
| 211 |
+
|
| 212 |
def test_translate_handlers_wire_text_and_language(demo):
|
| 213 |
"""Translate click and submit handlers should wire input text and target language."""
|
| 214 |
translate_fns = [fn for fn in demo.fns.values() if [type(i).__name__ for i in fn.inputs] == ["Textbox", "Dropdown"]]
|
| 215 |
assert len(translate_fns) == 2, f"Expected 2 translate handlers (click + submit), found {len(translate_fns)}"
|
| 216 |
|
| 217 |
|
| 218 |
+
def test_all_handlers_wired(demo):
|
| 219 |
+
"""UI should have exactly 3 click/submit handlers: translate click, translate submit, swap."""
|
| 220 |
+
assert len(demo.fns) == 3, f"Expected 3 handlers, found {len(demo.fns)}"
|
| 221 |
|
| 222 |
|
| 223 |
def test_no_title(demo):
|