import pytest from sqlalchemy import text from web.app import app from web.db import ( db_init, create_or_update_user, subscribe_email, list_email_subscriptions, _ensure_session, ) @pytest.fixture(scope="function", autouse=True) def initialize_app(): app.config.update(TESTING=True, WTF_CSRF_ENABLED=False) with app.app_context(): db_init() create_or_update_user("admin", password="secret", is_admin=True, is_active=True) # Clear subscriptions before and after each test to avoid leakage with _ensure_session() as session: session.execute(text("DELETE FROM email_subscriptions")) session.commit() yield with _ensure_session() as session: session.execute(text("DELETE FROM email_subscriptions")) session.commit() @pytest.fixture def client(): with app.test_client() as test_client: with test_client.session_transaction() as sess: sess["username"] = "admin" yield test_client @pytest.fixture def anon_client(): with app.test_client() as test_client: # Ensure no admin session present with test_client.session_transaction() as sess: sess.pop("username", None) yield test_client def test_admin_emails_requires_admin(anon_client): response = anon_client.get("/admin/emails") assert response.status_code == 302 assert "/login" in response.headers.get("Location", "") def test_admin_emails_lists_subscriptions(client): subscribe_email("alice@example.com") response = client.get("/admin/emails") assert response.status_code == 200 assert b"alice@example.com" in response.data def test_admin_emails_can_subscribe(client): response = client.post( "/admin/emails", data={"action": "subscribe", "email": "bob@example.com"}, follow_redirects=False, ) assert response.status_code == 302 emails = list_email_subscriptions() assert any(sub["email"] == "bob@example.com" and sub["is_active"] for sub in emails) def test_admin_emails_can_unsubscribe(client): subscribe_email("carol@example.com") response = client.post( "/admin/emails", data={"action": "unsubscribe", "email": "carol@example.com"}, follow_redirects=False, ) assert response.status_code == 302 emails = list_email_subscriptions() matching = [sub for sub in emails if sub["email"] == "carol@example.com"] assert matching assert matching[0]["is_active"] is False