trainUs/tests/test_step29_persistent_storage.py
David 270ff24c60
Some checks failed
CI / Lint & Format (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Tests (${{ matrix.browser }}) (chromium) (push) Has been cancelled
CI / Tests (${{ matrix.browser }}) (firefox) (push) Has been cancelled
Fix some issue at first load and cache issue
2026-07-26 13:03:09 +02:00

70 lines
2.4 KiB
Python

"""
Step 29 — Persistent storage request
Without navigator.storage.persist(), the origin's storage (OPFS database,
PWA precache — including the Bootstrap Icons font) is "best-effort" and the
browser may evict it after long periods of inactivity or under disk
pressure. On startup the app now requests persistent storage once,
fire-and-forget.
The real persist() outcome depends on browser heuristics / a permission
prompt, so these tests stub StorageManager.prototype.persist via an init
script and verify the app's behaviour around it:
- test_persist_requested_on_startup: startup calls persist() exactly once
and the app boots normally when the request is granted
- test_app_boots_when_persist_denied: a denied request does not block
startup (red path)
- test_app_boots_without_persist_api: browsers without the API still boot
and no call is attempted (red path)
"""
from playwright.sync_api import Page
_DB_READY = "document.documentElement.getAttribute('data-db-ready') === 'true'"
# Stub persist() to count calls and resolve with a fixed grant result.
_STUB_PERSIST_TEMPLATE = """
(() => {
window.__persistCalls = 0;
StorageManager.prototype.persist = function () {
window.__persistCalls += 1;
return Promise.resolve(%s);
};
})();
"""
_REMOVE_PERSIST = """
(() => {
window.__persistCalls = 0;
StorageManager.prototype.persist = function () {
window.__persistCalls += 1;
};
delete StorageManager.prototype.persist;
})();
"""
def test_persist_requested_on_startup(page: Page, app_url: str):
"""Startup requests persistent storage exactly once and the app boots."""
page.add_init_script(_STUB_PERSIST_TEMPLATE % "true")
page.goto(app_url)
page.wait_for_function(_DB_READY, timeout=30000)
assert page.evaluate("window.__persistCalls") == 1
def test_app_boots_when_persist_denied(page: Page, app_url: str):
"""A denied persistent-storage request does not block startup."""
page.add_init_script(_STUB_PERSIST_TEMPLATE % "false")
page.goto(app_url)
page.wait_for_function(_DB_READY, timeout=30000)
assert page.evaluate("window.__persistCalls") == 1
def test_app_boots_without_persist_api(page: Page, app_url: str):
"""Browsers without navigator.storage.persist still boot normally."""
page.add_init_script(_REMOVE_PERSIST)
page.goto(app_url)
page.wait_for_function(_DB_READY, timeout=30000)
assert page.evaluate("window.__persistCalls") == 0