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