from unittest.mock import Mock

import pytest

from swarms.telemetry.posthog_utils import (
    log_activity_posthog,
    posthog,
)


# Mock Posthog client
@pytest.fixture
def mock_posthog():
    return Mock()


# Mock environment variables
@pytest.fixture
def mock_env(monkeypatch):
    monkeypatch.setenv("POSTHOG_API_KEY", "test_api_key")
    monkeypatch.setenv("POSTHOG_HOST", "test_host")


# Test the log_activity_posthog decorator
def test_log_activity_posthog(mock_posthog, mock_env):
    event_name = "test_event"
    event_properties = {"test_property": "test_value"}

    # Create a test function with the decorator
    @log_activity_posthog(event_name, **event_properties)
    def test_function():
        pass

    # Call the test function
    test_function()

    # Check if the Posthog capture method was called with the expected arguments
    mock_posthog.capture.assert_called_once_with(
        "test_user_id", event_name, event_properties
    )


# Test a scenario where environment variables are not set
def test_missing_env_variables(monkeypatch):
    # Unset environment variables
    monkeypatch.delenv("POSTHOG_API_KEY", raising=False)
    monkeypatch.delenv("POSTHOG_HOST", raising=False)

    # Create a test function with the decorator
    @log_activity_posthog("test_event", test_property="test_value")
    def test_function():
        pass

    # Ensure that calling the test function does not raise errors
    test_function()


# Test the Posthog client initialization
def test_posthog_client_initialization(mock_env):
    assert posthog.api_key == "test_api_key"
    assert posthog.host == "test_host"
    assert posthog.debug is True