# tests/unit/models/database/test_user.py
"""Unit tests for User database model."""

import pytest
from sqlalchemy.exc import IntegrityError

from app.modules.tenancy.models import User


@pytest.mark.unit
@pytest.mark.database
class TestUserModel:
    """Test User model."""

    def test_user_creation(self, db):
        """Test User model creation and relationships."""
        user = User(
            email="db_test@example.com",
            username="dbtest",
            hashed_password="hashed_password_123",  # noqa: SEC001
            role="store_member",
            is_active=True,
        )

        db.add(user)
        db.commit()
        db.refresh(user)

        assert user.id is not None
        assert user.email == "db_test@example.com"
        assert user.username == "dbtest"
        assert user.role == "store_member"
        assert user.is_active is True
        assert user.created_at is not None
        assert user.updated_at is not None

    def test_user_email_uniqueness(self, db):
        """Test email unique constraint."""
        user1 = User(
            email="unique@example.com",
            username="user1",
            hashed_password="hash1",  # noqa: SEC001
        )
        db.add(user1)
        db.commit()

        # Duplicate email should raise error
        with pytest.raises(IntegrityError):
            user2 = User(
                email="unique@example.com",
                username="user2",
                hashed_password="hash2",  # noqa: SEC001
            )
            db.add(user2)
            db.commit()

    def test_user_username_uniqueness(self, db):
        """Test username unique constraint."""
        user1 = User(
            email="user1@example.com",
            username="sameusername",
            hashed_password="hash1",  # noqa: SEC001
        )
        db.add(user1)
        db.commit()

        # Duplicate username should raise error
        with pytest.raises(IntegrityError):
            user2 = User(
                email="user2@example.com",
                username="sameusername",
                hashed_password="hash2",  # noqa: SEC001
            )
            db.add(user2)
            db.commit()

    def test_user_default_values(self, db):
        """Test User model default values."""
        user = User(
            email="defaults@example.com",
            username="defaultuser",
            hashed_password="hash",  # noqa: SEC001
        )
        db.add(user)
        db.commit()
        db.refresh(user)

        assert user.is_active is True  # Default
        assert user.role == "store_member"  # Default (UserRole.STORE_MEMBER)

    def test_user_optional_fields(self, db):
        """Test User model with optional fields."""
        user = User(
            email="optional@example.com",
            username="optionaluser",
            hashed_password="hash",  # noqa: SEC001
            first_name="John",
            last_name="Doe",
        )
        db.add(user)
        db.commit()
        db.refresh(user)

        assert user.first_name == "John"
        assert user.last_name == "Doe"
