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 files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Files changed (1) hide show
  1. 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 test_demo_has_english_dropdown(demo):
92
- """UI should have a non-interactive English dropdown."""
93
  dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
94
- english = [d for d in dropdowns if d.interactive is False and d.value == "English"]
95
- assert len(english) == 1, "Expected exactly one non-interactive English dropdown"
 
96
 
97
 
98
- def test_demo_has_dropdown(demo):
99
- """UI should have two dropdowns (English + target language)."""
100
  dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
101
- assert len(dropdowns) == 2, f"Expected 2 dropdowns, found {len(dropdowns)}"
 
102
 
103
 
104
- def test_dropdown_default_is_french(demo):
105
- """Default dropdown value should be French (fr)."""
106
  dropdowns = [b for b in demo.blocks.values() if type(b).__name__ == "Dropdown"]
107
- interactive = [d for d in dropdowns if d.interactive is not False]
108
- assert interactive[0].value == "French (fr)"
109
 
110
 
111
- def test_dropdown_is_filterable(demo):
112
- """Dropdown should be filterable/searchable."""
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 interactive[0].filterable is True
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):