1import pytest
2from plain.runtime import settings as plain_settings
3from plain.runtime import setup
4
5from .browser import TestBrowser
6
7
8def pytest_configure(config):
9 # Run Plain setup before anything else
10 setup()
11
12
13@pytest.fixture(autouse=True, scope="session")
14def _allowed_hosts_testserver():
15 # Add testserver to ALLOWED_HOSTS so the test client can make requests
16 plain_settings.ALLOWED_HOSTS = [*plain_settings.ALLOWED_HOSTS, "testserver"]
17
18
19@pytest.fixture
20def settings():
21 class SettingsProxy:
22 def __init__(self):
23 self._original = {}
24
25 def __getattr__(self, name):
26 return getattr(plain_settings, name)
27
28 def __setattr__(self, name, value):
29 if name.startswith("_"):
30 super().__setattr__(name, value)
31 else:
32 if name not in self._original:
33 self._original[name] = getattr(plain_settings, name, None)
34 setattr(plain_settings, name, value)
35
36 def _restore(self):
37 for key, value in self._original.items():
38 setattr(plain_settings, key, value)
39
40 proxy = SettingsProxy()
41 yield proxy
42 proxy._restore()
43
44
45@pytest.fixture
46def testbrowser(browser, request):
47 """Use playwright and pytest-playwright to run browser tests against a test server."""
48 try:
49 # Check if isolated_db fixture is available from the plain-models package.
50 # If it is, then we need to run a server that has a database connection to the isolated database for this test.
51 request.getfixturevalue("isolated_db")
52
53 from plain.models import db_connection
54 from plain.models.database_url import build_database_url
55
56 # Get a database url for the isolated db that we can have gunicorn connect to also.
57 database_url = build_database_url(db_connection.settings_dict)
58 except pytest.FixtureLookupError:
59 # isolated_db fixture not available, use empty database_url
60 database_url = ""
61
62 testbrowser = TestBrowser(browser=browser, database_url=database_url)
63
64 try:
65 testbrowser.run_server()
66 yield testbrowser
67 finally:
68 testbrowser.cleanup_server()