94 lines
4.5 KiB
Python
94 lines
4.5 KiB
Python
import pytest
|
|
import uuid
|
|
from sqlalchemy.orm import Session
|
|
from agentops.opsboard.models import AuthUserModel, UserModel
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
async def auth_user(orm_session: Session, test_user: UserModel) -> AuthUserModel:
|
|
"""Get the auth user corresponding to the test user."""
|
|
# Get the auth user that corresponds to our test user
|
|
auth_user = orm_session.get(AuthUserModel, test_user.id)
|
|
|
|
if not auth_user:
|
|
# This should not happen with proper test setup since auth users should be seeded
|
|
raise RuntimeError(f"No auth user found for test user ID {test_user.id}. Check seed data.")
|
|
|
|
return auth_user
|
|
|
|
|
|
class TestAuthUserModel:
|
|
"""Test cases for the AuthUserModel."""
|
|
|
|
async def test_auth_user_creation(self, auth_user: AuthUserModel):
|
|
"""Test that AuthUserModel can be created successfully."""
|
|
assert auth_user.id is not None
|
|
assert auth_user.email == "test@example.com" # Matches the seeded auth user email
|
|
assert str(auth_user.id) == "00000000-0000-0000-0000-000000000000" # From test_user fixture
|
|
|
|
async def test_auth_user_model_table_schema(self, auth_user: AuthUserModel):
|
|
"""Test that AuthUserModel maps to correct table and schema."""
|
|
assert auth_user.__tablename__ == "users"
|
|
assert auth_user.__table_args__["schema"] == "auth"
|
|
|
|
async def test_billing_email_property_with_auth_user(self, orm_session: Session, test_user: UserModel):
|
|
"""Test that billing_email property returns email from auth.users table."""
|
|
# Refresh the user to ensure the relationship is loaded
|
|
orm_session.refresh(test_user)
|
|
|
|
# The billing_email should come from auth.users, not public.users
|
|
# Note: The actual auth email will depend on what's seeded for this test user ID
|
|
assert test_user.billing_email is not None # Should have an auth email
|
|
assert test_user.email == "test@example.com" # From test_user fixture
|
|
# If auth email is different from public email, test that
|
|
if test_user.billing_email != test_user.email:
|
|
assert test_user.billing_email != test_user.email
|
|
|
|
async def test_billing_email_property_without_auth_user(self, orm_session: Session, test_user: UserModel):
|
|
"""Test billing_email property when auth user has null email."""
|
|
# Get the auth user and temporarily modify its email to None for testing
|
|
auth_user = test_user.auth_user
|
|
original_email = auth_user.email
|
|
|
|
try:
|
|
# Temporarily modify the auth user's email in memory only (not persisted)
|
|
# This simulates the case where auth.users.email is NULL
|
|
object.__setattr__(auth_user, 'email', None)
|
|
|
|
# billing_email should return None when auth email is null
|
|
assert test_user.billing_email is None
|
|
assert test_user.email == "test@example.com" # public email remains from fixture
|
|
|
|
finally:
|
|
# Restore original email
|
|
object.__setattr__(auth_user, 'email', original_email)
|
|
|
|
async def test_auth_user_relationship_lazy_loading(self, orm_session: Session, test_user: UserModel):
|
|
"""Test that the auth_user relationship works with lazy loading."""
|
|
# Get user without explicitly loading auth_user relationship
|
|
user = orm_session.get(UserModel, test_user.id)
|
|
|
|
# Accessing auth_user should trigger lazy load
|
|
assert user.auth_user is not None
|
|
# The auth email should exist (specific value depends on seed data)
|
|
assert user.auth_user.email is not None
|
|
|
|
async def test_auth_user_model_columns(self, auth_user: AuthUserModel):
|
|
"""Test that AuthUserModel has the expected columns."""
|
|
# Check that the model has the basic columns we expect
|
|
assert hasattr(auth_user, 'id')
|
|
assert hasattr(auth_user, 'email')
|
|
assert hasattr(auth_user, 'created_at')
|
|
|
|
# Verify column types are as expected
|
|
assert isinstance(auth_user.id, uuid.UUID)
|
|
assert isinstance(auth_user.email, str)
|
|
|
|
async def test_auth_user_model_read_only(self, auth_user: AuthUserModel):
|
|
"""Test that AuthUserModel prevents modifications."""
|
|
# Test that we can read the auth user
|
|
assert auth_user.email is not None
|
|
|
|
# Test that attempting to modify a persistent auth user raises an error
|
|
with pytest.raises(RuntimeError, match="AuthUserModel is read-only"):
|
|
auth_user.email = "modified@example.com" |