""" 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 import pytest from fasthtml.components import ( Input, Label ) from fasthtml.fastapp import fast_app from myfasthtml.controls.helpers import mk from myfasthtml.core.bindings import Binding from myfasthtml.test.testclient import MyTestClient @dataclass class Data: value: str = "hello world" @pytest.fixture def test_app(): test_app, rt = fast_app(default_hdrs=False) return test_app @pytest.fixture def rt(test_app): return test_app.route @pytest.fixture def user(test_app): return MyTestClient(test_app) class TestBindingRadio: """Tests for binding Radio button components.""" def test_i_can_bind_radio_buttons(self, user, rt): """ Radio buttons should bind with data. Selecting a radio should update the label. """ @rt("/") def index(): data = Data("option1") radio1 = Input(type="radio", name="radio_name", value="option1", checked=True) radio2 = Input(type="radio", name="radio_name", value="option2") radio3 = Input(type="radio", name="radio_name", value="option3") label_elt = Label() mk.manage_binding(radio1, Binding(data)) mk.manage_binding(radio2, Binding(data)) mk.manage_binding(radio3, Binding(data)) mk.manage_binding(label_elt, Binding(data)) return radio1, radio2, radio3, label_elt user.open("/") user.should_see("option1") # Select second radio testable_radio2 = user.find_element("input[value='option2']") testable_radio2.select() user.should_see("option2") # Select third radio testable_radio3 = user.find_element("input[value='option3']") testable_radio3.select() user.should_see("option3") def test_radio_initial_state(self, user, rt): """ Radio buttons should initialize with correct checked state. """ @rt("/") def index(): data = Data("option2") radio1 = Input(type="radio", name="radio_name", value="option1") radio2 = Input(type="radio", name="radio_name", value="option2", checked=True) radio3 = Input(type="radio", name="radio_name", value="option3") label_elt = Label() mk.manage_binding(radio1, Binding(data)) mk.manage_binding(radio2, Binding(data)) mk.manage_binding(radio3, Binding(data)) mk.manage_binding(label_elt, Binding(data)) return radio1, radio2, radio3, label_elt user.open("/") user.should_see("option2")