Fixed up the damm tests

This commit is contained in:
Jonas Linter
2025-12-02 15:24:30 +01:00
parent 56d67984cf
commit c0e601e308
4 changed files with 179 additions and 84 deletions

View File

@@ -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,

View File

@@ -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()