Files
Other.NF_Hotel-dataanalysis…/tests/conftest.py
T
Tirsvad 225d28feb7 Initial project setup: NF Hotel Data Analysis API
- Add project structure with domain-driven design organization
- Implement FastAPI endpoints for hotel booking reports
- Add data cleaning, statistics, and LLM report generation services
- Include configuration management and security utilities
- Add repository layer for bookings and metadata access
- Setup testing framework with conftest.py
- Include example files and documentation
2026-09-21 13:17:49 +08:00

115 lines
4.0 KiB
Python

import os
# Force (not setdefault): an API_KEY already set in the shell/IDE/.env must not
# leak into the tests, or the authenticated API tests fail with 401.
os.environ["API_KEY"] = "test-api-key"
import pandas as pd
import pytest
from nf_hotel_api.domain.metadata import HotelMetadata, RoomType
@pytest.fixture
def dirty_bookings_df() -> pd.DataFrame:
"""A small, deliberately messy DataFrame exercising every cleaning rule."""
return pd.DataFrame(
[
{
"booking_id": 1,
"hotel": "NF Hotel",
"is_canceled": 0,
"lead_time": "10",
"arrival_date_week_number": 1,
"booking_date": "2024-01-01",
"arrival_date": "2024-02-01",
"arrival_date_day_of_month": 1,
"stays_in_weekend_nights": 1,
"stays_in_week_nights": 2,
"adults": 2,
"children": 0,
"babies": 0,
"meal": "BB",
"country": "Portugal",
"market_segment": "Direct",
"is_repeated_guest": 0,
"previous_cancellations": 0,
"assigned_room_type": "A",
"booking_changes": 0,
"deposit_type": "No Deposit",
"agent": 0,
"customer_type": "Contract (Single)",
"required_car_parking_spaces": 0,
"total_of_special_requests": 0,
},
{
# Exact duplicate of booking 1 except the id -> must be removed.
"booking_id": 2,
"hotel": "NF Hotel",
"is_canceled": 0,
"lead_time": "10",
"arrival_date_week_number": 1,
"booking_date": "2024-01-01",
"arrival_date": "2024-02-01",
"arrival_date_day_of_month": 1,
"stays_in_weekend_nights": 1,
"stays_in_week_nights": 2,
"adults": 2,
"children": 0,
"babies": 0,
"meal": "BB",
"country": "Portugal",
"market_segment": "Direct",
"is_repeated_guest": 0,
"previous_cancellations": 0,
"assigned_room_type": "A",
"booking_changes": 0,
"deposit_type": "No Deposit",
"agent": 0,
"customer_type": "Contract (Single)",
"required_car_parking_spaces": 0,
"total_of_special_requests": 0,
},
{
# Wrong/empty data: bogus adults count, blank meal, zero guests overall.
"booking_id": 3,
"hotel": "NF Hotel",
"is_canceled": 1,
"lead_time": -5,
"arrival_date_week_number": 2,
"booking_date": "2024-01-05",
"arrival_date": "not-a-date",
"arrival_date_day_of_month": 5,
"stays_in_weekend_nights": 0,
"stays_in_week_nights": 1,
"adults": 55,
"children": 0,
"babies": 0,
"meal": "",
"country": "Unknown",
"market_segment": "Groups",
"is_repeated_guest": 0,
"previous_cancellations": 0,
"assigned_room_type": "C",
"booking_changes": 0,
"deposit_type": "Non Refund",
"agent": 9,
"customer_type": "Group Contract",
"required_car_parking_spaces": 0,
"total_of_special_requests": 1,
},
]
)
@pytest.fixture
def hotel_metadata() -> HotelMetadata:
return HotelMetadata(
hotel="NF Hotel",
currency="USD",
room_types={
"A": RoomType(size="Small", standard_price_per_night=20, room_count=10),
"B": RoomType(size="Large", standard_price_per_night=25, room_count=5),
},
)