Skip to main content
Glama

Hostaway MCP Server

test_bookings.py8.97 kB
"""Unit tests for Booking models. Tests Booking, BookingSearchFilters, PaymentInfo, and enum models. Following TDD: These tests should FAIL until models are implemented. """ from datetime import date, datetime, timezone from decimal import Decimal import pytest from pydantic import ValidationError # T062: Unit tests for bookings models class TestBookingModels: """Test suite for Booking-related Pydantic models.""" def test_booking_creation_with_all_fields(self) -> None: """Test that Booking model can be created with all fields.""" # TODO: Import models once implemented # from src.models.bookings import Booking, PaymentInfo, BookingStatus, PaymentStatus # # booking = Booking( # id=67890, # listing_id=12345, # listing_name="Cozy Downtown Apartment", # guest_id=54321, # guest_name="John Smith", # guest_email="john.smith@example.com", # guest_phone="+1-555-123-4567", # check_in=date(2025, 11, 10), # check_out=date(2025, 11, 13), # num_guests=2, # num_adults=2, # num_children=0, # num_nights=3, # status=BookingStatus.CONFIRMED, # payment=PaymentInfo( # total_price=Decimal("525.00"), # currency="USD", # amount_paid=Decimal("525.00"), # amount_due=Decimal("0.00"), # payment_status=PaymentStatus.PAID, # payment_method="credit_card", # ), # booking_source="airbnb", # confirmation_code="ABCD1234", # created_at=datetime.now(timezone.utc), # special_requests="Early check-in if possible", # ) # # assert booking.id == 67890 # assert booking.guest_name == "John Smith" # assert booking.num_nights == 3 # assert booking.status == BookingStatus.CONFIRMED pass def test_payment_info_model(self) -> None: """Test PaymentInfo model for booking payment details.""" # TODO: Import models once implemented # from src.models.bookings import PaymentInfo, PaymentStatus # # payment = PaymentInfo( # total_price=Decimal("525.00"), # currency="USD", # amount_paid=Decimal("525.00"), # amount_due=Decimal("0.00"), # payment_status=PaymentStatus.PAID, # payment_method="credit_card", # ) # # assert payment.total_price == Decimal("525.00") # assert payment.is_fully_paid is True # assert payment.payment_status == PaymentStatus.PAID pass def test_booking_search_filters_model(self) -> None: """Test BookingSearchFilters model for search criteria.""" # TODO: Import models once implemented # from src.models.bookings import BookingSearchFilters, BookingStatus # # filters = BookingSearchFilters( # listing_id=12345, # check_in_from=date(2025, 11, 1), # check_in_to=date(2025, 11, 30), # status=[BookingStatus.CONFIRMED, BookingStatus.PENDING], # min_guests=2, # limit=50, # offset=0, # ) # # assert filters.listing_id == 12345 # assert filters.limit == 50 # assert BookingStatus.CONFIRMED in filters.status pass def test_booking_status_enum(self) -> None: """Test BookingStatus enum values and methods.""" # TODO: Import models once implemented # from src.models.bookings import BookingStatus # # # Test enum values # assert BookingStatus.CONFIRMED == "confirmed" # assert BookingStatus.PENDING == "pending" # assert BookingStatus.CANCELLED == "cancelled" # # # Test is_active method # assert BookingStatus.CONFIRMED.is_active() is True # assert BookingStatus.PENDING.is_active() is True # assert BookingStatus.CANCELLED.is_active() is False # # # Test is_finalized method # assert BookingStatus.CONFIRMED.is_finalized() is False # assert BookingStatus.COMPLETED.is_finalized() is True # assert BookingStatus.CANCELLED.is_finalized() is True pass def test_payment_status_enum(self) -> None: """Test PaymentStatus enum values and methods.""" # TODO: Import models once implemented # from src.models.bookings import PaymentStatus # # # Test enum values # assert PaymentStatus.PAID == "paid" # assert PaymentStatus.PENDING == "pending" # assert PaymentStatus.PARTIALLY_PAID == "partially_paid" # # # Test is_complete method # assert PaymentStatus.PAID.is_complete() is True # assert PaymentStatus.PARTIALLY_PAID.is_complete() is False # assert PaymentStatus.PENDING.is_complete() is False pass def test_booking_validation_required_fields(self) -> None: """Test that Booking model requires essential fields.""" # TODO: Import models once implemented # from src.models.bookings import Booking # # # Missing required fields should raise ValidationError # with pytest.raises(ValidationError) as exc_info: # Booking(id=67890) # Missing guest_name, dates, etc. # # error_fields = {err["loc"][0] for err in exc_info.value.errors()} # assert "guest_name" in error_fields # assert "check_in" in error_fields # assert "check_out" in error_fields pass def test_payment_info_validation_positive_amounts(self) -> None: """Test that PaymentInfo validates positive amounts.""" # TODO: Import models once implemented # from src.models.bookings import PaymentInfo, PaymentStatus # # with pytest.raises(ValidationError) as exc_info: # PaymentInfo( # total_price=Decimal("-525.00"), # Negative price # currency="USD", # amount_paid=Decimal("0.00"), # amount_due=Decimal("0.00"), # payment_status=PaymentStatus.PENDING, # ) # # assert "total_price" in str(exc_info.value) pass def test_booking_date_properties(self) -> None: """Test Booking model date-related properties.""" # TODO: Import models once implemented # from src.models.bookings import Booking, BookingStatus, PaymentInfo, PaymentStatus # # # Future booking # future_booking = Booking( # id=1, # listing_id=1, # guest_id=1, # guest_name="Test Guest", # guest_email="test@example.com", # check_in=date.today() + timedelta(days=10), # check_out=date.today() + timedelta(days=13), # num_guests=2, # num_nights=3, # status=BookingStatus.CONFIRMED, # payment=PaymentInfo( # total_price=Decimal("300.00"), # payment_status=PaymentStatus.PAID # ), # booking_source="direct", # created_at=datetime.now(timezone.utc), # ) # # assert future_booking.is_upcoming is True # assert future_booking.is_current is False # assert future_booking.is_past is False pass def test_booking_search_filters_validation(self) -> None: """Test BookingSearchFilters validation rules.""" # TODO: Import models once implemented # from src.models.bookings import BookingSearchFilters # # # Test limit validation # with pytest.raises(ValidationError): # BookingSearchFilters(limit=2000) # Exceeds max 1000 # # # Test offset validation # with pytest.raises(ValidationError): # BookingSearchFilters(offset=-1) # Negative offset pass def test_payment_info_is_fully_paid_property(self) -> None: """Test PaymentInfo is_fully_paid property logic.""" # TODO: Import models once implemented # from src.models.bookings import PaymentInfo, PaymentStatus # # # Fully paid # paid = PaymentInfo( # total_price=Decimal("500.00"), # amount_paid=Decimal("500.00"), # amount_due=Decimal("0.00"), # payment_status=PaymentStatus.PAID, # ) # assert paid.is_fully_paid is True # # # Partially paid # partial = PaymentInfo( # total_price=Decimal("500.00"), # amount_paid=Decimal("250.00"), # amount_due=Decimal("250.00"), # payment_status=PaymentStatus.PARTIALLY_PAID, # ) # assert partial.is_fully_paid is False pass

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/darrentmorgan/hostaway-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server