013 add price multiplier
This commit is contained in:
@@ -85,14 +85,19 @@ def _make_price(provider: str, price: str) -> DeliveryPrice:
|
||||
|
||||
|
||||
def test_get_all_prices_full_success_returns_sorted_and_updates_cache() -> None:
|
||||
provider_a = StubProvider(name="a", response=_make_price("a", "300.00"), cache_ttl_seconds=111)
|
||||
provider_b = StubProvider(name="b", response=_make_price("b", "100.00"), cache_ttl_seconds=222)
|
||||
provider_a = StubProvider(name="a", response=_make_price("a", "300.49"), cache_ttl_seconds=111)
|
||||
provider_b = StubProvider(name="b", response=_make_price("b", "100.40"), cache_ttl_seconds=222)
|
||||
cache = StubCache()
|
||||
service = AggregatorService([provider_a, provider_b], cache=cache)
|
||||
service = AggregatorService(
|
||||
[provider_a, provider_b],
|
||||
cache=cache,
|
||||
provider_price_multiplier=Decimal("1.1"),
|
||||
)
|
||||
|
||||
result = asyncio.run(service.get_all_prices(_make_request()))
|
||||
|
||||
assert [price.provider for price in result] == ["b", "a"]
|
||||
assert [price.price for price in result] == [Decimal("110"), Decimal("331")]
|
||||
assert len(provider_a.calls) == 1
|
||||
assert len(provider_b.calls) == 1
|
||||
assert len(cache.get_calls) == 2
|
||||
@@ -148,15 +153,19 @@ def test_get_all_prices_raises_invalid_request_for_provider_request_errors() ->
|
||||
|
||||
|
||||
def test_get_all_prices_cache_hit_skips_provider_call() -> None:
|
||||
cached_payload = _make_price("cdek", "99.00").model_dump(mode="json")
|
||||
cached_payload = _make_price("cdek", "100.40").model_dump(mode="json")
|
||||
cache = StubCache(forced_get_value=cached_payload)
|
||||
provider = StubProvider(name="cdek", response=_make_price("cdek", "150.00"))
|
||||
service = AggregatorService([provider], cache=cache)
|
||||
service = AggregatorService(
|
||||
[provider],
|
||||
cache=cache,
|
||||
provider_price_multiplier=Decimal("1.1"),
|
||||
)
|
||||
|
||||
result = asyncio.run(service.get_all_prices(_make_request()))
|
||||
|
||||
assert [price.provider for price in result] == ["cdek"]
|
||||
assert result[0].price == Decimal("99.00")
|
||||
assert result[0].price == Decimal("110")
|
||||
assert provider.calls == []
|
||||
assert len(cache.get_calls) == 1
|
||||
assert cache.set_calls == []
|
||||
@@ -166,19 +175,23 @@ def test_get_all_prices_delegates_filtering_and_sorting_to_domain_logic() -> Non
|
||||
provider_a = StubProvider(name="a", response=_make_price("a", "300.00"))
|
||||
provider_b = StubProvider(name="b", response=_make_price("b", "100.00"))
|
||||
delegated_inputs: list[list[DeliveryPrice]] = []
|
||||
delegated_multipliers: list[Decimal] = []
|
||||
|
||||
def fake_filter_and_sort(prices):
|
||||
def fake_filter_and_sort(prices, *, price_multiplier):
|
||||
price_list = list(prices)
|
||||
delegated_inputs.append(price_list)
|
||||
delegated_multipliers.append(price_multiplier)
|
||||
return [price_list[0]]
|
||||
|
||||
service = AggregatorService(
|
||||
[provider_a, provider_b],
|
||||
cache=StubCache(),
|
||||
provider_price_multiplier=Decimal("1.23"),
|
||||
filter_and_sort_prices_fn=fake_filter_and_sort,
|
||||
)
|
||||
|
||||
result = asyncio.run(service.get_all_prices(_make_request()))
|
||||
|
||||
assert [price.provider for price in delegated_inputs[0]] == ["a", "b"]
|
||||
assert delegated_multipliers == [Decimal("1.23")]
|
||||
assert [price.provider for price in result] == ["a"]
|
||||
|
||||
Reference in New Issue
Block a user