import pytest
from django.contrib.auth import get_user_model
from model_bakery import baker
from activity_logs.models import ActivityLogs
from unittest.mock import patch
from datetime import datetime

Users = get_user_model()

# Create your tests here.
@pytest.mark.django_db()
class TestActivityLogsModel:
    def test_return_str_model_without_user(self):
        activity_log = baker.make(ActivityLogs, user=None, action="Test Action")
        
        assert str(activity_log) == activity_log.action

    def test_return_str_model_with_user(self):
        admin = baker.make(Users, is_staff=True)
        activity_log = baker.make(ActivityLogs, user=admin)
        
        assert (
            str(activity_log)
            == f"{activity_log.user.email} - {activity_log.action}"
        )

@pytest.mark.django_db()
class TestActivityLogsFetch:
    def setup_method(self):
        self.admin = baker.make(Users, first_name="Test Admin", is_staff=True)
        self.activity_log_1 = baker.make(ActivityLogs, user=self.admin)
        self.activity_log_2 = baker.make(ActivityLogs)

    def test_fetch_activity_logs_by_non_admin_return_403(self, authenticate_user):
        api_client = authenticate_user()

        response = api_client.get("/api/activity-logs/")
        
        assert response.status_code == 403

    def test_fetch_activity_logs_by_admin_return_200(self, authenticate_user):
        api_client = authenticate_user(user=self.admin)

        response = api_client.get("/api/activity-logs/")
        
        assert response.status_code == 200
        assert response.data["count"] == 2

    def test_fetch_activity_logs__with_search_by_admin_return_200(self, authenticate_user):
        api_client = authenticate_user(user=self.admin)

        response = api_client.get("/api/activity-logs/?search=admin")
        
        assert response.status_code == 200
        assert response.data["count"] == 1