97 lines
2.2 KiB
Python
97 lines
2.2 KiB
Python
from dataclasses import dataclass
|
|
|
|
import pytest
|
|
from fasthtml.components import Label, Input
|
|
from myutils.observable import collect_return_values
|
|
|
|
from myfasthtml.core.bindings import BindingsManager, Binding
|
|
|
|
|
|
@dataclass
|
|
class Data:
|
|
value: str = "Hello World"
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def reset_binding_manager():
|
|
BindingsManager.reset()
|
|
|
|
|
|
@pytest.fixture()
|
|
def data():
|
|
return Data()
|
|
|
|
|
|
def test_i_can_register_a_binding(data):
|
|
binding = Binding(data, "value")
|
|
|
|
assert binding.id is not None
|
|
assert binding.data is data
|
|
assert binding.data_attr == 'value'
|
|
|
|
|
|
def test_i_can_register_a_binding_with_default_attr(data):
|
|
binding = Binding(data)
|
|
|
|
assert binding.id is not None
|
|
assert binding.data is data
|
|
assert binding.data_attr == 'value'
|
|
|
|
|
|
def test_i_can_retrieve_a_registered_binding(data):
|
|
binding = Binding(data)
|
|
assert BindingsManager.get_binding(binding.id) is binding
|
|
|
|
|
|
def test_i_can_reset_bindings(data):
|
|
Binding(data)
|
|
assert len(BindingsManager.bindings) != 0
|
|
|
|
BindingsManager.reset()
|
|
assert len(BindingsManager.bindings) == 0
|
|
|
|
|
|
def test_i_can_bind_an_element_to_a_binding(data):
|
|
elt = Label("hello", id="label_id")
|
|
Binding(data, ft=elt)
|
|
|
|
data.value = "new value"
|
|
|
|
assert elt.children[0] == "new value"
|
|
assert elt.attrs["hx-swap-oob"] == "true"
|
|
assert elt.attrs["id"] == "label_id"
|
|
|
|
|
|
def test_i_can_bind_an_element_attr_to_a_binding(data):
|
|
elt = Input(value="somme value", id="input_id")
|
|
|
|
Binding(data, ft=elt, ft_attr="value")
|
|
|
|
data.value = "new value"
|
|
|
|
assert elt.attrs["value"] == "new value"
|
|
assert elt.attrs["hx-swap-oob"] == "true"
|
|
assert elt.attrs["id"] == "input_id"
|
|
|
|
|
|
def test_bound_element_has_an_id():
|
|
elt = Label("hello")
|
|
assert elt.attrs.get("id", None) is None
|
|
|
|
Binding(Data(), ft=elt)
|
|
assert elt.attrs.get("id", None) is not None
|
|
|
|
|
|
def test_i_can_collect_updates_values(data):
|
|
elt = Label("hello")
|
|
Binding(data, ft=elt)
|
|
|
|
data.value = "new value"
|
|
collected = collect_return_values(data)
|
|
assert collected == [elt]
|
|
|
|
# a second time to ensure no side effect
|
|
data.value = "another value"
|
|
collected = collect_return_values(data)
|
|
assert collected == [elt]
|