import pytest from room_cal._utils import services as _services_list from room_cal.pricing.calc import ( net_to_list, list_to_net, list_to_retail, retail_to_list, net_to_retail, retail_to_net, ) _SERVICES = [s.key for s in _services_list()] _NET = 100.0 @pytest.mark.parametrize('service', _SERVICES) def test_net_to_list_round_trip(service): result = list_to_net(service, net_to_list(service, _NET)) assert result == pytest.approx(_NET, abs=0.02) @pytest.mark.parametrize('service', _SERVICES) def test_list_to_retail_round_trip(service): list_price = net_to_list(service, _NET) result = retail_to_list(service, list_to_retail(service, list_price)) assert result == pytest.approx(list_price, abs=0.02) @pytest.mark.parametrize('service', _SERVICES) def test_net_to_retail_round_trip(service): result = retail_to_net(service, net_to_retail(service, _NET)) assert result == pytest.approx(_NET, abs=0.02) @pytest.mark.parametrize('service', _SERVICES) def test_list_exceeds_net(service): assert net_to_list(service, _NET) > _NET @pytest.mark.parametrize('service', _SERVICES) def test_retail_exceeds_list(service): list_price = net_to_list(service, _NET) assert list_to_retail(service, list_price) > list_price @pytest.mark.parametrize('service', _SERVICES) def test_retail_exceeds_net(service): assert net_to_retail(service, _NET) > _NET def test_services_produce_different_list_prices(): prices = {s: net_to_list(s, _NET) for s in _SERVICES} assert len(set(prices.values())) > 1, "All services returned identical list prices" def test_invalid_service_raises(): with pytest.raises(ValueError): net_to_list('nonexistent_service', _NET) @pytest.mark.parametrize('service', _SERVICES) def test_monotone_higher_net_gives_higher_list(service): assert net_to_list(service, 200.0) > net_to_list(service, 100.0) @pytest.mark.parametrize('service', _SERVICES) def test_monotone_higher_list_gives_higher_retail(service): assert list_to_retail(service, 200.0) > list_to_retail(service, 100.0)