Fixed up the damm tests
This commit is contained in:
@@ -9,6 +9,43 @@ from typing import Optional
|
||||
from xml.etree import ElementTree as ET
|
||||
|
||||
|
||||
def validate_and_convert_id(field_name: str, value: str | int) -> str:
|
||||
"""Validate that an ID field is convertible to integer and return as string.
|
||||
|
||||
This helper ensures ID fields (like reservation_id, guest_id) are valid integers,
|
||||
which is important since the Pydantic models will convert them from strings to ints.
|
||||
|
||||
Args:
|
||||
field_name: Name of the field for error messages
|
||||
value: The ID value (can be string or int)
|
||||
|
||||
Returns:
|
||||
String representation of the validated integer ID
|
||||
|
||||
Raises:
|
||||
ValueError: If value cannot be converted to a valid positive integer
|
||||
|
||||
"""
|
||||
def _raise_invalid_type_error():
|
||||
"""Raise error for invalid ID type."""
|
||||
msg = (
|
||||
f"{field_name} must be convertible to a positive integer, "
|
||||
f"got: {value!r} (type: {type(value).__name__})"
|
||||
)
|
||||
raise ValueError(msg)
|
||||
|
||||
try:
|
||||
# Convert to int first to validate it's a valid integer
|
||||
int_value = int(value)
|
||||
if int_value <= 0:
|
||||
msg = f"{field_name} must be a positive integer, got: {value}"
|
||||
raise ValueError(msg)
|
||||
# Return as string for XML attributes
|
||||
return str(int_value)
|
||||
except (ValueError, TypeError):
|
||||
_raise_invalid_type_error()
|
||||
|
||||
|
||||
class RoomReservationBuilder:
|
||||
"""Builder for creating roomReservation XML elements with daily sales."""
|
||||
|
||||
@@ -133,7 +170,7 @@ class ReservationXMLBuilder:
|
||||
def __init__(
|
||||
self,
|
||||
hotel_id: str,
|
||||
reservation_id: str,
|
||||
reservation_id: str | int,
|
||||
reservation_number: str,
|
||||
reservation_date: str,
|
||||
creation_time: Optional[str] = None,
|
||||
@@ -146,7 +183,7 @@ class ReservationXMLBuilder:
|
||||
|
||||
Args:
|
||||
hotel_id: Hotel ID
|
||||
reservation_id: Reservation ID
|
||||
reservation_id: Reservation ID (must be convertible to positive integer)
|
||||
reservation_number: Reservation number
|
||||
reservation_date: Reservation date in YYYY-MM-DD format
|
||||
creation_time: Creation timestamp (defaults to reservation_date + T00:00:00)
|
||||
@@ -156,7 +193,7 @@ class ReservationXMLBuilder:
|
||||
advertising_campagne: Advertising campaign
|
||||
"""
|
||||
self.hotel_id = hotel_id
|
||||
self.reservation_id = reservation_id
|
||||
self.reservation_id = validate_and_convert_id("reservation_id", reservation_id)
|
||||
self.reservation_number = reservation_number
|
||||
self.reservation_date = reservation_date
|
||||
self.creation_time = creation_time or f"{reservation_date}T00:00:00"
|
||||
@@ -170,7 +207,7 @@ class ReservationXMLBuilder:
|
||||
|
||||
def set_guest(
|
||||
self,
|
||||
guest_id: str,
|
||||
guest_id: str | int,
|
||||
first_name: str,
|
||||
last_name: str,
|
||||
email: str,
|
||||
@@ -182,7 +219,7 @@ class ReservationXMLBuilder:
|
||||
"""Set guest information for the reservation.
|
||||
|
||||
Args:
|
||||
guest_id: Guest ID
|
||||
guest_id: Guest ID (must be convertible to positive integer)
|
||||
first_name: Guest first name
|
||||
last_name: Guest last name
|
||||
email: Guest email
|
||||
@@ -194,8 +231,9 @@ class ReservationXMLBuilder:
|
||||
Returns:
|
||||
Self for method chaining
|
||||
"""
|
||||
validated_guest_id = validate_and_convert_id("guest_id", guest_id)
|
||||
self.guest_data = {
|
||||
"id": guest_id,
|
||||
"id": validated_guest_id,
|
||||
"firstName": first_name,
|
||||
"lastName": last_name,
|
||||
"email": email,
|
||||
|
||||
@@ -372,13 +372,13 @@ class TestConversionServiceWithImportedData:
|
||||
res1_v1 = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="res_001",
|
||||
reservation_number="RES-001",
|
||||
reservation_id="100",
|
||||
reservation_number="100",
|
||||
reservation_date="2025-11-14",
|
||||
reservation_type="request",
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_001",
|
||||
guest_id="100",
|
||||
first_name="Alice",
|
||||
last_name="Johnson",
|
||||
email="alice@example.com",
|
||||
@@ -397,13 +397,13 @@ class TestConversionServiceWithImportedData:
|
||||
res2_v1 = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="res_002",
|
||||
reservation_number="RES-002",
|
||||
reservation_id="101",
|
||||
reservation_number="101",
|
||||
reservation_date="2025-11-15",
|
||||
reservation_type="reservation",
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_002",
|
||||
guest_id="101",
|
||||
first_name="Bob",
|
||||
last_name="Smith",
|
||||
email="bob@example.com",
|
||||
@@ -446,13 +446,13 @@ class TestConversionServiceWithImportedData:
|
||||
res1_v2 = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="res_001", # Same ID
|
||||
reservation_number="RES-001", # Same number
|
||||
reservation_id="100", # Same ID
|
||||
reservation_number="100", # Same number
|
||||
reservation_date="2025-11-14",
|
||||
reservation_type="reservation", # Changed from request
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_001",
|
||||
guest_id="100",
|
||||
first_name="Alice",
|
||||
last_name="Johnson",
|
||||
email="alice@example.com",
|
||||
@@ -471,13 +471,13 @@ class TestConversionServiceWithImportedData:
|
||||
res2_v2 = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="res_002", # Same ID
|
||||
reservation_number="RES-002", # Same number
|
||||
reservation_id="101", # Same ID
|
||||
reservation_number="101", # Same number
|
||||
reservation_date="2025-11-15",
|
||||
reservation_type="request", # Changed from reservation
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_002",
|
||||
guest_id="101",
|
||||
first_name="Bob",
|
||||
last_name="Smith",
|
||||
email="bob@example.com",
|
||||
@@ -554,12 +554,12 @@ class TestXMLBuilderUsage:
|
||||
xml_content = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="test_123",
|
||||
reservation_number="RES-123",
|
||||
reservation_id="123",
|
||||
reservation_number="123",
|
||||
reservation_date="2025-11-14",
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_001",
|
||||
guest_id="157",
|
||||
first_name="John",
|
||||
last_name="Doe",
|
||||
email="john@example.com",
|
||||
@@ -591,12 +591,12 @@ class TestXMLBuilderUsage:
|
||||
xml_content = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="test_456",
|
||||
reservation_number="RES-456",
|
||||
reservation_id="456",
|
||||
reservation_number="456",
|
||||
reservation_date="2025-11-14",
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_002",
|
||||
guest_id="157",
|
||||
first_name="Jane",
|
||||
last_name="Smith",
|
||||
email="jane@example.com",
|
||||
@@ -634,12 +634,12 @@ class TestXMLBuilderUsage:
|
||||
res1 = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="test_001",
|
||||
reservation_number="RES-001",
|
||||
reservation_id="175",
|
||||
reservation_number="175",
|
||||
reservation_date="2025-11-14",
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_001",
|
||||
guest_id="157",
|
||||
first_name="Alice",
|
||||
last_name="Johnson",
|
||||
email="alice@example.com",
|
||||
@@ -656,12 +656,12 @@ class TestXMLBuilderUsage:
|
||||
res2 = (
|
||||
ReservationXMLBuilder(
|
||||
hotel_id="39054_001",
|
||||
reservation_id="test_002",
|
||||
reservation_id="2725",
|
||||
reservation_number="RES-002",
|
||||
reservation_date="2025-11-15",
|
||||
)
|
||||
.set_guest(
|
||||
guest_id="guest_002",
|
||||
guest_id="2525",
|
||||
first_name="Bob",
|
||||
last_name="Williams",
|
||||
email="bob@example.com",
|
||||
@@ -752,10 +752,12 @@ class TestHashedMatchingLogic:
|
||||
test_db_session.add(reservation)
|
||||
await test_db_session.commit()
|
||||
|
||||
PMS_RESERVATION_ID = 157
|
||||
|
||||
# Create conversion XML with matching hashed data
|
||||
xml_content = """<?xml version="1.0"?>
|
||||
xml_content = f"""<?xml version="1.0"?>
|
||||
<root>
|
||||
<reservation id="pms_123" hotelID="hotel_1" number="RES001" date="2025-01-15">
|
||||
<reservation id="{PMS_RESERVATION_ID}" hotelID="hotel_1" number="378" date="2025-01-15">
|
||||
<guest id="123" firstName="David" lastName="Miller" email="david@example.com"/>
|
||||
<roomReservations>
|
||||
<roomReservation roomNumber="101" arrival="2025-01-15" departure="2025-01-17" status="confirmed">
|
||||
@@ -772,7 +774,9 @@ class TestHashedMatchingLogic:
|
||||
|
||||
# Verify conversion was created
|
||||
result = await test_db_session.execute(
|
||||
select(Conversion).where(Conversion.pms_reservation_id == "pms_123")
|
||||
select(Conversion).where(
|
||||
Conversion.pms_reservation_id == PMS_RESERVATION_ID
|
||||
)
|
||||
)
|
||||
conversion = result.scalar_one_or_none()
|
||||
|
||||
@@ -785,7 +789,7 @@ class TestHashedMatchingLogic:
|
||||
|
||||
result_with_guest = await test_db_session.execute(
|
||||
select(Conversion)
|
||||
.where(Conversion.pms_reservation_id == "pms_123")
|
||||
.where(Conversion.pms_reservation_id == PMS_RESERVATION_ID)
|
||||
.options(selectinload(Conversion.guest))
|
||||
)
|
||||
conversion_with_guest = result_with_guest.scalar_one_or_none()
|
||||
|
||||
Reference in New Issue
Block a user