116 lines
3.4 KiB
Python
116 lines
3.4 KiB
Python
"""Tests for admin newsletter API endpoints."""
|
|
import pytest
|
|
|
|
from server.app import app
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
with app.test_client() as client:
|
|
yield client
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def setup_admin_creds(monkeypatch):
|
|
monkeypatch.setattr("server.settings.ADMIN_USERNAME", "admin")
|
|
monkeypatch.setattr("server.settings.ADMIN_PASSWORD", "admin")
|
|
|
|
|
|
def test_create_newsletter_requires_login(client):
|
|
"""Test creating newsletter requires login."""
|
|
resp = client.post("/admin/api/newsletters", json={
|
|
"subject": "Test Subject",
|
|
"content": "Test content"
|
|
})
|
|
assert resp.status_code == 302
|
|
assert resp.headers["Location"] == "/auth/login"
|
|
|
|
|
|
def test_create_newsletter_with_login(client):
|
|
"""Test creating newsletter when logged in."""
|
|
# Login first
|
|
client.post("/auth/login", data={"username": "admin", "password": "admin"})
|
|
|
|
# Create newsletter
|
|
resp = client.post("/admin/api/newsletters", json={
|
|
"subject": "Test Subject",
|
|
"content": "Test content",
|
|
"sender_name": "Test Sender"
|
|
})
|
|
assert resp.status_code == 201
|
|
data = resp.get_json()
|
|
assert data["status"] == "ok"
|
|
assert "newsletter_id" in data
|
|
|
|
|
|
def test_create_newsletter_missing_fields(client):
|
|
"""Test creating newsletter with missing required fields."""
|
|
# Login first
|
|
client.post("/auth/login", data={"username": "admin", "password": "admin"})
|
|
|
|
# Try without subject
|
|
resp = client.post("/admin/api/newsletters", json={
|
|
"content": "Test content"
|
|
})
|
|
assert resp.status_code == 400
|
|
data = resp.get_json()
|
|
assert data["status"] == "error"
|
|
assert "required" in data["message"]
|
|
|
|
# Try without content
|
|
resp = client.post("/admin/api/newsletters", json={
|
|
"subject": "Test Subject"
|
|
})
|
|
assert resp.status_code == 400
|
|
data = resp.get_json()
|
|
assert data["status"] == "error"
|
|
assert "required" in data["message"]
|
|
|
|
|
|
def test_get_newsletters_requires_login(client):
|
|
"""Test getting newsletters requires login."""
|
|
resp = client.get("/admin/api/newsletters")
|
|
assert resp.status_code == 302
|
|
assert resp.headers["Location"] == "/auth/login"
|
|
|
|
|
|
def test_get_newsletters_with_login(client):
|
|
"""Test getting newsletters when logged in."""
|
|
# Login first
|
|
client.post("/auth/login", data={"username": "admin", "password": "admin"})
|
|
|
|
# Create a newsletter first
|
|
client.post("/admin/api/newsletters", json={
|
|
"subject": "Test Subject",
|
|
"content": "Test content"
|
|
})
|
|
|
|
# Get newsletters
|
|
resp = client.get("/admin/api/newsletters")
|
|
assert resp.status_code == 200
|
|
data = resp.get_json()
|
|
assert data["status"] == "ok"
|
|
assert "newsletters" in data
|
|
assert "pagination" in data
|
|
assert len(data["newsletters"]) >= 1
|
|
|
|
|
|
def test_send_newsletter_requires_login(client):
|
|
"""Test sending newsletter requires login."""
|
|
resp = client.post("/admin/api/newsletters/1/send")
|
|
assert resp.status_code == 302
|
|
assert resp.headers["Location"] == "/auth/login"
|
|
|
|
|
|
def test_send_newsletter_not_found(client):
|
|
"""Test sending non-existent newsletter."""
|
|
# Login first
|
|
client.post("/auth/login", data={"username": "admin", "password": "admin"})
|
|
|
|
# Try to send non-existent newsletter
|
|
resp = client.post("/admin/api/newsletters/999/send")
|
|
assert resp.status_code == 404
|
|
data = resp.get_json()
|
|
assert data["status"] == "error"
|
|
assert "not found" in data["message"]
|