"""/api/order/get_shipping_fee 中"店铺标识"分桶逻辑的单元测试: - 店铺标识优先取 tenpo_cd(与 other_shop_list 一致),未提供时回退取 supplier - 同 tenpo_cd(或同 supplier)视为同一家加盟店,只收一次 800 日元 """ from __future__ import annotations import pytest from app.api.routes.scrape import order_get_shipping_fee from app.models.scrape import OrderItem, OrderShippingFeeRequest @pytest.mark.asyncio async def test_official_only_uses_official_ladder() -> None: request = OrderShippingFeeRequest(item_list=[OrderItem(goods_id="1", goods_number=1, goods_price=800)]) resp = await order_get_shipping_fee(request) assert resp.data.shipping_fee == 440 assert resp.data.goods_amount == 800 @pytest.mark.asyncio async def test_tenpo_cd_groups_same_franchise_store_once() -> None: request = OrderShippingFeeRequest( item_list=[ OrderItem(goods_id="1", goods_number=1, goods_price=1000, tenpo_cd="400451"), OrderItem(goods_id="2", goods_number=1, goods_price=2000, tenpo_cd="400451", branch_number="0003"), ] ) resp = await order_get_shipping_fee(request) assert resp.data.shipping_fee == 800 # 同一 tenpo_cd 只收一次加盟店运费 assert resp.data.goods_amount == 3000 @pytest.mark.asyncio async def test_different_tenpo_cd_charged_separately() -> None: request = OrderShippingFeeRequest( item_list=[ OrderItem(goods_id="1", goods_number=1, goods_price=1000, tenpo_cd="400451"), OrderItem(goods_id="2", goods_number=1, goods_price=1000, tenpo_cd="400999"), ] ) resp = await order_get_shipping_fee(request) assert resp.data.shipping_fee == 1600 # 两家不同加盟店各收 800 @pytest.mark.asyncio async def test_tenpo_cd_takes_precedence_over_supplier() -> None: request = OrderShippingFeeRequest( item_list=[ OrderItem(goods_id="1", goods_number=1, goods_price=1000, supplier="山口大学前店", tenpo_cd="400451"), OrderItem(goods_id="2", goods_number=1, goods_price=1000, supplier="其他名称", tenpo_cd="400451"), ] ) resp = await order_get_shipping_fee(request) assert resp.data.shipping_fee == 800 # 尽管 supplier 文本不同,tenpo_cd 相同仍视为同一家 @pytest.mark.asyncio async def test_falls_back_to_supplier_when_tenpo_cd_missing() -> None: request = OrderShippingFeeRequest( item_list=[ OrderItem(goods_id="1", goods_number=1, goods_price=1000, supplier="老加盟店"), OrderItem(goods_id="2", goods_number=1, goods_price=1000, supplier="老加盟店"), ] ) resp = await order_get_shipping_fee(request) assert resp.data.shipping_fee == 800 # 无 tenpo_cd 时按 supplier 分桶,保持向后兼容