flask_template_codex/tests/settings/test_settings.py
2026-08-08 04:04:24 +02:00

153 lines
4.5 KiB
Python

from pathlib import Path
import pytest
from app.auth.services import create_user
from app.settings.services import update_preferences
from app.tasks.services import configure_focus, create_task
def login(client, email: str) -> None:
client.post(
"/auth/login",
data={"email": email, "password": "secure password"},
)
def settings_data(**overrides):
data = {
"theme": "auto",
"completion_chime": "y",
"notification_frequency": "quiet",
}
data.update(overrides)
return data
def test_settings_require_authentication(client):
response = client.get("/settings/")
assert response.status_code == 302
assert "/auth/login" in response.headers["Location"]
def test_settings_page_explains_inactive_reminders(client, db):
user = create_user("settings_user", "settings@example.com", "secure password")
login(client, user.email)
response = client.get("/settings/")
assert response.status_code == 200
assert b"Browser reminders are not active yet" in response.data
assert b"Steady has not requested browser permission" in response.data
assert b'data-feature-enabled="false"' in response.data
def test_preferences_persist_and_render_on_every_page(client, db):
user = create_user("theme_user", "theme@example.com", "secure password")
login(client, user.email)
response = client.post(
"/settings/",
data=settings_data(
theme="dark",
dyslexia_font="y",
completion_chime="",
notification_frequency="moderate",
),
follow_redirects=True,
)
db.session.refresh(user)
assert b"Preferences saved" in response.data
assert user.theme == "dark"
assert user.dyslexia_font is True
assert user.completion_chime is False
assert user.notification_frequency == "moderate"
assert b'data-theme="dark"' in response.data
assert b'data-dyslexia="true"' in response.data
home = client.get("/")
assert b'data-theme="dark"' in home.data
assert b'data-dyslexia="true"' in home.data
def test_invalid_select_values_do_not_change_preferences(client, db):
user = create_user("invalid_settings", "invalid-settings@example.com", "secure password")
login(client, user.email)
response = client.post(
"/settings/",
data=settings_data(theme="neon", notification_frequency="constant"),
)
db.session.refresh(user)
assert response.status_code == 200
assert b"Preferences saved" not in response.data
assert user.theme == "auto"
assert user.notification_frequency == "quiet"
def test_preferences_are_isolated_between_users(client, db):
first = create_user("first_settings", "first-settings@example.com", "secure password")
second = create_user("second_settings", "second-settings@example.com", "secure password")
login(client, first.email)
client.post(
"/settings/",
data=settings_data(theme="light", notification_frequency="alert"),
)
db.session.refresh(first)
db.session.refresh(second)
assert first.theme == "light"
assert first.notification_frequency == "alert"
assert second.theme == "auto"
assert second.notification_frequency == "quiet"
def test_disabled_chime_reaches_focus_timer_markup(client, db):
user = create_user("quiet_user", "quiet@example.com", "secure password")
update_preferences(
user,
theme="auto",
dyslexia_font=False,
completion_chime=False,
notification_frequency="quiet",
)
task = create_task(
user.id,
title="Quiet focus task",
description=None,
status="not_started",
priority="normal",
due_date=None,
)
configure_focus(task, timer_minutes=5, context=None, chunk_minutes=[])
login(client, user.email)
response = client.get(f"/tasks/{task.id}/focus")
assert b'data-chime="false"' in response.data
def test_settings_service_rejects_unknown_values_without_commit(db):
user = create_user("service_user", "service@example.com", "secure password")
with pytest.raises(ValueError, match="Unknown theme"):
update_preferences(
user,
theme="neon",
dyslexia_font=False,
completion_chime=True,
notification_frequency="quiet",
)
assert user.theme == "auto"
def test_reminder_placeholder_never_requests_permission():
script = Path("app/static/js/main.js").read_text(encoding="utf-8")
assert "requestPermission" not in script
assert ".subscribe(" not in script