Files
space-booking/backend/tests/test_google_calendar_service.py
Claude Agent df4031d99c feat: Space Booking System - MVP complet
Sistem web pentru rezervarea de birouri și săli de ședință
cu flux de aprobare administrativă.

Stack: FastAPI + Vue.js 3 + SQLite + TypeScript

Features implementate:
- Autentificare JWT + Self-registration cu email verification
- CRUD Spații, Utilizatori, Settings (Admin)
- Calendar interactiv (FullCalendar) cu drag-and-drop
- Creare rezervări cu validare (durată, program, overlap, max/zi)
- Rezervări recurente (săptămânal)
- Admin: aprobare/respingere/anulare cereri
- Admin: creare directă rezervări (bypass approval)
- Admin: editare orice rezervare
- User: editare/anulare rezervări proprii
- Notificări in-app (bell icon + dropdown)
- Notificări email (async SMTP cu BackgroundTasks)
- Jurnal acțiuni administrative (audit log)
- Rapoarte avansate (utilizare, top users, approval rate)
- Șabloane rezervări (booking templates)
- Atașamente fișiere (upload/download)
- Conflict warnings (verificare disponibilitate real-time)
- Integrare Google Calendar (OAuth2)
- Suport timezone (UTC storage + user preference)
- 225+ teste backend

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 17:51:29 +00:00

154 lines
4.4 KiB
Python

"""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