feat: email validation

This commit is contained in:
Leon
2025-07-24 13:58:59 +02:00
parent 24e65a8c86
commit 6ff4e817ef
6 changed files with 89 additions and 5 deletions

View File

@@ -1,6 +1,6 @@
from typing import List
from pydantic import BaseModel, ConfigDict, field_validator
from pydantic import BaseModel, ConfigDict, EmailStr, field_validator
from app.core.slug import sanitize_slug
@@ -8,7 +8,7 @@ from app.core.slug import sanitize_slug
class SenderBase(BaseModel):
"""Base schema for a sender."""
email: str
email: EmailStr
class SenderCreate(SenderBase):
@@ -43,13 +43,13 @@ class NewsletterBase(BaseModel):
class NewsletterCreate(NewsletterBase):
"""Schema for creating a new newsletter."""
sender_emails: List[str]
sender_emails: List[EmailStr]
class NewsletterUpdate(NewsletterBase):
"""Schema for updating an existing newsletter."""
sender_emails: List[str]
sender_emails: List[EmailStr]
class Newsletter(NewsletterBase):

View File

@@ -0,0 +1,47 @@
from fastapi.testclient import TestClient
def test_create_newsletter_with_invalid_email(client: TestClient):
"""Test creating a newsletter with an invalid sender email."""
newsletter_data = {
"name": "Invalid Email Test",
"sender_emails": ["not-an-email"],
}
response = client.post("/newsletters", json=newsletter_data)
assert response.status_code == 422 # Unprocessable Entity
data = response.json()
assert "value is not a valid email address" in data["detail"][0]["msg"]
def test_create_newsletter_with_valid_and_invalid_emails(client: TestClient):
"""Test creating a newsletter with a mix of valid and invalid emails."""
newsletter_data = {
"name": "Mixed Emails Test",
"sender_emails": ["valid@example.com", "invalid-email"],
}
response = client.post("/newsletters", json=newsletter_data)
assert response.status_code == 422
data = response.json()
assert data["detail"][0]["loc"] == ["body", "sender_emails", 1]
def test_update_newsletter_with_invalid_email(client: TestClient):
"""Test updating a newsletter with an invalid sender email."""
# First, create a valid newsletter
create_response = client.post(
"/newsletters",
json={
"name": "Update Test",
"sender_emails": ["initial@example.com"],
},
)
assert create_response.status_code == 200
newsletter_id = create_response.json()["id"]
# Now, try to update it with an invalid email
update_data = {
"name": "Updated Name",
"sender_emails": ["not-a-valid-email"],
}
response = client.put(f"/newsletters/{newsletter_id}", json=update_data)
assert response.status_code == 422