"""Tests for Google Calendar service.""" from unittest.mock import MagicMock, patch import pytest from sqlalchemy.orm import Session from app.models.booking import Booking from app.models.google_calendar_token import GoogleCalendarToken from app.models.space import Space from app.services.google_calendar_service import ( create_calendar_event, delete_calendar_event, get_google_calendar_service, ) @pytest.fixture def mock_google_calendar_token(db: Session) -> GoogleCalendarToken: """Create a mock Google Calendar token.""" token = GoogleCalendarToken( user_id=1, access_token="mock_access_token", refresh_token="mock_refresh_token", token_expiry=None, ) db.add(token) db.commit() db.refresh(token) return token @pytest.fixture def mock_booking(db: Session) -> Booking: """Create a mock booking with space.""" space = Space( name="Test Space", description="Test Description", capacity=10, floor_level=1, building="Test Building", ) db.add(space) db.commit() booking = Booking( user_id=1, space_id=space.id, title="Test Booking", description="Test Description", start_datetime="2024-06-15T10:00:00", end_datetime="2024-06-15T12:00:00", status="approved", ) db.add(booking) db.commit() db.refresh(booking) return booking def test_get_google_calendar_service_no_token(db: Session): """Test get_google_calendar_service with no token.""" service = get_google_calendar_service(db, 999) assert service is None @patch("app.services.google_calendar_service.build") @patch("app.services.google_calendar_service.Credentials") def test_get_google_calendar_service_success( mock_credentials: MagicMock, mock_build: MagicMock, db: Session, mock_google_calendar_token: GoogleCalendarToken, ): """Test successful Google Calendar service creation.""" # Setup mocks mock_creds = MagicMock() mock_creds.expired = False mock_credentials.return_value = mock_creds mock_service = MagicMock() mock_build.return_value = mock_service service = get_google_calendar_service(db, 1) # Verify service was created assert service is not None mock_build.assert_called_once_with("calendar", "v3", credentials=mock_creds) @patch("app.services.google_calendar_service.get_google_calendar_service") def test_create_calendar_event_no_service( mock_get_service: MagicMock, db: Session, mock_booking: Booking ): """Test create_calendar_event with no service.""" mock_get_service.return_value = None event_id = create_calendar_event(db, mock_booking, 1) assert event_id is None @patch("app.services.google_calendar_service.get_google_calendar_service") def test_create_calendar_event_success( mock_get_service: MagicMock, db: Session, mock_booking: Booking ): """Test successful calendar event creation.""" # Setup mock service mock_service = MagicMock() mock_events = MagicMock() mock_insert = MagicMock() mock_execute = MagicMock() mock_service.events.return_value = mock_events mock_events.insert.return_value = mock_insert mock_insert.execute.return_value = {"id": "test_event_id"} mock_get_service.return_value = mock_service event_id = create_calendar_event(db, mock_booking, 1) assert event_id == "test_event_id" mock_events.insert.assert_called_once() @patch("app.services.google_calendar_service.get_google_calendar_service") def test_delete_calendar_event_success(mock_get_service: MagicMock, db: Session): """Test successful calendar event deletion.""" # Setup mock service mock_service = MagicMock() mock_events = MagicMock() mock_delete = MagicMock() mock_service.events.return_value = mock_events mock_events.delete.return_value = mock_delete mock_get_service.return_value = mock_service result = delete_calendar_event(db, "test_event_id", 1) assert result is True mock_events.delete.assert_called_once_with( calendarId="primary", eventId="test_event_id" ) @patch("app.services.google_calendar_service.get_google_calendar_service") def test_delete_calendar_event_no_service(mock_get_service: MagicMock, db: Session): """Test delete_calendar_event with no service.""" mock_get_service.return_value = None result = delete_calendar_event(db, "test_event_id", 1) assert result is False