Plain is headed towards 1.0! Subscribe for development updates →

 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()