""" Comprehensive binding tests for all bindable FastHTML components. This test suite covers: - Input (text) - already tested - Checkbox - already tested - Textarea - Select (single) - Select (multiple) - Range (slider) - Radio buttons - Button - Input with Datalist (combobox) """ from dataclasses import dataclass from fasthtml.components import ( Label, Textarea ) from myfasthtml.controls.helpers import mk from myfasthtml.core.bindings import Binding @dataclass class Data: value: str = "hello world" @dataclass class NumericData: value: int = 50 @dataclass class BoolData: value: bool = True @dataclass class ListData: value: list = None def __post_init__(self): if self.value is None: self.value = [] class TestBindingTextarea: """Tests for binding Textarea components.""" def test_i_can_bind_textarea(self, user, rt): """ Textarea should bind bidirectionally with data. Value changes should update the label. """ @rt("/") def index(): data = Data("Initial text") textarea_elt = Textarea(name="textarea_name") label_elt = Label() mk.manage_binding(textarea_elt, Binding(data)) mk.manage_binding(label_elt, Binding(data)) return textarea_elt, label_elt user.open("/") user.should_see("Initial text") testable_textarea = user.find_element("textarea") testable_textarea.send("New multiline\ntext content") user.should_see("New multiline\ntext content") def test_i_can_bind_textarea_with_empty_initial_value(self, user, rt): """ Textarea with empty initial value should update correctly. """ @rt("/") def index(): data = Data("") textarea_elt = Textarea(name="textarea_name") label_elt = Label() mk.manage_binding(textarea_elt, Binding(data)) mk.manage_binding(label_elt, Binding(data)) return textarea_elt, label_elt user.open("/") user.should_see("") # Empty initially testable_textarea = user.find_element("textarea") testable_textarea.send("First content") user.should_see("First content") def test_textarea_append_works_with_binding(self, user, rt): """ Appending text to textarea should trigger binding update. """ @rt("/") def index(): data = Data("Start") textarea_elt = Textarea(name="textarea_name") label_elt = Label() mk.manage_binding(textarea_elt, Binding(data)) mk.manage_binding(label_elt, Binding(data)) return textarea_elt, label_elt user.open("/") user.should_see("Start") testable_textarea = user.find_element("textarea") testable_textarea.append(" + More") user.should_see("Start + More") def test_textarea_clear_works_with_binding(self, user, rt): """ Clearing textarea should update binding to empty string. """ @rt("/") def index(): data = Data("Content to clear") textarea_elt = Textarea(name="textarea_name") label_elt = Label() mk.manage_binding(textarea_elt, Binding(data)) mk.manage_binding(label_elt, Binding(data)) return textarea_elt, label_elt user.open("/") user.should_see("Content to clear") testable_textarea = user.find_element("textarea") testable_textarea.clear() user.should_not_see("Content to clear")