153 lines
4.5 KiB
Python
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
|