mirror of
https://git.zavage.net/Zavage-Software/wabot.git
synced 2026-07-21 13:06:08 -06:00
132 lines
4.9 KiB
Python
132 lines
4.9 KiB
Python
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
|