Driver factory, click_link_by_text, search_for, fill_out_form, run_lecture and CLI, layered as domain, application, infrastructure and presentation. 30 offline unit tests, a form fixture, a Docker image for headless runs and four screenshots captured in Docker. Reviews RC-009 (code) and RC-010 (milestone wording of the screenshot criterion). Task: MIL-002#1
96 lines
2.7 KiB
Python
96 lines
2.7 KiB
Python
from fill_out_form import constants
|
|
from fill_out_form.application.ports import BrowserPort
|
|
from fill_out_form.application.steps import (
|
|
click_link_by_text,
|
|
fill_out_form,
|
|
search_for,
|
|
)
|
|
from fill_out_form.domain.form_data import FormData
|
|
from tests.unit.fakes import FakeBrowser
|
|
|
|
|
|
def test_click_link_by_text_clicks_default_link() -> None:
|
|
browser = FakeBrowser()
|
|
|
|
click_link_by_text(browser)
|
|
|
|
link = (constants.BY_LINK_TEXT, constants.LINK_TEXT_CONTENT_PORTALS)
|
|
assert browser.events == [("find_element", *link), ("click", link)]
|
|
|
|
|
|
def test_click_link_by_text_uses_given_text() -> None:
|
|
browser = FakeBrowser()
|
|
|
|
click_link_by_text(browser, "Other")
|
|
|
|
assert browser.events[0] == ("find_element", constants.BY_LINK_TEXT, "Other")
|
|
|
|
|
|
def test_search_for_types_term_then_enter() -> None:
|
|
browser = FakeBrowser()
|
|
|
|
search_for(browser, "Selenium")
|
|
|
|
locator = (constants.BY_NAME, constants.SEARCH_INPUT_NAME)
|
|
assert browser.events == [
|
|
("find_element", *locator),
|
|
("send_keys", locator, ("Selenium",)),
|
|
("send_keys", locator, (constants.KEY_ENTER,)),
|
|
]
|
|
|
|
|
|
def test_search_for_uses_default_term() -> None:
|
|
browser = FakeBrowser()
|
|
|
|
search_for(browser)
|
|
|
|
assert (
|
|
"send_keys",
|
|
(constants.BY_NAME, constants.SEARCH_INPUT_NAME),
|
|
(constants.SEARCH_TERM,),
|
|
) in browser.events
|
|
|
|
|
|
def test_fill_out_form_types_fields_then_clicks_in_order() -> None:
|
|
browser = FakeBrowser()
|
|
data = FormData("Ada", "Lovelace", "ada@example.com")
|
|
|
|
fill_out_form(browser, data)
|
|
|
|
css = constants.BY_CSS_SELECTOR
|
|
actions = [e for e in browser.events if e[0] in ("send_keys", "click")]
|
|
assert actions == [
|
|
("send_keys", (css, constants.FIRST_NAME_SELECTOR), ("Ada",)),
|
|
("send_keys", (css, constants.LAST_NAME_SELECTOR), ("Lovelace",)),
|
|
("send_keys", (css, constants.EMAIL_SELECTOR), ("ada@example.com",)),
|
|
("click", (css, constants.SIGN_UP_BUTTON_SELECTOR)),
|
|
]
|
|
|
|
|
|
def test_fill_out_form_uses_default_data() -> None:
|
|
browser = FakeBrowser()
|
|
|
|
fill_out_form(browser)
|
|
|
|
typed = [e[2][0] for e in browser.events if e[0] == "send_keys"]
|
|
assert typed == [
|
|
constants.DEFAULT_FIRST_NAME,
|
|
constants.DEFAULT_LAST_NAME,
|
|
constants.DEFAULT_EMAIL,
|
|
]
|
|
|
|
|
|
def test_fill_out_form_calls_before_submit_before_click() -> None:
|
|
browser = FakeBrowser()
|
|
|
|
fill_out_form(browser, before_submit=lambda: browser.events.append(("hook",)))
|
|
|
|
names = [e[0] for e in browser.events if e[0] in ("send_keys", "hook", "click")]
|
|
assert names == ["send_keys"] * 3 + ["hook", "click"]
|
|
|
|
|
|
def test_fake_browser_satisfies_browser_port() -> None:
|
|
browser: BrowserPort = FakeBrowser()
|
|
|
|
assert browser is not None
|