97 lines
3.3 KiB
Python
97 lines
3.3 KiB
Python
from datetime import datetime
|
|
from fastapi.testclient import TestClient
|
|
from sqlmodel import Session, select
|
|
from models import Vertical, Musician, BandMembership, UserVerticalPreference, PreferenceTier, Notification, NotificationType, Artist
|
|
|
|
def test_create_vertical(client: TestClient, session: Session):
|
|
vertical = Vertical(name="Test Band", slug="test-band")
|
|
session.add(vertical)
|
|
session.commit()
|
|
|
|
response = client.get("/bands/test-band")
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
# The API returns structured data: { "band": {...}, "stats": {...} }
|
|
assert data["band"]["name"] == "Test Band"
|
|
assert data["band"]["slug"] == "test-band"
|
|
|
|
def test_create_musician_and_membership(client: TestClient, session: Session):
|
|
# 1. Setup Artist & Vertical
|
|
artist = Artist(name="The Testers", slug="the-testers-artist")
|
|
session.add(artist)
|
|
session.commit()
|
|
|
|
band = Vertical(name="The Testers", slug="the-testers", primary_artist_id=artist.id)
|
|
session.add(band)
|
|
session.commit()
|
|
|
|
# 2. Setup Musician
|
|
musician = Musician(name="John Doe", slug="john-doe")
|
|
session.add(musician)
|
|
session.commit()
|
|
|
|
# 3. Link them via Artist
|
|
membership = BandMembership(
|
|
musician_id=musician.id,
|
|
artist_id=artist.id,
|
|
role="Guitar",
|
|
start_date=datetime(2020, 1, 1)
|
|
)
|
|
session.add(membership)
|
|
session.commit()
|
|
|
|
# 4. Test API
|
|
response = client.get("/musicians/john-doe")
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["musician"]["name"] == "John Doe"
|
|
assert len(data["bands"]) == 1
|
|
# The 'bands' list in response contains artist_name/slug
|
|
assert data["bands"][0]["artist_name"] == "The Testers"
|
|
|
|
def test_notification_integration(client: TestClient, session: Session, test_user_token: str):
|
|
# 1. Setup Band
|
|
band = Vertical(name="Notify Band", slug="notify-band")
|
|
session.add(band)
|
|
session.commit()
|
|
|
|
# 2. Setup User & Preference
|
|
# We need the user ID. The 'test_user_token' fixture creates a user with email "test@example.com".
|
|
from models import User
|
|
user = session.exec(select(User).where(User.email == "test@example.com")).first()
|
|
assert user is not None
|
|
|
|
pref = UserVerticalPreference(
|
|
user_id=user.id,
|
|
vertical_id=band.id,
|
|
tier=PreferenceTier.HEADLINER,
|
|
notify_on_show=True
|
|
)
|
|
session.add(pref)
|
|
session.commit()
|
|
|
|
# 3. Create Show via API (triggering notification)
|
|
# Ensure venue exists for potential creation
|
|
from models import Venue
|
|
venue = Venue(name="Notify Venue", city="City", country="Country", slug="notify-venue")
|
|
session.add(venue)
|
|
session.commit()
|
|
|
|
response = client.post(
|
|
"/shows/",
|
|
json={
|
|
"date": "2025-01-01T00:00:00",
|
|
"vertical_id": band.id,
|
|
"venue_id": venue.id,
|
|
"slug": "notify-show-1"
|
|
},
|
|
headers={"Authorization": f"Bearer {test_user_token}"}
|
|
)
|
|
|
|
assert response.status_code == 200, f"Response: {response.text}"
|
|
|
|
# 4. Verify Notification
|
|
notes = session.exec(select(Notification).where(Notification.user_id == user.id)).all()
|
|
assert len(notes) > 0, "No notifications found for user"
|
|
assert notes[0].type == NotificationType.SHOW_ALERT
|
|
assert "Notify Band" in notes[0].title
|