Mirror test layout, domcontentloaded waits, backup DB writes outside threads
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
@@ -0,0 +1,16 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
from tests.conftest import login_admin
|
||||
|
||||
ADMIN_PAGES = ["/admin", "/admin/posts", "/admin/joins", "/admin/services", "/admin/services/backup", "/admin/trash", "/admin/settings", "/admin/users", "/admin/audit", "/admin/backups", "/admin/stats", "/notifications", "/profile/api-key", "/docs/api/beheer"]
|
||||
|
||||
|
||||
def test_admin_pages_have_no_js_errors(page, app_server):
|
||||
login_admin(page, app_server)
|
||||
for path in ADMIN_PAGES:
|
||||
page.goto(app_server + path, wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.goto(app_server + "/admin/services/backup", wait_until="domcontentloaded")
|
||||
page.click("[data-tab=logs]")
|
||||
assert page.locator("[data-panel=logs]").is_visible()
|
||||
page.wait_for_timeout(3500)
|
||||
assert page.console_errors == []
|
||||
@@ -0,0 +1,16 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
from tests.conftest import login_admin
|
||||
|
||||
|
||||
def test_login_and_editor_preview(page, app_server):
|
||||
login_admin(page, app_server)
|
||||
page.goto(app_server + "/admin/posts/new", wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.fill("#body", "Een **vette** zin <script>alert(1)</script> [link](javascript:alert(1)) <b onclick=alert(1)>b</b>")
|
||||
page.wait_for_function("document.querySelector('[data-preview-target] strong')")
|
||||
preview = page.locator("[data-preview-target]").inner_html()
|
||||
assert "<strong>vette</strong>" in preview
|
||||
assert "<script" not in preview
|
||||
assert "javascript:" not in preview
|
||||
assert "onclick" not in preview
|
||||
assert page.console_errors == []
|
||||
@@ -0,0 +1,10 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
|
||||
def test_join_form_submits(page, app_server):
|
||||
page.goto(app_server + "/binnen", wait_until="domcontentloaded")
|
||||
page.fill("input[name=name]", "Browser Schrijver")
|
||||
page.fill("input[name=contact]", "browser@example.invalid")
|
||||
page.click("form button[type=submit]")
|
||||
page.wait_for_url("**/binnen?ok=1", wait_until="domcontentloaded")
|
||||
assert page.console_errors == []
|
||||
@@ -0,0 +1,17 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
|
||||
def test_docs_tabs_switch(page, app_server):
|
||||
page.goto(app_server + "/docs/api/inhoud", wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.click("[data-endpoint] [data-tab=expected] >> nth=0")
|
||||
assert page.locator("[data-endpoint] [data-panel=expected]").first.is_visible()
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_docs_code_blocks_get_highlight_and_copy(page, app_server):
|
||||
page.goto(app_server + "/docs/api", wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.wait_for_selector("dp-code .copy-button")
|
||||
assert page.locator("dp-code pre code.hljs").count() >= 1
|
||||
assert page.console_errors == []
|
||||
@@ -0,0 +1,12 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
|
||||
def test_lightbox_opens_and_closes(page, app_server):
|
||||
page.goto(app_server + "/flyers", wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.locator("[data-lightbox]").first.click()
|
||||
lightbox = page.locator("dp-lightbox")
|
||||
assert lightbox.evaluate("el => el.classList.contains('visible')")
|
||||
page.keyboard.press("Escape")
|
||||
assert not lightbox.evaluate("el => el.classList.contains('visible')")
|
||||
assert page.console_errors == []
|
||||
@@ -0,0 +1,31 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
from tests.conftest import assert_no_horizontal_overflow
|
||||
|
||||
PUBLIC_PAGES = ["/", "/rol", "/standaard", "/flyers", "/memes", "/mensen", "/mensen/retoor", "/binnen", "/docs", "/docs/welkom", "/docs/api/inhoud", "/docs/component-code", "/voorwaarden", "/privacy"]
|
||||
|
||||
|
||||
def test_home_renders_without_errors(page, app_server):
|
||||
page.goto(app_server + "/", wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
assert page.locator("h1").first.inner_text().strip().lower() == "molodetz"
|
||||
assert page.locator("nav .nav-links a", has_text="Binnen").count() == 1
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_mobile_nav_toggle(browser, app_server):
|
||||
context = browser.new_context(viewport={"width": 390, "height": 800})
|
||||
page = context.new_page()
|
||||
page.goto(app_server + "/", wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
assert_no_horizontal_overflow(page)
|
||||
assert not page.locator("#nav-links").is_visible()
|
||||
page.click("[data-nav-toggle]")
|
||||
assert page.locator("#nav-links").is_visible()
|
||||
context.close()
|
||||
|
||||
|
||||
def test_public_pages_have_no_js_errors(page, app_server):
|
||||
for path in PUBLIC_PAGES:
|
||||
page.goto(app_server + path, wait_until="domcontentloaded")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
assert page.console_errors == []
|
||||
@@ -1,102 +0,0 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
from tests.conftest import ADMIN_PASSWORD, ADMIN_USERNAME
|
||||
|
||||
|
||||
def test_home_renders_without_errors(page, app_server):
|
||||
page.goto(app_server + "/")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
assert page.locator("h1").first.inner_text().strip().lower() == "molodetz"
|
||||
assert page.locator("nav .nav-links a", has_text="Binnen").count() == 1
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_lightbox_opens_and_closes(page, app_server):
|
||||
page.goto(app_server + "/flyers")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.locator("[data-lightbox]").first.click()
|
||||
lightbox = page.locator("dp-lightbox")
|
||||
assert lightbox.evaluate("el => el.classList.contains('visible')")
|
||||
page.keyboard.press("Escape")
|
||||
assert not lightbox.evaluate("el => el.classList.contains('visible')")
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_mobile_nav_toggle(browser, app_server):
|
||||
context = browser.new_context(viewport={"width": 390, "height": 800})
|
||||
page = context.new_page()
|
||||
page.goto(app_server + "/")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
assert not page.locator("#nav-links").is_visible()
|
||||
page.click("[data-nav-toggle]")
|
||||
assert page.locator("#nav-links").is_visible()
|
||||
context.close()
|
||||
|
||||
|
||||
def test_login_and_editor_preview(page, app_server):
|
||||
page.goto(app_server + "/auth/login")
|
||||
page.fill("input[name=username]", ADMIN_USERNAME)
|
||||
page.fill("input[name=password]", ADMIN_PASSWORD)
|
||||
page.click("button[type=submit]")
|
||||
page.wait_for_url("**/admin")
|
||||
page.goto(app_server + "/admin/posts/new")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.fill("#body", "Een **vette** zin <script>alert(1)</script> [link](javascript:alert(1)) <b onclick=alert(1)>b</b>")
|
||||
page.wait_for_function("document.querySelector('[data-preview-target] strong')")
|
||||
preview = page.locator("[data-preview-target]").inner_html()
|
||||
assert "<strong>vette</strong>" in preview
|
||||
assert "<script" not in preview
|
||||
assert "javascript:" not in preview
|
||||
assert "onclick" not in preview
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_join_form_submits(page, app_server):
|
||||
page.goto(app_server + "/binnen")
|
||||
page.fill("input[name=name]", "Browser Schrijver")
|
||||
page.fill("input[name=contact]", "browser@example.invalid")
|
||||
page.click("form button[type=submit]")
|
||||
page.wait_for_url("**/binnen?ok=1")
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
PUBLIC_PAGES = ["/", "/rol", "/standaard", "/flyers", "/memes", "/mensen", "/mensen/retoor", "/binnen", "/docs", "/docs/welkom", "/docs/api/inhoud", "/docs/component-code", "/voorwaarden", "/privacy"]
|
||||
ADMIN_PAGES = ["/admin", "/admin/posts", "/admin/joins", "/admin/services", "/admin/services/backup", "/admin/trash", "/admin/settings", "/admin/users", "/admin/audit", "/admin/backups", "/admin/stats", "/notifications", "/profile/api-key", "/docs/api/beheer"]
|
||||
|
||||
|
||||
def test_public_pages_have_no_js_errors(page, app_server):
|
||||
for path in PUBLIC_PAGES:
|
||||
page.goto(app_server + path)
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_admin_pages_have_no_js_errors(page, app_server):
|
||||
page.goto(app_server + "/auth/login")
|
||||
page.fill("input[name=username]", ADMIN_USERNAME)
|
||||
page.fill("input[name=password]", ADMIN_PASSWORD)
|
||||
page.click("button[type=submit]")
|
||||
page.wait_for_url("**/admin")
|
||||
for path in ADMIN_PAGES:
|
||||
page.goto(app_server + path)
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.goto(app_server + "/admin/services/backup")
|
||||
page.click("[data-tab=logs]")
|
||||
assert page.locator("[data-panel=logs]").is_visible()
|
||||
page.wait_for_timeout(3500)
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_docs_tabs_switch(page, app_server):
|
||||
page.goto(app_server + "/docs/api/inhoud")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.click("[data-endpoint] [data-tab=expected] >> nth=0")
|
||||
assert page.locator("[data-endpoint] [data-panel=expected]").first.is_visible()
|
||||
assert page.console_errors == []
|
||||
|
||||
|
||||
def test_docs_code_blocks_get_highlight_and_copy(page, app_server):
|
||||
page.goto(app_server + "/docs/api")
|
||||
page.wait_for_selector("html[data-app=ready]")
|
||||
page.wait_for_selector("dp-code .copy-button")
|
||||
assert page.locator("dp-code pre code.hljs").count() >= 1
|
||||
assert page.console_errors == []
|
||||
Reference in New Issue
Block a user