import pytest from django.core import signing from apps.newsletter.models import NewsletterSubscription @pytest.mark.django_db def test_subscribe_ok(client): resp = client.post("/newsletter/subscribe/", {"email": "a@example.com", "source": "nav"}) assert resp.status_code == 200 assert resp.json()["status"] == "ok" assert NewsletterSubscription.objects.filter(email="a@example.com").exists() @pytest.mark.django_db def test_subscribe_sends_confirmation_email(client, mailoutbox): resp = client.post("/newsletter/subscribe/", {"email": "new@example.com", "source": "nav"}) assert resp.status_code == 200 assert len(mailoutbox) == 1 assert "Confirm your No Hype AI newsletter subscription" in mailoutbox[0].subject @pytest.mark.django_db def test_duplicate_subscribe_returns_ok_without_extra_email(client, mailoutbox): client.post("/newsletter/subscribe/", {"email": "dupe@example.com", "source": "nav"}) assert len(mailoutbox) == 1 resp = client.post("/newsletter/subscribe/", {"email": "dupe@example.com", "source": "footer"}) assert resp.status_code == 200 assert resp.json()["status"] == "ok" assert len(mailoutbox) == 1 @pytest.mark.django_db def test_subscribe_invalid(client): resp = client.post("/newsletter/subscribe/", {"email": "bad"}) assert resp.status_code == 400 @pytest.mark.django_db def test_confirm_endpoint(client): sub = NewsletterSubscription.objects.create(email="b@example.com") token = signing.dumps(sub.email, salt="newsletter-confirm") resp = client.get(f"/newsletter/confirm/{token}/") assert resp.status_code == 302 sub.refresh_from_db() assert sub.confirmed is True @pytest.mark.django_db def test_confirm_endpoint_with_expired_token(client, monkeypatch): sub = NewsletterSubscription.objects.create(email="c@example.com") token = signing.dumps(sub.email, salt="newsletter-confirm") monkeypatch.setattr("apps.newsletter.views.CONFIRMATION_TOKEN_MAX_AGE_SECONDS", -1) resp = client.get(f"/newsletter/confirm/{token}/") assert resp.status_code == 404