LarsHoliday / tests /test_currency_normalization.py
phhttps
feat: enhance scraper reliability, observability and scheduling
5dc68a0
import os
import sys
# Add project root to path
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from deal_ranker import DealRanker
def _deal(name: str, price: float, currency: str = "EUR", fx_rate_to_eur=None):
deal = {
"name": name,
"location": "Amsterdam",
"price_per_night": price,
"currency": currency,
"rating": 4.5,
"reviews": 120,
"pet_friendly": True,
"source": "airbnb",
"url": f"https://example.com/{name.lower().replace(' ', '-')}",
}
if fx_rate_to_eur is not None:
deal["fx_rate_to_eur"] = fx_rate_to_eur
return deal
def test_ranker_normalizes_known_currency_to_eur():
ranker = DealRanker(budget_max=400)
ranked = ranker.rank_deals([_deal("USD Deal", 100, "USD")], nights=2)
assert len(ranked) == 1
item = ranked[0]
assert item["currency"] == "EUR"
assert item["original_currency"] == "USD"
assert item["original_price_per_night"] == 100
assert item["price_per_night"] == 92.0 # 100 * 0.92
assert item["total_cost_for_trip"] == 184.0
def test_ranker_uses_custom_fx_override_when_provided():
ranker = DealRanker(budget_max=400)
ranked = ranker.rank_deals([
_deal("Custom FX Deal", 100, "USD", fx_rate_to_eur=0.5),
], nights=3)
item = ranked[0]
assert item["price_per_night"] == 50.0
assert item["total_cost_for_trip"] == 150.0
def test_ranker_falls_back_to_1_for_unknown_currency():
ranker = DealRanker(budget_max=400)
ranked = ranker.rank_deals([_deal("Unknown FX Deal", 100, "XYZ")], nights=1)
item = ranked[0]
assert item["price_per_night"] == 100.0
assert item["total_cost_for_trip"] == 100.0