Remove all authentication (login, sessions, bcrypt, itsdangerous) since the app runs on a private homelab LAN. Replace with a profile picker landing page and cookie-based profile selection (1-year expiry). - Add Alembic migration to drop password_hash/is_admin columns - Delete auth service, auth routes, login template, and auth tests - Rewrite app/utils/auth.py with NoProfileSelectedError and require_active_profile dependency - Add profile creation flow (GET/POST /profiles/create) - Rewrite home page as profile picker with card layout - Update all route files to use profile dependency instead of admin auth - Remove bcrypt and itsdangerous from requirements - Remove admin_username/admin_password from config - Update all tests for new profile-based access model Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
"""Tests for the SeedService class."""
|
|
|
|
from pathlib import Path
|
|
|
|
from sqlmodel import SQLModel, Session, create_engine, select
|
|
|
|
from app.models.user import User
|
|
from app.models.exercise import Exercise
|
|
from app.models.warmup import Warmup
|
|
from app.models.workout_day import WorkoutDay
|
|
from app.models.user_exercise_program import UserExerciseProgram
|
|
from app.services.seed_service import SeedService
|
|
|
|
|
|
class TestSeedService:
|
|
"""Tests for YAML-based database seeding."""
|
|
|
|
def _setup(self):
|
|
"""Create an in-memory DB and seed service."""
|
|
engine = create_engine("sqlite:///:memory:")
|
|
SQLModel.metadata.create_all(engine)
|
|
session = Session(engine)
|
|
# Use the real config files from the project
|
|
config_dir = Path(__file__).resolve().parent.parent / "config"
|
|
service = SeedService(session, config_dir=config_dir)
|
|
return session, service
|
|
|
|
def test_seed_workout_days(self) -> None:
|
|
"""seed_workout_days should create 4 workout day records."""
|
|
session, service = self._setup()
|
|
service.seed_workout_days()
|
|
days = session.exec(select(WorkoutDay)).all()
|
|
assert len(days) == 4
|
|
names = {d.name for d in days}
|
|
assert names == {"Push", "Pull", "Lower", "Full Body"}
|
|
session.close()
|
|
|
|
def test_seed_exercises_from_yaml(self) -> None:
|
|
"""seed_exercises should load all exercises from exercises.yaml."""
|
|
session, service = self._setup()
|
|
service.seed_exercises()
|
|
exercises = session.exec(select(Exercise)).all()
|
|
assert len(exercises) == 20 # 5 Push + 5 Pull + 5 Lower + 5 Full Body
|
|
session.close()
|
|
|
|
def test_seed_warmups_from_yaml(self) -> None:
|
|
"""seed_warmups should load all warmups from exercises.yaml."""
|
|
session, service = self._setup()
|
|
service.seed_warmups()
|
|
warmups = session.exec(select(Warmup)).all()
|
|
assert len(warmups) == 6
|
|
session.close()
|
|
|
|
def test_seed_user_programs(self) -> None:
|
|
"""seed_user_programs should create user profiles and link exercises."""
|
|
session, service = self._setup()
|
|
service.seed_exercises()
|
|
service.seed_user_programs()
|
|
programs = session.exec(select(UserExerciseProgram)).all()
|
|
assert len(programs) > 0
|
|
users = session.exec(select(User)).all()
|
|
assert len(users) == 2 # Phillip and Daughter
|
|
session.close()
|
|
|
|
def test_seed_is_idempotent(self) -> None:
|
|
"""Running seed_all twice should not create duplicate records."""
|
|
session, service = self._setup()
|
|
service.seed_all()
|
|
service.seed_all()
|
|
users = session.exec(select(User)).all()
|
|
exercises = session.exec(select(Exercise)).all()
|
|
# Should not be doubled
|
|
assert len(exercises) == 20
|
|
session.close()
|