from unittest.mock import MagicMock import pytest from wabot.fields import CheckField, NullField, PageObject, SelectField, TextField from wabot.pacing import NoPacing ACCESSORS = ("id", "username") @pytest.fixture def page(): page = MagicMock(name="page") page.pacing = NoPacing() return page class TestPageObject: def test_locates_element_via_page_driver(self, page): obj = PageObject(page, accessors=ACCESSORS, name="username") page.driver.find_element.assert_called_once_with(by="id", value="username") assert obj.el is page.driver.find_element.return_value def test_unknown_attributes_fall_through_to_element(self, page): obj = PageObject(page, accessors=ACCESSORS, name="username") assert obj.tag_name is obj.el.tag_name def test_click_delegates_to_page(self, page): obj = PageObject(page, accessors=ACCESSORS, name="username") assert obj.click() is page.click.return_value page.click.assert_called_once_with(obj.el) class TestTextField: def test_set_value_uses_page_helper(self, page): field = TextField(page, accessors=ACCESSORS, name="username") result = field.set_value("mathew") page.set_el_value.assert_called_once_with(field.el, "mathew") assert result is page.set_el_value.return_value def test_get_value_uses_page_helper(self, page): field = TextField(page, accessors=ACCESSORS, name="username") assert field.get_value() is page.get_el_value.return_value class TestSelectField: def test_wraps_element_in_selenium_select(self, page, monkeypatch): import wabot.fields as fields_mod fake_select_cls = MagicMock(name="Select") monkeypatch.setattr(fields_mod, "Select", fake_select_cls) field = SelectField(page, accessors=("id", "state"), name="state") fake_select_cls.assert_called_once_with(field.el) assert field.dropdown is fake_select_cls.return_value def test_set_value_by_value_and_by_text(self, page, monkeypatch): import wabot.fields as fields_mod monkeypatch.setattr(fields_mod, "Select", MagicMock()) field = SelectField(page, accessors=("id", "state"), name="state") field.set_value(value="CO") page.set_select_value.assert_called_with(field.dropdown, value="CO", text=None) field.set_value(text="Colorado") page.set_select_value.assert_called_with(field.dropdown, value=None, text="Colorado") class TestCheckField: def test_set_and_get_checked(self, page): field = CheckField(page, accessors=("id", "agree"), name="agree") field.set_checked(True) page.set_checkbox.assert_called_once_with(field.el, True) field.get_checked() page.get_checkbox_value.assert_called_once_with(field.el, False) class TestNullField: def test_is_falsy(self): assert not NullField(name="missing") def test_attribute_access_raises_with_element_name(self): with pytest.raises(AttributeError, match="missing"): NullField(name="missing").click() def test_pattern_if_el_guards_work(self): el = NullField(name="missing") if el: pytest.fail("NullField must be falsy") class TestPacingWiring: def _spy_page(self, page): page.pacing = MagicMock() page.pacing.delay.return_value = 0.0 return page def test_text_set_value_paces_text(self, page): self._spy_page(page) TextField(page, accessors=ACCESSORS, name="username").set_value("x") page.pacing.delay.assert_called_once_with("text") def test_select_set_value_paces_select(self, page, monkeypatch): import wabot.fields as fields_mod monkeypatch.setattr(fields_mod, "Select", MagicMock()) self._spy_page(page) SelectField(page, accessors=("id", "state"), name="state").set_value(value="CO") page.pacing.delay.assert_called_once_with("select") def test_select_by_index_paces_select(self, page, monkeypatch): import wabot.fields as fields_mod monkeypatch.setattr(fields_mod, "Select", MagicMock()) self._spy_page(page) SelectField(page, accessors=("id", "state"), name="state").select_by_index(2) page.pacing.delay.assert_called_once_with("select") def test_set_checked_paces_checkbox(self, page): self._spy_page(page) CheckField(page, accessors=("id", "agree"), name="agree").set_checked(True) page.pacing.delay.assert_called_once_with("checkbox") def test_click_and_go_paces_navigate(self, page): self._spy_page(page) PageObject(page, accessors=ACCESSORS, name="username").click_and_go() page.pacing.delay.assert_called_once_with("navigate") class TestTruthiness: def test_real_field_is_truthy(self, page): # locks the other end of the `if el:` guard contract (NullField is falsy) assert bool(TextField(page, accessors=ACCESSORS, name="username")) is True