diff --git a/pyscript.core/tests/integration/support.py b/pyscript.core/tests/integration/support.py index c43a03eab47..c27efeae533 100644 --- a/pyscript.core/tests/integration/support.py +++ b/pyscript.core/tests/integration/support.py @@ -126,7 +126,7 @@ def filter_page_content(lines, exclude=None): @pytest.mark.usefixtures("init") -@with_execution_thread("main", "worker") +@with_execution_thread("main") # , "worker") # XXX re-enable workers eventually class PyScriptTest: """ Base class to write PyScript integration tests, based on playwright. @@ -179,6 +179,7 @@ def init(self, request, tmpdir, logger, page, execution_thread): # create a symlink to BUILD inside tmpdir tmpdir.join("build").mksymlinkto(BUILD) self.tmpdir.chdir() + self.tmpdir.join('favicon.ico').write("") self.logger = logger self.execution_thread = execution_thread self.dev_server = None diff --git a/pyscript.core/tests/integration/test_01_basic.py b/pyscript.core/tests/integration/test_01_basic.py index 57b1f32f69f..fbba9390467 100644 --- a/pyscript.core/tests/integration/test_01_basic.py +++ b/pyscript.core/tests/integration/test_01_basic.py @@ -167,7 +167,6 @@ def test_escaping_of_angle_brackets(self): "C true false", "D
"] - @pytest.mark.skip(reason="FIX TEST: Works on CHROME") def test_packages(self): self.pyscript_run( """ @@ -188,8 +187,6 @@ def test_packages(self): "hello asciitree", # printed by us ] - # TODO: if there's no """, wait_for_pyscript=False, ) @@ -211,8 +211,6 @@ def test_non_existent_package(self): assert expected_alert_banner_msg in alert_banner.inner_text() self.check_py_errors("Can't fetch metadata for 'i-dont-exist'") - # TODO: if there's no """, wait_for_pyscript=False, ) @@ -350,7 +351,6 @@ def test_getPySrc_returns_source_code(self): assert script_py_tag.evaluate("node => node.srcCode") == 'print("hello from script py")' - @pytest.mark.skip(reason="FIX TEST: works in chrome!") def test_py_attribute_without_id(self): self.pyscript_run( """ diff --git a/pyscript.core/tests/integration/test_02_display.py b/pyscript.core/tests/integration/test_02_display.py index 90c304d2cd9..662055b1bd7 100644 --- a/pyscript.core/tests/integration/test_02_display.py +++ b/pyscript.core/tests/integration/test_02_display.py @@ -2,6 +2,7 @@ import io import os import re +import html import numpy as np import pytest @@ -315,7 +316,6 @@ def test_display_list_dict_tuple(self): == "['A', 1, '!']\n{'B': 2, 'List': ['A', 1, '!']}\n('C', 3, '!')" ) - @pytest.mark.skip("The asserts are commented out. Investigate") def test_display_should_escape(self): self.pyscript_run( """ @@ -325,13 +325,10 @@ def test_display_should_escape(self): """ ) - # out = self.page.locator("script-py > div") - node_list = self.page.query_selector_all(DISPLAY_OUTPUT_ID_PATTERN) - node_list[0] - # assert out.inner_html() == html.escape("

hello world

") - # assert out.inner_text() == "

hello world

" + out = self.page.locator("script-py > div") + assert out.inner_html() == html.escape("

hello world

") + assert out.inner_text() == '

hello world

' - @pytest.mark.skip("The asserts are commented out. Investigate") def test_display_HTML(self): self.pyscript_run( """ @@ -341,17 +338,13 @@ def test_display_HTML(self): """ ) - # out = self.page.locator("script-py > div") - node_list = self.page.query_selector_all(DISPLAY_OUTPUT_ID_PATTERN) - node_list[0] - # assert out.inner_html() == "

hello world

" - # assert out.inner_text() == "hello world" - - @pytest.mark.skip( - "FIX TEST: Works correctly in Chrome, but fails in TEST with the error:\n\n" - "It's likely that the Test framework injections in config are causing" - "this error." - ) + out = self.page.locator("script-py > div") + assert out.inner_html() == "

hello world

" + assert out.inner_text() == "hello world" + + # waiit_for_pyscript is broken: it waits until the python code is about to + # start, to until the python code has finished execution + @pytest.mark.skip("FIXME: wait_for_pyscript is broken") def test_image_display(self): self.pyscript_run( """ @@ -435,11 +428,6 @@ def test_console_line_break(self): assert console_text.index("1print") == (console_text.index("2print") - 1) assert console_text.index("1console") == (console_text.index("2console") - 1) - @pytest.mark.skip( - "FIX TEST: Works correctly in Chrome, but fails in TEST with the error:\n\n" - "It's likely that the Test framework injections in config are causing" - "this error." - ) def test_image_renders_correctly(self): """This is just a sanity check to make sure that images are rendered correctly.""" buffer = io.BytesIO() diff --git a/pyscript.core/tests/integration/test_03_element.py b/pyscript.core/tests/integration/test_03_element.py deleted file mode 100644 index bf082f1f1fc..00000000000 --- a/pyscript.core/tests/integration/test_03_element.py +++ /dev/null @@ -1,303 +0,0 @@ -import pytest - -from .support import PyScriptTest - - -class TestElement(PyScriptTest): - """Test the Element api""" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_id(self): - """Test the element id""" - self.pyscript_run( - """ -
- - """ - ) - assert self.console.log.lines[-1] == "foo" - - py_terminal = self.page.wait_for_selector("py-terminal") - assert "foo" in py_terminal.inner_text() - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_value(self): - """Test the element value""" - self.pyscript_run( - """ - - - """ - ) - assert self.console.log.lines[-1] == "bar" - - py_terminal = self.page.wait_for_selector("py-terminal") - assert "bar" in py_terminal.inner_text() - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_innerHtml(self): - """Test the element innerHtml""" - self.pyscript_run( - """ -
bar
- - """ - ) - assert self.console.log.lines[-1] == "bar" - - py_terminal = self.page.wait_for_selector("py-terminal") - assert "bar" in py_terminal.inner_text() - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_write_no_append(self): - """Test the element write""" - self.pyscript_run( - """ -
- - """ - ) - div = self.page.wait_for_selector("#foo") - assert "World!" in div.inner_text() - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_write_append(self): - """Test the element write""" - self.pyscript_run( - """ -
- - """ - ) - parent_div = self.page.wait_for_selector("#foo") - - assert "Hello!" in parent_div.inner_text() - # confirm that the second write was appended - assert "Hello!
World!
" in parent_div.inner_html() - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_clear_div(self): - """Test the element clear""" - self.pyscript_run( - """ -
Hello!
- - """ - ) - div = self.page.locator("#foo") - assert div.inner_text() == "" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_clear_input(self): - """Test the element clear""" - self.pyscript_run( - """ - - - """ - ) - input = self.page.wait_for_selector("#foo") - assert input.input_value() == "" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_select(self): - """Test the element select""" - self.pyscript_run( - """ - - - """ - ) - assert self.console.log.lines[-1] == "bar" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_select_content(self): - """Test the element select""" - self.pyscript_run( - """ - - - """ - ) - assert self.console.log.lines[-1] == "Bar" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_clone_no_id(self): - """Test the element clone""" - self.pyscript_run( - """ -
Hello!
- - """ - ) - divs = self.page.locator("#foo") - assert divs.count() == 2 - assert divs.first.inner_text() == "Hello!" - assert divs.last.inner_text() == "Hello!" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_clone_with_id(self): - """Test the element clone""" - self.pyscript_run( - """ -
Hello!
- - """ - ) - divs = self.page.locator("#foo") - assert divs.count() == 1 - assert divs.inner_text() == "Hello!" - - clone = self.page.locator("#bar") - assert clone.inner_text() == "Hello!" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_clone_to_other_element(self): - """Test the element clone""" - self.pyscript_run( - """ -
-
- Bond -
-
- James -
-
- - """ - ) - bond_divs = self.page.locator("#bond") - james_divs = self.page.locator("#james") - bond_2_divs = self.page.locator("#bond-2") - - assert bond_divs.count() == 1 - assert james_divs.count() == 1 - assert bond_2_divs.count() == 1 - - container_div = self.page.locator("#container") - # Make sure that the clones are rendered in the right order - assert container_div.inner_text() == "Bond\nJames\nBond" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_remove_single_class(self): - """Test the element remove_class""" - self.pyscript_run( - """ -
- - """ - ) - div = self.page.locator("#foo") - assert div.get_attribute("class") == "baz" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_remove_multiple_classes(self): - """Test the element remove_class""" - self.pyscript_run( - """ -
- - """ - ) - div = self.page.locator("#foo") - assert div.get_attribute("class") == "" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_add_single_class(self): - """Test the element add_class""" - self.pyscript_run( - """ - -
Hi!
- - """ - ) - div = self.page.locator("#foo") - assert div.get_attribute("class") == "red" - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_element_add_multiple_class(self): - """Test the element add_class""" - self.pyscript_run( - """ - -
Hi!
- - """ - ) - div = self.page.locator("#foo") - assert div.get_attribute("class") == "red bold" diff --git a/pyscript.core/tests/integration/test_event_handling.py b/pyscript.core/tests/integration/test_event_handling.py index a0a15e7b3e8..70de16a8f4a 100644 --- a/pyscript.core/tests/integration/test_event_handling.py +++ b/pyscript.core/tests/integration/test_event_handling.py @@ -2,10 +2,6 @@ from .support import PyScriptTest -pytest.skip( - reason="FIXME: @when decorator missing from pyscript", allow_module_level=True -) - class TestEventHandler(PyScriptTest): def test_when_decorator_with_event(self): diff --git a/pyscript.core/tests/integration/test_py_config.py b/pyscript.core/tests/integration/test_py_config.py index b913a757224..f9722bb3945 100644 --- a/pyscript.core/tests/integration/test_py_config.py +++ b/pyscript.core/tests/integration/test_py_config.py @@ -1,45 +1,9 @@ import os -import tarfile -import tempfile -from pathlib import Path import pytest -import requests from .support import PyScriptTest, with_execution_thread -PYODIDE_VERSION = "0.23.4" - - -@pytest.fixture -def pyodide_tar(request): - """ - Fixture which returns a local copy of pyodide. It uses pytest-cache to - avoid re-downloading it between runs. - """ - URL = ( - f"https://github.com/pyodide/pyodide/releases/download/{PYODIDE_VERSION}/" - f"pyodide-core-{PYODIDE_VERSION}.tar.bz2" - ) - tar_name = Path(URL).name - - val = request.config.cache.get(tar_name, None) - if val is None: - response = requests.get(URL, stream=True) - TMP_DIR = tempfile.mkdtemp() - TMP_TAR_LOCATION = os.path.join(TMP_DIR, tar_name) - with open(TMP_TAR_LOCATION, "wb") as f: - f.write(response.raw.read()) - val = TMP_TAR_LOCATION - request.config.cache.set(tar_name, val) - return val - - -def unzip(location, extract_to="."): - file = tarfile.open(name=location, mode="r:bz2") - file.extractall(path=extract_to) - - # Disable the main/worker dual testing, for two reasons: # # 1. the logic happens before we start the worker, so there is @@ -103,37 +67,6 @@ def test_py_config_external(self): ) assert self.console.log.lines[-1] == "config name: app with external config" - # The default pyodide version is newer than - # the one we are loading below (after downloading locally) - # which is 0.22.0 - - # The test checks if loading a different interpreter is possible - # and that too from a locally downloaded file without needing - # the use of explicit `indexURL` calculation. - @pytest.mark.skip("Interpreters key is not implemented in PyScript Next") - def test_interpreter_config(self, pyodide_tar): - unzip(pyodide_tar, extract_to=self.tmpdir) - self.pyscript_run( - """ - - { - "interpreters": [{ - "src": "/pyodide/pyodide.js", - "name": "my-own-pyodide", - "lang": "python" - }] - } - - - - """, - ) - - assert self.console.log.lines[-1] == f"version {PYODIDE_VERSION}" @pytest.mark.skip("FIXME: We need to restore the banner.") def test_invalid_json_config(self): @@ -148,14 +81,13 @@ def test_invalid_json_config(self): wait_for_pyscript=False, ) banner = self.page.wait_for_selector(".py-error") - assert "SyntaxError: Unexpected end of JSON input" in self.console.error.text + #assert "Unexpected end of JSON input" in self.console.error.text expected = ( - "(PY1000): The config supplied: [[ is an invalid JSON and cannot be " - "parsed: SyntaxError: Unexpected end of JSON input" + "(PY1000): Invalid JSON\n" + "Unexpected end of JSON input" ) assert banner.inner_text() == expected - @pytest.mark.skip("FIXME: We need to restore the banner.") def test_invalid_toml_config(self): # we need wait_for_pyscript=False because we bail out very soon, # before being able to write 'PyScript page fully initialized' @@ -168,15 +100,15 @@ def test_invalid_toml_config(self): wait_for_pyscript=False, ) banner = self.page.wait_for_selector(".py-error") - assert "SyntaxError: Expected DoubleQuote" in self.console.error.text + #assert "Expected DoubleQuote" in self.console.error.text expected = ( - "(PY1000): The config supplied: [[ is an invalid TOML and cannot be parsed: " - "SyntaxError: Expected DoubleQuote, Whitespace, or [a-z], [A-Z], " - '[0-9], "-", "_" but "\\n" found.' + "(PY1000): Invalid TOML\n" + "Expected DoubleQuote, Whitespace, or [a-z], [A-Z], " + '[0-9], "-", "_" but end of input found.' ) assert banner.inner_text() == expected - @pytest.mark.skip("FIXME: We need to restore the banner.") + @pytest.mark.skip("FIXME: emit a warning in case of multiple py-config") def test_multiple_py_config(self): self.pyscript_run( """ @@ -185,13 +117,13 @@ def test_multiple_py_config(self): - this is ignored and won't even be parsed + name = "this is ignored" """ ) @@ -202,54 +134,6 @@ def test_multiple_py_config(self): ) assert banner.text_content() == expected - @pytest.mark.skip("Interpreters key is not implemented in PyScript Next") - def test_no_interpreter(self): - snippet = """ - - { - "interpreters": [] - } - - """ - self.pyscript_run(snippet, wait_for_pyscript=False) - div = self.page.wait_for_selector(".py-error") - assert ( - div.text_content() == "(PY1000): Fatal error: config.interpreter is empty" - ) - - @pytest.mark.skip("Interpreters key is not implemented in PyScript Next") - def test_multiple_interpreter(self): - snippet = """ - - { - "interpreters": [ - { - "src": "https://cdn.jsdelivr.net/pyodide/v0.23.2/full/pyodide.js", - "name": "pyodide-0.23.2", - "lang": "python" - }, - { - "src": "http://...", - "name": "this will be ignored", - "lang": "this as well" - } - ] - } - - - - """ - self.pyscript_run(snippet) - banner = self.page.wait_for_selector(".py-warning") - expected = ( - "Multiple interpreters are not supported yet.Only the first will be used" - ) - assert banner.text_content() == expected - assert self.console.log.lines[-1] == "hello world" - def test_paths(self): self.writefile("a.py", "x = 'hello from A'") self.writefile("b.py", "x = 'hello from B'") @@ -273,7 +157,7 @@ def test_paths(self): "hello from B", ] - @pytest.mark.skip("FIXME: We need to restore the banner.") + @pytest.mark.skip("FIXME: emit an error if fetch fails") def test_paths_that_do_not_exist(self): self.pyscript_run( """ @@ -281,16 +165,19 @@ def test_paths_that_do_not_exist(self): [[fetch]] files = ["./f.py"] + + """, wait_for_pyscript=False, ) expected = "(PY0404): Fetching from URL ./f.py failed with " "error 404" - inner_html = self.page.locator(".py-error").inner_html() - assert expected in inner_html assert expected in self.console.error.lines[-1] + assert self.console.log.lines == [] def test_paths_from_packages(self): self.writefile("utils/__init__.py", "") diff --git a/pyscript.core/tests/integration/test_runtime_attributes.py b/pyscript.core/tests/integration/test_runtime_attributes.py deleted file mode 100644 index 621b43a10c9..00000000000 --- a/pyscript.core/tests/integration/test_runtime_attributes.py +++ /dev/null @@ -1,64 +0,0 @@ -import pytest - -from .support import PyScriptTest - - -class TestPyScriptRuntimeAttributes(PyScriptTest): - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_injected_html_with_py_event(self): - self.pyscript_run( - r""" -
- - """ - ) - self.page.locator("button").click() - assert self.console.log.lines == ["hello pyscript"] - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_added_py_event(self): - self.pyscript_run( - r""" - - - """ - ) - self.page.locator("button").click() - assert self.console.log.lines == ["hello pyscript"] - - @pytest.mark.skip("FIXME: Element interface is gone. Replace with PyDom") - def test_added_then_removed_py_event(self): - self.pyscript_run( - r""" - - - """ - ) - self.page.locator("button").click() - self.page.locator("button").click() - assert self.console.log.lines == ["hello pyscript"] diff --git a/pyscript.core/tests/integration/test_script_type.py b/pyscript.core/tests/integration/test_script_type.py index 8173f1b37de..fd3382908ab 100644 --- a/pyscript.core/tests/integration/test_script_type.py +++ b/pyscript.core/tests/integration/test_script_type.py @@ -81,12 +81,12 @@ def test_script_type_py_src_attribute(self): ) assert self.console.log.lines[-1] == "hello from foo" - @pytest.mark.skip("FIXME: test failure is unrelated") + @pytest.mark.skip("FIXME: wait_for_pyscript is broken") def test_script_type_py_worker_attribute(self): self.writefile("foo.py", "print('hello from foo')") self.pyscript_run( """ - + """ ) assert self.console.log.lines[-1] == "hello from foo" diff --git a/pyscript.core/tests/integration/test_style.py b/pyscript.core/tests/integration/test_style.py index 6eb6e851b50..cc37315b745 100644 --- a/pyscript.core/tests/integration/test_style.py +++ b/pyscript.core/tests/integration/test_style.py @@ -3,11 +3,6 @@ from .support import PyScriptTest, skip_worker -pytest.skip( - reason="FIX TESTS: These tests should reflect new PyScript and remove/change css ", - allow_module_level=True, -) - class TestStyle(PyScriptTest): def test_pyscript_not_defined(self): @@ -15,12 +10,11 @@ def test_pyscript_not_defined(self): doc = """ - + hello - - hello + hello """ @@ -28,20 +22,3 @@ def test_pyscript_not_defined(self): self.goto("test-not-defined-css.html") expect(self.page.locator("py-config")).to_be_hidden() expect(self.page.locator("py-script")).to_be_hidden() - expect(self.page.locator("py-repl")).to_be_hidden() - - @skip_worker("FIXME: display()") - def test_pyscript_defined(self): - """Test elements have visibility that should""" - self.pyscript_run( - """ - - name = "foo" - - - display("hello") - """ - ) - expect(self.page.locator("py-config")).to_be_hidden() - expect(self.page.locator("py-script")).to_be_visible() - expect(self.page.locator("py-repl")).to_be_visible()