test_calc.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import pytest
  2. from room_cal._utils import services as _services_list
  3. from room_cal.pricing.calc import (
  4. net_to_list,
  5. list_to_net,
  6. list_to_retail,
  7. retail_to_list,
  8. net_to_retail,
  9. retail_to_net,
  10. )
  11. _SERVICES = _services_list()
  12. _NET = 100.0
  13. @pytest.mark.parametrize('service', _SERVICES)
  14. def test_net_to_list_round_trip(service):
  15. result = list_to_net(service, net_to_list(service, _NET))
  16. assert result == pytest.approx(_NET, abs=0.02)
  17. @pytest.mark.parametrize('service', _SERVICES)
  18. def test_list_to_retail_round_trip(service):
  19. list_price = net_to_list(service, _NET)
  20. result = retail_to_list(service, list_to_retail(service, list_price))
  21. assert result == pytest.approx(list_price, abs=0.02)
  22. @pytest.mark.parametrize('service', _SERVICES)
  23. def test_net_to_retail_round_trip(service):
  24. result = retail_to_net(service, net_to_retail(service, _NET))
  25. assert result == pytest.approx(_NET, abs=0.02)
  26. @pytest.mark.parametrize('service', _SERVICES)
  27. def test_list_exceeds_net(service):
  28. assert net_to_list(service, _NET) > _NET
  29. @pytest.mark.parametrize('service', _SERVICES)
  30. def test_retail_exceeds_list(service):
  31. list_price = net_to_list(service, _NET)
  32. assert list_to_retail(service, list_price) > list_price
  33. @pytest.mark.parametrize('service', _SERVICES)
  34. def test_retail_exceeds_net(service):
  35. assert net_to_retail(service, _NET) > _NET
  36. def test_services_produce_different_list_prices():
  37. prices = {s: net_to_list(s, _NET) for s in _SERVICES}
  38. assert len(set(prices.values())) > 1, "All services returned identical list prices"
  39. def test_invalid_service_raises():
  40. with pytest.raises(ValueError):
  41. net_to_list('nonexistent_service', _NET)
  42. @pytest.mark.parametrize('service', _SERVICES)
  43. def test_monotone_higher_net_gives_higher_list(service):
  44. assert net_to_list(service, 200.0) > net_to_list(service, 100.0)
  45. @pytest.mark.parametrize('service', _SERVICES)
  46. def test_monotone_higher_list_gives_higher_retail(service):
  47. assert list_to_retail(service, 200.0) > list_to_retail(service, 100.0)