"""Unit tests for models"""

import pytest
from datetime import datetime
from unittest.mock import MagicMock

from app.models.user import User
from app.models.alert import Alert, AlertSeverity, AlertStatus
from app.models.task import CollectionTask


class TestUserModel:
    """Tests for User model"""

    def test_user_creation(self):
        """Test user model creation"""
        user = User(
            id=1,
            username="testuser",
            email="test@example.com",
            password_hash="hashed_password",
            role="admin",
            is_active=True,
        )
        assert user.id == 1
        assert user.username == "testuser"
        assert user.email == "test@example.com"
        assert user.is_active is True

    def test_user_role_assignment(self):
        """Test user role assignment"""
        user = User(
            username="testuser",
            email="test@example.com",
            password_hash="hashed",
            role="admin",
        )
        assert user.role == "admin"

    def test_user_password_hash(self):
        """Test user password hash attribute"""
        user = User(
            username="testuser",
            email="test@example.com",
            password_hash="hashed_password",
        )
        assert user.password_hash == "hashed_password"


class TestAlertModel:
    """Tests for Alert model"""

    def test_alert_creation(self):
        """Test alert model creation"""
        alert = Alert(
            id=1,
            severity=AlertSeverity.WARNING,
            status=AlertStatus.ACTIVE,
            message="Test alert message",
            datasource_id=1,
            datasource_name="Test Source",
        )
        assert alert.id == 1
        assert alert.severity == AlertSeverity.WARNING
        assert alert.status == AlertStatus.ACTIVE
        assert alert.message == "Test alert message"

    def test_alert_to_dict(self):
        """Test alert to_dict method"""
        alert = Alert(
            id=1,
            severity=AlertSeverity.CRITICAL,
            status=AlertStatus.ACTIVE,
            message="Critical alert",
            datasource_id=2,
            datasource_name="Test Source",
            created_at=datetime(2024, 1, 1, 12, 0, 0),
        )
        result = alert.to_dict()
        assert result["id"] == 1
        assert result["severity"] == "critical"
        assert result["status"] == "active"
        assert result["message"] == "Critical alert"
        assert result["created_at"] == "2024-01-01T12:00:00"

    def test_alert_severity_enum(self):
        """Test alert severity enum values"""
        assert AlertSeverity.CRITICAL.value == "critical"
        assert AlertSeverity.WARNING.value == "warning"
        assert AlertSeverity.INFO.value == "info"

    def test_alert_status_enum(self):
        """Test alert status enum values"""
        assert AlertStatus.ACTIVE.value == "active"
        assert AlertStatus.ACKNOWLEDGED.value == "acknowledged"
        assert AlertStatus.RESOLVED.value == "resolved"


class TestCollectionTaskModel:
    """Tests for CollectionTask model"""

    def test_task_creation(self):
        """Test collection task creation"""
        task = CollectionTask(
            id=1,
            datasource_id=1,
            status="running",
            records_processed=0,
            started_at=datetime.utcnow(),
        )
        assert task.id == 1
        assert task.datasource_id == 1
        assert task.status == "running"

    def test_task_with_records(self):
        """Test collection task with records processed"""
        task = CollectionTask(
            datasource_id=1,
            status="success",
            records_processed=100,
        )
        assert task.records_processed == 100

    def test_task_error_message(self):
        """Test collection task with error message"""
        task = CollectionTask(
            datasource_id=1,
            status="failed",
            error_message="Connection timeout",
        )
        assert task.error_message == "Connection timeout"
