From 4f072a62476b24a1dd4afc20b3d9515ea67a7f55 Mon Sep 17 00:00:00 2001 From: Vlad Stan Date: Tue, 7 Jul 2026 17:10:50 +0300 Subject: [PATCH] test: add tests --- Makefile | 6 + pyproject.toml | 1 + .../lnbits-wasm-test-extension/config.json | 173 ++++++++++++++++++ .../lnbits-wasm-test-extension/static/app.js | 1 + .../lnbits-wasm-test-extension/ui/admin.html | 11 ++ .../lnbits-wasm-test-extension/ui/public.html | 11 ++ .../wasm/module.wasm | Bin 0 -> 273083 bytes tests/wasm_ext/__init__.py | 1 + tests/wasm_ext/conftest.py | 149 +++++++++++++++ tests/wasm_ext/helpers.py | 14 ++ tests/wasm_ext/test_wasm_extension_e2e.py | 94 ++++++++++ uv.lock | 82 +++++++++ 12 files changed, 543 insertions(+) create mode 100644 tests/fixtures/lnbits-wasm-test-extension/config.json create mode 100644 tests/fixtures/lnbits-wasm-test-extension/static/app.js create mode 100644 tests/fixtures/lnbits-wasm-test-extension/ui/admin.html create mode 100644 tests/fixtures/lnbits-wasm-test-extension/ui/public.html create mode 100644 tests/fixtures/lnbits-wasm-test-extension/wasm/module.wasm create mode 100644 tests/wasm_ext/__init__.py create mode 100644 tests/wasm_ext/conftest.py create mode 100644 tests/wasm_ext/helpers.py create mode 100644 tests/wasm_ext/test_wasm_extension_e2e.py diff --git a/Makefile b/Makefile index 283caf9db..04c8089ae 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,12 @@ test-api: DEBUG=true \ uv run pytest tests/api +test-wasm-e2e: + LNBITS_BACKEND_WALLET_CLASS="FakeWallet" \ + PYTHONUNBUFFERED=1 \ + DEBUG=true \ + uv run pytest tests/wasm_ext --browser chromium + test-regtest: LNBITS_DATA_FOLDER="./tests/data" \ PYTHONUNBUFFERED=1 \ diff --git a/pyproject.toml b/pyproject.toml index f10a95929..0d0d0c941 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,6 +86,7 @@ dev = [ "types-mock~=5.2.0.20250924", "mock~=5.2.0", "grpcio-tools~=1.76.0", + "pytest-playwright>=0.8.0", ] [tool.uv] diff --git a/tests/fixtures/lnbits-wasm-test-extension/config.json b/tests/fixtures/lnbits-wasm-test-extension/config.json new file mode 100644 index 000000000..6385c73dd --- /dev/null +++ b/tests/fixtures/lnbits-wasm-test-extension/config.json @@ -0,0 +1,173 @@ +{ + "id": "lnbits-wasm-test-extension", + "name": "WASM Test Extension", + "short_description": "Minimal WASM extension used by LNbits e2e tests.", + "version": "0.0.1", + "min_lnbits_version": "1.5.5", + "extension_type": "wasm", + "wasm": { + "module": "wasm/module.wasm", + "exports": [ + { + "name": "list-wallets", + "visibility": "authenticated" + }, + { + "name": "invoice-details", + "visibility": "authenticated" + }, + { + "name": "get-selection", + "visibility": "authenticated" + }, + { + "name": "save-selection", + "visibility": "authenticated" + }, + { + "name": "pay-large-invoice", + "visibility": "authenticated" + }, + { + "name": "create-tip-jar", + "visibility": "authenticated" + }, + { + "name": "list-tip-jars", + "visibility": "authenticated" + }, + { + "name": "get-public-tip-jar", + "visibility": "public" + }, + { + "name": "create-tip-invoice", + "visibility": "public" + }, + { + "name": "record-payment", + "visibility": "event" + } + ] + }, + "events": { + "onInvoicePaid": "record-payment" + }, + "ui_routes": [ + { + "path": "/lnbits-wasm-test-extension", + "entrypoint": "ui/admin.html", + "auth": "user" + }, + { + "path": "/lnbits-wasm-test-extension/public/{item_id}", + "entrypoint": "ui/public.html", + "auth": "public", + "path_params": { + "item_id": "itemId" + } + } + ], + "api_routes": [ + { + "method": "GET", + "path": "/wallets", + "export": "list-wallets", + "auth": "user" + }, + { + "method": "POST", + "path": "/payments", + "export": "pay-large-invoice", + "auth": "user" + }, + { + "method": "GET", + "path": "/jars/{jar_id}", + "export": "get-public-tip-jar", + "auth": "public", + "path_params": { + "jar_id": "jarId" + } + }, + { + "method": "POST", + "path": "/invoice", + "export": "create-tip-invoice", + "auth": "public" + } + ], + "permissions": [ + { + "id": "wallet.pay_invoice", + "description": "Pay Lightning invoices from selected wallets." + }, + { + "id": "wallet.list", + "description": "List wallets available to the installing user." + }, + { + "id": "wallet.balance.read", + "description": "Read wallet balances for payment selection." + }, + { + "id": "extension.api.request", + "description": "Call APIs exposed by another installed extension.", + "policies": [ + { + "id": "watchonly", + "access": [ + "read", + "write" + ] + } + ] + }, + { + "id": "ui.camera.scan_qr", + "description": "Use the LNbits scanner to read QR codes when requested." + }, + { + "id": "ext.storage.read", + "description": "Read extension storage rows." + }, + { + "id": "ext.storage.write", + "description": "Write extension storage rows." + }, + { + "id": "ext.storage.read_public", + "description": "Read public extension storage fields.", + "policies": [ + { + "table_name": "tip_jars", + "public_fields": [ + "id", + "title", + "description", + "currency", + "suggested_amounts" + ] + } + ] + }, + { + "id": "wallet.create_invoice", + "description": "Create incoming Lightning invoices from authenticated pages." + }, + { + "id": "wallet.create_invoice_public", + "description": "Create incoming Lightning invoices from public pages.", + "policies": [ + { + "table": "tip_jars", + "wallet_field": "wallet_id" + } + ] + }, + { + "id": "utils.basic", + "description": "Use LNbits utility functions." + } + ] +} diff --git a/tests/fixtures/lnbits-wasm-test-extension/static/app.js b/tests/fixtures/lnbits-wasm-test-extension/static/app.js new file mode 100644 index 000000000..f83e5ae0d --- /dev/null +++ b/tests/fixtures/lnbits-wasm-test-extension/static/app.js @@ -0,0 +1 @@ +window.__lnbitsWasmTestExtensionLoaded = true diff --git a/tests/fixtures/lnbits-wasm-test-extension/ui/admin.html b/tests/fixtures/lnbits-wasm-test-extension/ui/admin.html new file mode 100644 index 000000000..85732ea6c --- /dev/null +++ b/tests/fixtures/lnbits-wasm-test-extension/ui/admin.html @@ -0,0 +1,11 @@ + + + + + WASM Test Extension Admin + + + +
WASM Test Admin
+ + diff --git a/tests/fixtures/lnbits-wasm-test-extension/ui/public.html b/tests/fixtures/lnbits-wasm-test-extension/ui/public.html new file mode 100644 index 000000000..a165feed6 --- /dev/null +++ b/tests/fixtures/lnbits-wasm-test-extension/ui/public.html @@ -0,0 +1,11 @@ + + + + + WASM Test Extension Public + + + +
WASM Test Public
+ + diff --git a/tests/fixtures/lnbits-wasm-test-extension/wasm/module.wasm b/tests/fixtures/lnbits-wasm-test-extension/wasm/module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..fd9aba09672da3ad46f943025ac6f7c5568d009f GIT binary patch literal 273083 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 BiRfi*!R)0=(bgsDK#~6_8@K(qJn1PbUE6*5FK~ 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 literal 0 HcmV?d00001 diff --git a/tests/wasm_ext/__init__.py b/tests/wasm_ext/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/wasm_ext/__init__.py @@ -0,0 +1 @@ + diff --git a/tests/wasm_ext/conftest.py b/tests/wasm_ext/conftest.py new file mode 100644 index 000000000..86979b173 --- /dev/null +++ b/tests/wasm_ext/conftest.py @@ -0,0 +1,149 @@ +from __future__ import annotations + +import os +import shutil +import socket +import subprocess +import sys +import time +from collections.abc import Iterator +from pathlib import Path +from typing import Any + +import httpx +import pytest + +from tests.wasm_ext.helpers import EXTENSION_ID, SERVER_HOST, LiveLNbitsServer + +REPO_ROOT = Path(__file__).resolve().parents[2] + + +@pytest.fixture(scope="session") +def browser_name() -> str: + return "chromium" + + +@pytest.fixture(scope="session") +def lnbits_server( + tmp_path_factory: pytest.TempPathFactory, +) -> Iterator[LiveLNbitsServer]: + run_root = tmp_path_factory.mktemp("wasm_ext_e2e") + data_dir = run_root / "data" + extensions_root = run_root / "extensions-root" + extension_target = extensions_root / "extensions" / EXTENSION_ID + fixture_extension = REPO_ROOT / "tests" / "fixtures" / EXTENSION_ID + + shutil.copytree(fixture_extension, extension_target) + + port = _free_tcp_port() + base_url = f"http://{SERVER_HOST}:{port}" + env = { + **os.environ, + "AUTH_HTTPS_ONLY": "false", + "DEBUG": "true", + "HOST": SERVER_HOST, + "LNBITS_ADMIN_UI": "true", + "LNBITS_BACKEND_WALLET_CLASS": "FakeWallet", + "LNBITS_DATA_FOLDER": str(data_dir), + "LNBITS_EXTENSIONS_DEACTIVATE_ALL": "false", + "LNBITS_EXTENSIONS_PATH": str(extensions_root), + "LNBITS_PATH": str(REPO_ROOT), + "PORT": str(port), + "PYTHONUNBUFFERED": "1", + } + + process = subprocess.Popen( # noqa: S603 + [ + sys.executable, + "-m", + "uvicorn", + "lnbits.__main__:app", + "--host", + SERVER_HOST, + "--port", + str(port), + "--loop", + "asyncio", + "--log-level", + "warning", + ], + cwd=REPO_ROOT, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + try: + _wait_for_first_install_page(process, base_url) + auth_cookies = _complete_first_install(base_url) + yield LiveLNbitsServer(base_url=base_url, auth_cookies=auth_cookies) + finally: + process.terminate() + try: + process.wait(timeout=10) + except subprocess.TimeoutExpired: + process.kill() + process.wait(timeout=10) + + +@pytest.fixture +def authenticated_page(page: Any, lnbits_server: LiveLNbitsServer) -> Any: + page.context.add_cookies(lnbits_server.auth_cookies) + return page + + +def _free_tcp_port() -> int: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + sock.bind((SERVER_HOST, 0)) + return int(sock.getsockname()[1]) + + +def _wait_for_first_install_page( + process: subprocess.Popen[str], + base_url: str, +) -> None: + deadline = time.monotonic() + 60 + last_error: Exception | None = None + with httpx.Client(follow_redirects=False, timeout=2) as client: + while time.monotonic() < deadline: + if process.poll() is not None: + output = process.stdout.read() if process.stdout else "" + raise RuntimeError(f"LNbits exited before startup:\n{output}") + try: + response = client.get(f"{base_url}/first_install") + if response.status_code == 200: + return + except httpx.HTTPError as exc: + last_error = exc + time.sleep(0.25) + + output = process.stdout.read() if process.stdout else "" + raise TimeoutError(f"LNbits did not start: {last_error}\n{output}") + + +def _complete_first_install(base_url: str) -> list[dict[str, Any]]: + with httpx.Client(base_url=base_url, follow_redirects=False, timeout=10) as client: + response = client.put( + "/api/v1/auth/first_install", + json={ + "username": "wasmtest-admin", + "password": "secret1234", + "password_repeat": "secret1234", + }, + ) + response.raise_for_status() + + enable_response = client.put(f"/api/v1/extension/{EXTENSION_ID}/enable") + enable_response.raise_for_status() + + return [ + { + "name": cookie.name, + "value": cookie.value, + "url": base_url, + "secure": cookie.secure, + "sameSite": "Lax", + } + for cookie in client.cookies.jar + ] diff --git a/tests/wasm_ext/helpers.py b/tests/wasm_ext/helpers.py new file mode 100644 index 000000000..30d6425c6 --- /dev/null +++ b/tests/wasm_ext/helpers.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any + +EXTENSION_ID = "lnbits-wasm-test-extension" +SERVER_HOST = "127.0.0.1" + + +@dataclass(frozen=True) +class LiveLNbitsServer: + base_url: str + auth_cookies: list[dict[str, Any]] + extension_id: str = EXTENSION_ID diff --git a/tests/wasm_ext/test_wasm_extension_e2e.py b/tests/wasm_ext/test_wasm_extension_e2e.py new file mode 100644 index 000000000..fe8bd35c1 --- /dev/null +++ b/tests/wasm_ext/test_wasm_extension_e2e.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +import re +from re import Pattern + +from playwright.sync_api import Page, expect + +from tests.wasm_ext.helpers import LiveLNbitsServer + + +def test_public_wasm_page_loads_sandboxed_frame( + page: Page, + lnbits_server: LiveLNbitsServer, +) -> None: + public_url = ( + f"{lnbits_server.base_url}/ext/{lnbits_server.extension_id}/public/item-123" + "?source=test" + ) + frame_url_part = f"/ext-frame/{lnbits_server.extension_id}/1" + + with page.expect_response(lambda response: frame_url_part in response.url) as info: + page.goto(public_url) + + frame_response = info.value + assert frame_response.status == 200 + assert "sandbox allow-scripts" in frame_response.headers["content-security-policy"] + assert frame_response.headers["cache-control"] == "no-store" + assert frame_response.headers["x-content-type-options"] == "nosniff" + + frame = page.locator("iframe.wasm-extension-frame") + expect(frame).to_have_attribute("sandbox", "allow-scripts") + expect(frame).to_have_attribute("allow", "clipboard-write") + expect(frame).to_have_attribute("referrerpolicy", "no-referrer") + expect(frame).to_have_attribute("src", _frame_src_pattern(frame_url_part)) + expect( + page.frame_locator("iframe.wasm-extension-frame").locator("body") + ).to_contain_text("WASM Test Public") + + +def test_frame_token_is_route_bound_required_and_single_use( + page: Page, + lnbits_server: LiveLNbitsServer, +) -> None: + frame_config = page.request.post( + f"{lnbits_server.base_url}/api/v1/ext/" + f"{lnbits_server.extension_id}/_ui/frame", + data={ + "path": f"/ext/{lnbits_server.extension_id}/public/item-123", + "query": {"source": "test"}, + }, + ) + assert frame_config.status == 200 + frame_url = frame_config.json()["frameUrl"] + + missing_token = page.request.get( + f"{lnbits_server.base_url}/ext-frame/{lnbits_server.extension_id}/1" + ) + assert missing_token.status == 404 + + wrong_route = page.request.get( + f"{lnbits_server.base_url}{frame_url.replace('/1?', '/0?')}" + ) + assert wrong_route.status == 404 + + first_use = page.request.get(f"{lnbits_server.base_url}{frame_url}") + assert first_use.status == 200 + assert "form-action 'none'" in first_use.headers["content-security-policy"] + + second_use = page.request.get(f"{lnbits_server.base_url}{frame_url}") + assert second_use.status == 404 + + +def test_private_wasm_page_uses_lnbits_shell_and_private_frame( + authenticated_page: Page, + lnbits_server: LiveLNbitsServer, +) -> None: + page = authenticated_page + frame_url_part = f"/ext-frame/{lnbits_server.extension_id}/0" + + with page.expect_response(lambda response: frame_url_part in response.url) as info: + page.goto(f"{lnbits_server.base_url}/ext/{lnbits_server.extension_id}") + + assert info.value.status == 200 + expect(page.locator("body")).to_contain_text("LNbits") + frame = page.locator("iframe.wasm-extension-frame") + expect(frame).to_have_attribute("sandbox", "allow-scripts") + expect(frame).to_have_attribute("src", _frame_src_pattern(frame_url_part)) + expect( + page.frame_locator("iframe.wasm-extension-frame").locator("body") + ).to_contain_text("WASM Test Admin") + + +def _frame_src_pattern(frame_url_part: str) -> Pattern[str]: + return re.compile(f"^{re.escape(frame_url_part)}\\?frame_token=[a-f0-9]{{32}}$") diff --git a/uv.lock b/uv.lock index d50cc32e9..a21d418b1 100644 --- a/uv.lock +++ b/uv.lock @@ -1368,6 +1368,7 @@ dev = [ { name = "pytest-httpserver" }, { name = "pytest-md" }, { name = "pytest-mock" }, + { name = "pytest-playwright" }, { name = "ruff" }, { name = "types-mock" }, { name = "types-passlib" }, @@ -1446,6 +1447,7 @@ dev = [ { name = "pytest-httpserver", specifier = "~=1.1.3" }, { name = "pytest-md", specifier = "~=0.2.0" }, { name = "pytest-mock", specifier = "~=3.15.1" }, + { name = "pytest-playwright", specifier = ">=0.8.0" }, { name = "ruff", specifier = "~=0.14.10" }, { name = "types-mock", specifier = "~=5.2.0.20250924" }, { name = "types-passlib", specifier = "~=1.7.7.20250602" }, @@ -1832,6 +1834,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] +[[package]] +name = "playwright" +version = "1.61.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet" }, + { name = "pyee" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/ee/31e4e0db36588b817a10b299a0285082545fde7d36543c2abe498bb3d61a/playwright-1.61.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:ff138c3a604f69911e9d42fd036e55c2a171e5616edf04c1e7f60a2a285540b0", size = 43421877, upload-time = "2026-06-29T10:32:48.428Z" }, + { url = "https://files.pythonhosted.org/packages/42/35/71395dd3ecc798965be4a3ef8c443217d4abca168e7cb34536304f9489e6/playwright-1.61.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:009588c2a7e499bc5a8b425b61fa65490968bbda9cd69e0cf2cff10f8304659a", size = 42205016, upload-time = "2026-06-29T10:32:52.104Z" }, + { url = "https://files.pythonhosted.org/packages/f4/44/323164cf5cd1647bdefce76ffce27651aadb959d089b48f53ea40918276e/playwright-1.61.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:9f7de4536088d12037c13a52b7ea34b59270b78926bb56935070597ffac6b1af", size = 43421884, upload-time = "2026-06-29T10:32:55.773Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f8/a35bf179e4ba2522c1893635094a64e407572547bd61528820fc0abc87fe/playwright-1.61.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:54f3b39f6eab832e33458c1dd7da0b5682aedab3b09ae731b5c59fa12fd2024e", size = 47421381, upload-time = "2026-06-29T10:32:59.903Z" }, + { url = "https://files.pythonhosted.org/packages/b7/eb/e3f922348ec17c315f98c463f72faa1181a1c3de0bfe31a8d2edf6561723/playwright-1.61.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93454322ade8c11d5d6c211bfd91bdfb9ffb4810e3e026371bcbc4bec1b7ee4c", size = 47120545, upload-time = "2026-06-29T10:33:03.574Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a6/5be4e52b40a9c0c8a073e7c5b0785c05cf5a9ea8f8a7b5b260e32d970342/playwright-1.61.0-py3-none-win32.whl", hash = "sha256:372d55a6f1248fa1dd47599686980cb8fb5bbe6fcda59eab793eb657c11d8a9b", size = 37844841, upload-time = "2026-06-29T10:33:07.361Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fd/2b78036e5fbe9d5f5645bbe08a1eac7160c51243c0093963edbcf67c35d9/playwright-1.61.0-py3-none-win_amd64.whl", hash = "sha256:35c6cc4589a5d00964a59d7b3e59641e0aac0c02f15479a7af77d20f6bc79597", size = 37844846, upload-time = "2026-06-29T10:33:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/1b0f3c4ee4eb0514bc805b5c2f9a223e5b6de4f11a926f5235d51d0fc81b/playwright-1.61.0-py3-none-win_arm64.whl", hash = "sha256:e9fcbffcf557a8620fdedd92491eb59a32d18e23d6f3b4f6214b952be324fe51", size = 33955127, upload-time = "2026-06-29T10:33:14.008Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -2059,6 +2080,18 @@ email = [ { name = "email-validator" }, ] +[[package]] +name = "pyee" +version = "13.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", size = 31655, upload-time = "2026-02-14T21:12:28.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228", size = 15659, upload-time = "2026-02-14T21:12:26.263Z" }, +] + [[package]] name = "pygments" version = "2.20.0" @@ -2201,6 +2234,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] +[[package]] +name = "pytest-base-url" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/1a/b64ac368de6b993135cb70ca4e5d958a5c268094a3a2a4cac6f0021b6c4f/pytest_base_url-2.1.0.tar.gz", hash = "sha256:02748589a54f9e63fcbe62301d6b0496da0d10231b753e950c63e03aee745d45", size = 6702, upload-time = "2024-01-31T22:43:00.81Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl", hash = "sha256:3ad15611778764d451927b2a53240c1a7a591b521ea44cebfe45849d2d2812e6", size = 5302, upload-time = "2024-01-31T22:42:58.897Z" }, +] + [[package]] name = "pytest-cov" version = "7.0.0" @@ -2251,6 +2297,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" }, ] +[[package]] +name = "pytest-playwright" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "playwright" }, + { name = "pytest" }, + { name = "pytest-base-url" }, + { name = "python-slugify" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/ef/172eb8e23c80491fc72f1401c72f9305663873649351306a38b18406b0c9/pytest_playwright-0.8.0.tar.gz", hash = "sha256:7888d4a2443160c82e0c506c437076679f86b36d1910427250d90fbf1843a981", size = 17132, upload-time = "2026-05-18T10:16:15.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/71/1c545fac6a9054b52b3771238fb2dc6e8f1d0ccec116e1c7786ec191887c/pytest_playwright-0.8.0-py3-none-any.whl", hash = "sha256:856aae6efd4bc055f2ef229c647768760bcaad5cd3a5983c314ac260a974a933", size = 17143, upload-time = "2026-05-18T10:16:18.226Z" }, +] + [[package]] name = "python-crontab" version = "3.3.0" @@ -2291,6 +2352,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5e/1e/7f7f299527a5a8ad90acd5f2f78dfa6c8495c6301a3205106ea68a84de96/python_multipart-0.0.31-py3-none-any.whl", hash = "sha256:8408153d68a9773291fc1da39a8b85a50044bddbabd2dd72e9229776b7b15e28", size = 29996, upload-time = "2026-06-04T08:27:47.804Z" }, ] +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, +] + [[package]] name = "pytokens" version = "0.4.1" @@ -2630,6 +2703,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, ] +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, +] + [[package]] name = "tibs" version = "0.5.7"