328 lines
11 KiB
Python
328 lines
11 KiB
Python
"""Tests for XML builder helpers."""
|
|
|
|
import pytest
|
|
from xml.etree import ElementTree as ET
|
|
|
|
from tests.helpers.xml_builders import (
|
|
ReservationXMLBuilder,
|
|
MultiReservationXMLBuilder,
|
|
RoomReservationBuilder,
|
|
)
|
|
|
|
|
|
class TestRoomReservationBuilder:
|
|
"""Test RoomReservationBuilder functionality."""
|
|
|
|
def test_basic_room_without_revenue(self):
|
|
"""Test creating a basic room reservation without revenue."""
|
|
builder = RoomReservationBuilder(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-03",
|
|
room_type="DZV",
|
|
room_number="101",
|
|
)
|
|
|
|
elem = builder.build()
|
|
|
|
assert elem.tag == "roomReservation"
|
|
assert elem.get("arrival") == "2025-12-01"
|
|
assert elem.get("departure") == "2025-12-03"
|
|
assert elem.get("roomType") == "DZV"
|
|
assert elem.get("roomNumber") == "101"
|
|
|
|
# Check daily sales - should have 3 entries (12-01, 12-02, 12-03)
|
|
daily_sales = elem.find("dailySales")
|
|
assert daily_sales is not None
|
|
daily_sale_elements = daily_sales.findall("dailySale")
|
|
assert len(daily_sale_elements) == 3
|
|
|
|
# First two should have no revenue attributes
|
|
assert daily_sale_elements[0].get("revenueTotal") is None
|
|
assert daily_sale_elements[0].get("revenueLogis") is None
|
|
|
|
def test_room_with_revenue(self):
|
|
"""Test creating a room with revenue per day."""
|
|
builder = RoomReservationBuilder(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-03",
|
|
room_type="DZV",
|
|
room_number="101",
|
|
revenue_logis_per_day=150.0,
|
|
)
|
|
|
|
elem = builder.build()
|
|
daily_sales = elem.find("dailySales")
|
|
daily_sale_elements = daily_sales.findall("dailySale")
|
|
|
|
# Should have 3 entries total
|
|
assert len(daily_sale_elements) == 3
|
|
|
|
# First two days should have revenue
|
|
assert daily_sale_elements[0].get("revenueTotal") == "150.0"
|
|
assert daily_sale_elements[0].get("revenueLogis") == "150.0"
|
|
assert daily_sale_elements[1].get("revenueTotal") == "150.0"
|
|
assert daily_sale_elements[1].get("revenueLogis") == "150.0"
|
|
|
|
# Departure day should have no revenue
|
|
assert daily_sale_elements[2].get("revenueTotal") is None
|
|
assert daily_sale_elements[2].get("revenueLogis") is None
|
|
|
|
def test_room_with_children_and_infants(self):
|
|
"""Test room with children and infants attributes."""
|
|
builder = RoomReservationBuilder(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-02",
|
|
adults=2,
|
|
children=1,
|
|
infants=1,
|
|
)
|
|
|
|
elem = builder.build()
|
|
assert elem.get("adults") == "2"
|
|
assert elem.get("children") == "1"
|
|
assert elem.get("infants") == "1"
|
|
|
|
|
|
class TestReservationXMLBuilder:
|
|
"""Test ReservationXMLBuilder functionality."""
|
|
|
|
def test_basic_reservation(self):
|
|
"""Test creating a basic reservation with one room."""
|
|
builder = ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12345",
|
|
reservation_number="RES-001",
|
|
reservation_date="2025-11-14",
|
|
)
|
|
builder.set_guest(
|
|
guest_id="guest_001",
|
|
first_name="John",
|
|
last_name="Doe",
|
|
email="john@example.com",
|
|
)
|
|
builder.add_room(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-05",
|
|
revenue_logis_per_day=150.0,
|
|
)
|
|
|
|
xml_string = builder.build_xml()
|
|
|
|
# Parse and verify structure
|
|
root = ET.fromstring(xml_string)
|
|
assert root.tag == "reservations"
|
|
|
|
reservation = root.find("reservation")
|
|
assert reservation is not None
|
|
assert reservation.get("hotelID") == "39054_001"
|
|
assert reservation.get("id") == "12345"
|
|
assert reservation.get("number") == "RES-001"
|
|
|
|
guest = reservation.find("guest")
|
|
assert guest is not None
|
|
assert guest.get("firstName") == "John"
|
|
assert guest.get("lastName") == "Doe"
|
|
assert guest.get("email") == "john@example.com"
|
|
|
|
room_reservations = reservation.find("roomReservations")
|
|
assert room_reservations is not None
|
|
rooms = room_reservations.findall("roomReservation")
|
|
assert len(rooms) == 1
|
|
|
|
def test_reservation_with_multiple_rooms(self):
|
|
"""Test reservation with multiple rooms."""
|
|
builder = ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12345",
|
|
reservation_number="RES-001",
|
|
reservation_date="2025-11-14",
|
|
)
|
|
builder.set_guest(
|
|
guest_id="guest_001",
|
|
first_name="John",
|
|
last_name="Doe",
|
|
email="john@example.com",
|
|
)
|
|
builder.add_room(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-05",
|
|
room_number="101",
|
|
revenue_logis_per_day=150.0,
|
|
)
|
|
builder.add_room(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-05",
|
|
room_number="102",
|
|
revenue_logis_per_day=200.0,
|
|
)
|
|
|
|
xml_string = builder.build_xml()
|
|
root = ET.fromstring(xml_string)
|
|
|
|
reservation = root.find("reservation")
|
|
room_reservations = reservation.find("roomReservations")
|
|
rooms = room_reservations.findall("roomReservation")
|
|
|
|
assert len(rooms) == 2
|
|
assert rooms[0].get("roomNumber") == "101"
|
|
assert rooms[1].get("roomNumber") == "102"
|
|
|
|
def test_reservation_with_advertising_data(self):
|
|
"""Test reservation with advertising campaign data."""
|
|
builder = ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12345",
|
|
reservation_number="RES-001",
|
|
reservation_date="2025-11-14",
|
|
advertising_medium="99TALES",
|
|
advertising_partner="google",
|
|
advertising_campagne="EAIaIQobChMI...",
|
|
)
|
|
builder.set_guest(
|
|
guest_id="guest_001",
|
|
first_name="John",
|
|
last_name="Doe",
|
|
email="john@example.com",
|
|
)
|
|
builder.add_room(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-05",
|
|
)
|
|
|
|
xml_string = builder.build_xml()
|
|
root = ET.fromstring(xml_string)
|
|
|
|
reservation = root.find("reservation")
|
|
assert reservation.get("advertisingMedium") == "99TALES"
|
|
assert reservation.get("advertisingPartner") == "google"
|
|
assert reservation.get("advertisingCampagne") == "EAIaIQobChMI..."
|
|
|
|
|
|
class TestMultiReservationXMLBuilder:
|
|
"""Test MultiReservationXMLBuilder functionality."""
|
|
|
|
def test_multiple_reservations(self):
|
|
"""Test creating XML with multiple reservations."""
|
|
multi_builder = MultiReservationXMLBuilder()
|
|
|
|
# Add first reservation
|
|
res1 = ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12345",
|
|
reservation_number="RES-001",
|
|
reservation_date="2025-11-14",
|
|
)
|
|
res1.set_guest(
|
|
guest_id="guest_001",
|
|
first_name="John",
|
|
last_name="Doe",
|
|
email="john@example.com",
|
|
)
|
|
res1.add_room(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-03",
|
|
revenue_logis_per_day=150.0,
|
|
)
|
|
multi_builder.add_reservation(res1)
|
|
|
|
# Add second reservation
|
|
res2 = ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12346",
|
|
reservation_number="RES-002",
|
|
reservation_date="2025-11-15",
|
|
)
|
|
res2.set_guest(
|
|
guest_id="guest_002",
|
|
first_name="Jane",
|
|
last_name="Smith",
|
|
email="jane@example.com",
|
|
)
|
|
res2.add_room(
|
|
arrival="2025-12-10",
|
|
departure="2025-12-12",
|
|
revenue_logis_per_day=200.0,
|
|
)
|
|
multi_builder.add_reservation(res2)
|
|
|
|
xml_string = multi_builder.build_xml()
|
|
root = ET.fromstring(xml_string)
|
|
|
|
assert root.tag == "reservations"
|
|
reservations = root.findall("reservation")
|
|
assert len(reservations) == 2
|
|
assert reservations[0].get("id") == "12345"
|
|
assert reservations[1].get("id") == "12346"
|
|
|
|
|
|
class TestConvenienceFeatures:
|
|
"""Test convenience features for common test scenarios."""
|
|
|
|
def test_simple_one_liner_reservation(self):
|
|
"""Test creating a simple reservation in a fluent style."""
|
|
xml = (
|
|
ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12345",
|
|
reservation_number="RES-001",
|
|
reservation_date="2025-11-14",
|
|
)
|
|
.set_guest(
|
|
guest_id="guest_001",
|
|
first_name="John",
|
|
last_name="Doe",
|
|
email="john@example.com",
|
|
)
|
|
.add_room(
|
|
arrival="2025-12-01",
|
|
departure="2025-12-05",
|
|
revenue_logis_per_day=160.0,
|
|
)
|
|
.build_xml()
|
|
)
|
|
|
|
assert '<?xml version="1.0" ?>' in xml
|
|
assert 'hotelID="39054_001"' in xml
|
|
assert 'revenueLogis="160.0"' in xml
|
|
|
|
def test_revenue_calculation_for_multi_day_stay(self):
|
|
"""Test that daily sales are correctly generated for multi-day stays."""
|
|
builder = ReservationXMLBuilder(
|
|
hotel_id="39054_001",
|
|
reservation_id="12345",
|
|
reservation_number="RES-001",
|
|
reservation_date="2025-11-14",
|
|
)
|
|
builder.set_guest(
|
|
guest_id="guest_001",
|
|
first_name="John",
|
|
last_name="Doe",
|
|
email="john@example.com",
|
|
)
|
|
# 7-day stay (June 25 - July 2, 7 nights)
|
|
builder.add_room(
|
|
arrival="2026-06-25",
|
|
departure="2026-07-02",
|
|
revenue_logis_per_day=160.0,
|
|
)
|
|
|
|
elem = builder.build()
|
|
room_reservations = elem.find("roomReservations")
|
|
room = room_reservations.find("roomReservation")
|
|
daily_sales = room.find("dailySales")
|
|
daily_sale_elements = daily_sales.findall("dailySale")
|
|
|
|
# Should have 8 daily sale entries (7 nights + departure day)
|
|
assert len(daily_sale_elements) == 8
|
|
|
|
# First 7 should have revenue
|
|
for i in range(7):
|
|
assert daily_sale_elements[i].get("revenueLogis") == "160.0"
|
|
|
|
# Departure day should not have revenue
|
|
assert daily_sale_elements[7].get("revenueLogis") is None
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__, "-v"])
|