import time import requests from tests.conftest import BASE_URL from devplacepy.database import get_table DEFAULT_MAINTENANCE_MESSAGE = "DevPlace is undergoing scheduled maintenance. Please check back shortly." OPERATIONAL_FIELDS = ( "rate_limit_per_minute", "rate_limit_window_seconds", "news_service_interval", "session_max_age_days", "session_remember_days", "registration_open", "maintenance_mode", "maintenance_message", ) def _save_settings(page, **fields): page.goto(f"{BASE_URL}/admin/settings", wait_until="domcontentloaded") for name, value in fields.items(): locator = page.locator(f"#{name}") tag = locator.evaluate("el => el.tagName.toLowerCase()") if tag == "select": page.select_option(f"#{name}", value) else: locator.fill(value) page.click("button:has-text('Save Settings')") page.wait_for_url("**/admin/settings", wait_until="domcontentloaded") def test_operational_fields_render(alice): page, _ = alice page.goto(f"{BASE_URL}/admin/settings", wait_until="domcontentloaded") assert page.is_visible("text=Operational") for field in OPERATIONAL_FIELDS: assert page.is_visible(f"#{field}"), field def test_operational_settings_persist(alice): page, _ = alice try: _save_settings( page, news_service_interval="1800", session_remember_days="14", maintenance_message="Custom maintenance text", ) assert page.locator("#news_service_interval").input_value() == "1800" assert page.locator("#session_remember_days").input_value() == "14" assert page.locator("#maintenance_message").input_value() == "Custom maintenance text" finally: _save_settings( page, news_service_interval="3600", session_remember_days="30", maintenance_message=DEFAULT_MAINTENANCE_MESSAGE, ) def test_maintenance_mode_blocks_guests(alice): page, _ = alice try: _save_settings(page, maintenance_mode="1", maintenance_message="Down for tests") response = requests.get(f"{BASE_URL}/feed") assert response.status_code == 503 assert "Down for tests" in response.text finally: _save_settings(page, maintenance_mode="0", maintenance_message=DEFAULT_MAINTENANCE_MESSAGE) def test_maintenance_mode_admin_retains_access(alice): page, _ = alice try: _save_settings(page, maintenance_mode="1") page.goto(f"{BASE_URL}/admin/settings", wait_until="domcontentloaded") assert page.is_visible("#maintenance_mode") login = requests.get(f"{BASE_URL}/auth/login") assert login.status_code == 200 finally: _save_settings(page, maintenance_mode="0") def test_registration_closed_blocks_signup(alice): page, _ = alice try: _save_settings(page, registration_open="0") signup_page = requests.get(f"{BASE_URL}/auth/signup") assert signup_page.status_code == 200 assert "Registration is currently closed" in signup_page.text attempt = requests.post( f"{BASE_URL}/auth/signup", data={ "username": "closed_signup", "email": "closed_signup@test.devplace", "password": "secret123", "confirm_password": "secret123", }, ) assert "Registration is currently closed" in attempt.text assert get_table("users").find_one(username="closed_signup") is None finally: _save_settings(page, registration_open="1") def test_registration_open_allows_signup(alice): page, _ = alice _save_settings(page, registration_open="1") signup_page = requests.get(f"{BASE_URL}/auth/signup") assert "Registration is currently closed" not in signup_page.text assert 'name="username"' in signup_page.text def test_session_length_setting_applies(alice, browser): page, _ = alice context = browser.new_context(viewport={"width": 1400, "height": 900}) guest = context.new_page() guest.set_default_timeout(15000) try: _save_settings(page, session_max_age_days="1") username = f"sesslen_{int(time.time() * 1000)}" guest.goto(f"{BASE_URL}/auth/signup", wait_until="domcontentloaded") guest.fill("#username", username) guest.fill("#email", f"{username}@test.devplace") guest.fill("#password", "secret123") guest.fill("#confirm_password", "secret123") guest.click("button:has-text('Create account')") guest.wait_for_url("**/feed", wait_until="domcontentloaded") session_cookie = next(c for c in context.cookies() if c["name"] == "session") remaining = session_cookie["expires"] - time.time() assert 0 < remaining < 2 * 86400, remaining finally: guest.close() context.close() _save_settings(page, session_max_age_days="7")