133 lines
4.0 KiB
Python
133 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
from datetime import datetime, timedelta
|
|
|
|
import pytest
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
|
|
from app.models import Base, Event, EventAttendee, Team, TeamMembership, User
|
|
from app.views.admin import (
|
|
get_event_statistics,
|
|
get_system_health,
|
|
get_team_statistics,
|
|
get_user_statistics,
|
|
)
|
|
|
|
|
|
@pytest.fixture()
|
|
def db_session():
|
|
engine = create_engine("sqlite:///:memory:")
|
|
Base.metadata.create_all(bind=engine)
|
|
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
db = TestingSessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
def seed_users(db):
|
|
now = datetime.utcnow()
|
|
users = [
|
|
User(
|
|
username="admin",
|
|
email="admin@example.com",
|
|
hashed_password="hash",
|
|
is_active=True,
|
|
is_verified=True,
|
|
is_admin=True,
|
|
created_at=now - timedelta(days=2),
|
|
),
|
|
User(
|
|
username="verified",
|
|
email="verified@example.com",
|
|
hashed_password="hash",
|
|
is_active=True,
|
|
is_verified=True,
|
|
is_admin=False,
|
|
created_at=now - timedelta(days=10),
|
|
),
|
|
User(
|
|
username="inactive",
|
|
email="inactive@example.com",
|
|
hashed_password="hash",
|
|
is_active=False,
|
|
is_verified=False,
|
|
is_admin=False,
|
|
created_at=now - timedelta(days=60),
|
|
),
|
|
]
|
|
db.add_all(users)
|
|
db.commit()
|
|
return users
|
|
|
|
|
|
def test_get_user_statistics(db_session):
|
|
seed_users(db_session)
|
|
|
|
stats = get_user_statistics(db_session)
|
|
|
|
assert stats["total_users"] == 3
|
|
assert stats["active_users"] == 2
|
|
assert stats["verified_users"] == 2
|
|
assert stats["admin_users"] == 1
|
|
assert stats["new_registrations_30d"] == 2
|
|
assert len(stats["monthly_registrations"]) == 6
|
|
assert len(stats["month_labels"]) == 6
|
|
|
|
|
|
def test_get_team_statistics(db_session):
|
|
users = seed_users(db_session)
|
|
teams = [
|
|
Team(name="Open Team", is_active=True, is_public=True),
|
|
Team(name="Private Team", is_active=True, is_public=False),
|
|
Team(name="Archived Team", is_active=False, is_public=False),
|
|
]
|
|
db_session.add_all(teams)
|
|
db_session.commit()
|
|
db_session.add_all([
|
|
TeamMembership(user_id=users[0].id, team_id=teams[0].id),
|
|
TeamMembership(user_id=users[1].id, team_id=teams[0].id),
|
|
TeamMembership(user_id=users[2].id, team_id=teams[1].id),
|
|
])
|
|
db_session.commit()
|
|
|
|
stats = get_team_statistics(db_session)
|
|
|
|
assert stats["total_teams"] == 3
|
|
assert stats["active_teams"] == 2
|
|
assert stats["public_teams"] == 1
|
|
assert {"member_count": 2, "count": 1} in stats["team_distribution"]
|
|
assert {"member_count": 1, "count": 1} in stats["team_distribution"]
|
|
|
|
|
|
def test_get_event_statistics(db_session):
|
|
users = seed_users(db_session)
|
|
now = datetime.now()
|
|
past_event = Event(name="Past Quiz", event_date=now - timedelta(days=1))
|
|
future_event = Event(name="Future Quiz", event_date=now + timedelta(days=7))
|
|
db_session.add_all([past_event, future_event])
|
|
db_session.commit()
|
|
db_session.add_all([
|
|
EventAttendee(event_id=past_event.id, user_id=users[0].id),
|
|
EventAttendee(event_id=past_event.id, user_id=users[1].id),
|
|
])
|
|
db_session.commit()
|
|
|
|
stats = get_event_statistics(db_session)
|
|
|
|
assert stats["total_events"] == 2
|
|
assert stats["past_events"] == 1
|
|
assert stats["upcoming_events_count"] == 1
|
|
assert [event.name for event in stats["upcoming_events"]] == ["Future Quiz"]
|
|
assert stats["attendance_rates"][0].event_name == "Past Quiz"
|
|
assert stats["attendance_rates"][0].attendee_count == 2
|
|
|
|
|
|
def test_get_system_health(db_session):
|
|
health_info = get_system_health(db_session)
|
|
|
|
assert health_info["database_status"] == "online"
|
|
assert "uptime" in health_info
|
|
assert health_info["recent_errors"] == []
|