-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathconftest.py
More file actions
81 lines (65 loc) · 2.18 KB
/
conftest.py
File metadata and controls
81 lines (65 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import os
from urllib.parse import urlparse
import pytest
from dotenv import load_dotenv
from flask import Flask
from flask.sessions import SecureCookieSessionInterface
from playwright.sync_api import sync_playwright
load_dotenv()
def _build_signed_session_cookie() -> str:
"""Build a Flask session cookie for authenticated Playwright pages."""
secret = os.getenv("FLASK_APP_SECRET_KEY")
if not secret:
raise RuntimeError("FLASK_APP_SECRET_KEY is required for Playwright auth")
app = Flask(__name__)
app.secret_key = secret
serializer = SecureCookieSessionInterface().get_signing_serializer(app)
if serializer is None:
raise RuntimeError("Unable to create Flask session serializer")
session_user = os.getenv("PLAYWRIGHT_AUTH_USER", "user@test.local")
return serializer.dumps({"user": session_user})
def _authed_storage_state(base_url: str) -> dict:
host = urlparse(base_url).hostname or "localhost"
return {
"cookies": [
{
"name": "session",
"value": _build_signed_session_cookie(),
"domain": host,
"path": "/",
"expires": -1,
"httpOnly": True,
"secure": False,
"sameSite": "Lax",
}
],
"origins": [],
}
@pytest.fixture(scope="session")
def base_url():
return "http://localhost:8080/"
@pytest.fixture(scope="session")
def browser():
# Start Playwright
playwright = sync_playwright().start()
# Launch a browser (e.g., Chromium)
browser = playwright.chromium.launch(headless=True, channel="chrome")
yield browser
# Close the browser after tests are done
browser.close()
@pytest.fixture()
def unauthed_page(browser, base_url):
context = browser.new_context(base_url=base_url)
page = context.new_page()
page.set_default_timeout(2500)
yield page
context.close()
@pytest.fixture()
def authed_page(browser, base_url):
context = browser.new_context(
base_url=base_url, storage_state=_authed_storage_state(base_url)
)
page = context.new_page()
page.set_default_timeout(2500)
yield page
context.close()