import pytest from .support import PyScriptTest, skip_worker class TestEventHandler(PyScriptTest): def test_when_decorator_with_event(self): """When the decorated function takes a single parameter, it should be passed the event object """ self.pyscript_run( """ """ ) self.page.locator("text=foo_button").click() self.wait_for_console("clicked foo_id") self.assert_no_banners() def test_when_decorator_without_event(self): """When the decorated function takes no parameters (not including 'self'), it should be called without the event object """ self.pyscript_run( """ """ ) self.page.locator("text=foo_button").click() self.wait_for_console("The button was clicked") self.assert_no_banners() def test_multiple_when_decorators_with_event(self): self.pyscript_run( """ """ ) self.page.locator("text=foo_button").click() self.wait_for_console("foo_click! id=foo_id") self.page.locator("text=bar_button").click() self.wait_for_console("bar_click! id=bar_id") self.assert_no_banners() def test_two_when_decorators(self): """When decorating a function twice, both should function""" self.pyscript_run( """ """ ) self.page.locator("text=bar_button").hover() self.wait_for_console("got event: mouseover") self.page.locator("text=foo_button").click() self.wait_for_console("got event: click") self.assert_no_banners() def test_two_when_decorators_same_element(self): """When decorating a function twice *on the same DOM element*, both should function""" self.pyscript_run( """ """ ) self.page.locator("text=foo_button").hover() self.wait_for_console("got event: mouseover") self.page.locator("text=foo_button").click() self.wait_for_console("got event: click") self.assert_no_banners() def test_when_decorator_multiple_elements(self): """The @when decorator's selector should successfully select multiple DOM elements """ self.pyscript_run( """ """ ) self.page.locator("text=button1").click() self.page.locator("text=button2").click() self.wait_for_console("button2 was clicked") assert "button1 was clicked" in self.console.log.lines assert "button2 was clicked" in self.console.log.lines self.assert_no_banners() def test_when_decorator_duplicate_selectors(self): """ """ self.pyscript_run( """ """ ) self.page.locator("text=foo_button").click() self.wait_for_console("click 1 on foo_id") self.wait_for_console("click 2 on foo_id") self.assert_no_banners() @skip_worker("NEXT: error banner not shown") def test_when_decorator_invalid_selector(self): """When the selector parameter of @when is invalid, it should show an error""" self.pyscript_run( """ """ ) self.page.locator("text=foo_button").click() msg = "Failed to execute 'querySelectorAll' on 'Document': '#.bad' is not a valid selector." error = self.page.wait_for_selector(".py-error") banner_text = error.inner_text() if msg not in banner_text: raise AssertionError( f"Expected message '{msg}' does not " f"match banner text '{banner_text}'" ) assert msg in self.console.error.lines[-1] self.check_py_errors(msg)