arbret/backend/seed_e2e.py
2025-12-26 20:04:46 +01:00

98 lines
3.2 KiB
Python

"""Fast re-seeding function for e2e tests - only seeds essential data."""
import os
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from auth import get_password_hash
from models import (
ROLE_ADMIN,
ROLE_DEFINITIONS,
ROLE_REGULAR,
Role,
User,
)
async def seed_base_data(db: AsyncSession) -> None:
"""
Seed only the minimal data needed for e2e tests:
- Roles (admin, regular) with permissions
- Test users (from env vars)
"""
# Get environment variables with defaults
dev_user_email = os.getenv("DEV_USER_EMAIL", "user@example.com")
dev_user_password = os.getenv("DEV_USER_PASSWORD", "user123")
dev_admin_email = os.getenv("DEV_ADMIN_EMAIL", "admin@example.com")
dev_admin_password = os.getenv("DEV_ADMIN_PASSWORD", "admin123")
# Create roles with permissions
for role_name, role_config in ROLE_DEFINITIONS.items():
result = await db.execute(select(Role).where(Role.name == role_name))
role = result.scalar_one_or_none()
if not role:
role = Role(name=role_name, description=role_config["description"])
db.add(role)
await db.flush() # Get the role ID
# Set permissions for the role
await role.set_permissions(db, role_config["permissions"])
await db.flush() # Ensure roles are committed before creating users
# Get roles for users
admin_role_result = await db.execute(select(Role).where(Role.name == ROLE_ADMIN))
admin_role = admin_role_result.scalar_one()
regular_role_result = await db.execute(
select(Role).where(Role.name == ROLE_REGULAR)
)
regular_role = regular_role_result.scalar_one()
# Create regular dev user
regular_user_result = await db.execute(
select(User).where(User.email == dev_user_email)
)
regular_user = regular_user_result.scalar_one_or_none()
if not regular_user:
regular_user = User(
email=dev_user_email,
hashed_password=get_password_hash(dev_user_password),
roles=[regular_role],
)
db.add(regular_user)
else:
# Update existing user - clear profile fields for test isolation
regular_user.hashed_password = get_password_hash(dev_user_password)
regular_user.roles = [regular_role]
regular_user.contact_email = None
regular_user.telegram = None
regular_user.signal = None
regular_user.nostr_npub = None
# Create admin dev user
admin_user_result = await db.execute(
select(User).where(User.email == dev_admin_email)
)
admin_user = admin_user_result.scalar_one_or_none()
if not admin_user:
admin_user = User(
email=dev_admin_email,
hashed_password=get_password_hash(dev_admin_password),
roles=[admin_role],
)
db.add(admin_user)
else:
# Update existing user - clear profile fields for test isolation
admin_user.hashed_password = get_password_hash(dev_admin_password)
admin_user.roles = [admin_role]
admin_user.contact_email = None
admin_user.telegram = None
admin_user.signal = None
admin_user.nostr_npub = None
await db.commit()