from .support import PyScriptTest class TestBasic(PyScriptTest): def test_pyscript_hello(self): self.pyscript_run( """ print('hello pyscript') """ ) assert self.console.log.lines == [ self.PY_COMPLETE, "hello pyscript", ] def test_python_exception(self): self.pyscript_run( """ print('hello pyscript') raise Exception('this is an error') """ ) assert self.console.log.lines == [self.PY_COMPLETE, "hello pyscript"] # check that we sent the traceback to the console tb_lines = self.console.error.lines[-1].splitlines() assert tb_lines[0] == "[pyexec] Python exception:" assert tb_lines[1] == "Traceback (most recent call last):" assert tb_lines[-1] == "Exception: this is an error" # # check that we show the traceback in the page. Note that here we # display the "raw" python traceback, without the "[pyexec] Python # exception:" line (which is useful in the console, but not for the # user) pre = self.page.locator("py-script > pre") tb_lines = pre.inner_text().splitlines() assert tb_lines[0] == "Traceback (most recent call last):" assert tb_lines[-1] == "Exception: this is an error" def test_execution_in_order(self): """ Check that they py-script tags are executed in the same order they are defined """ self.pyscript_run( """ import js; js.console.log('one') js.console.log('two') js.console.log('three') js.console.log('four') """ ) assert self.console.log.lines == [ self.PY_COMPLETE, "one", "two", "three", "four", ] def test_escaping_of_angle_brackets(self): """ Check that py-script tags escape angle brackets """ self.pyscript_run( """ import js; js.console.log(1<2, 1>2) js.console.log("
")
""" ) assert self.console.log.lines == [self.PY_COMPLETE, "true false", "
"] def test_paths(self): self.writefile("a.py", "x = 'hello from A'") self.writefile("b.py", "x = 'hello from B'") self.pyscript_run( """ paths = ["./a.py", "./b.py"] import js import a, b js.console.log(a.x) js.console.log(b.x) """ ) assert self.console.log.lines == [ self.PY_COMPLETE, "hello from A", "hello from B", ] def test_paths_that_do_not_exist(self): self.pyscript_run( """ paths = ["./f.py"] """ ) assert self.console.error.lines == ["Failed to load resource: net::ERR_FAILED"] assert self.console.warning.lines == [ "Caught an error in fetchPaths:\r\n TypeError: Failed to fetch" ] errorContent = """PyScript: Access to local files (using "Paths:" in <py-config>) is not available when directly opening a HTML file; you must use a webserver to serve the additional files.""" inner_html = self.page.locator(".py-error").inner_html() assert errorContent in inner_html def test_packages(self): self.pyscript_run( """ # we use asciitree because it's one of the smallest packages # which are built and distributed with pyodide packages = ["asciitree"] import js import asciitree js.console.log('hello', asciitree.__name__) """ ) assert self.console.log.lines == [ self.PY_COMPLETE, "Loading asciitree", # printed by pyodide "Loaded asciitree", # printed by pyodide "hello asciitree", # printed by us ] def test_dynamically_add_py_script_tag(self): self.pyscript_run( """ """ ) self.page.locator("button").click() self.page.locator("py-script") # wait until appears assert self.console.log.lines == [ self.PY_COMPLETE, "hello world", ] def test_py_script_src_attribute(self): self.writefile("foo.py", "print('hello from foo')") self.pyscript_run( """ """ ) assert self.console.log.lines == [ self.PY_COMPLETE, "hello from foo", ]