"""
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
