feat(generator): торговые события — корзина, покупка, сырой ecommerce
- Зачем:
- клиентская сторона мира становится целой: без add_to_cart и purchase
в данных нет ни таксономии событий, ни вложенного JSON, ни денег,
а метка «покупатель» из плана состава ни на что не влияла (#40).
- Что:
- добавлен модуль commerce: корзина шире заказа, номер заказа вида
ГГГГММДД-NNNN, промокод без скидки в сумме, сырой ecommerce через orjson;
- метка покупателя получила два рычага — долгую жизнь куки в плане и
свою воронку в дне; CART_PERCENT опущен с 8 до 6, чтобы конверсия
мира осталась около 2%;
- часть цен каталога получила копейки: productPrice округляется форматом,
purchaseRevenue несёт точную сумму — расхождение живёт внутри события;
- граница суток забирает страницу подтверждения вместе с её покупкой:
потерь на клиентской стороне этот этап не заводит;
- решения и перемеренные числа мира записаны в спеку генератора, §9.
- Проверка:
- make lint && make typecheck && make test — 383 passed (было 353).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -54,6 +54,18 @@ def test_every_row_is_filled_and_priced_in_whole_kopecks():
|
||||
assert low <= int(row["price"]) <= high, row["sku"]
|
||||
|
||||
|
||||
def test_part_of_the_prices_carry_kopecks():
|
||||
"""Без копеек урок про Float64 беспредметен: округлять было бы нечего.
|
||||
|
||||
Сторожится не доля, а то, на чём стоит урок: цены бывают и кратные
|
||||
рублю, и с копейками — тогда `productPrice` округляется форматом, а
|
||||
`purchaseRevenue` несёт точную сумму.
|
||||
"""
|
||||
kopecks = [int(row["price"]) % 100 for row in rows()]
|
||||
assert any(rest for rest in kopecks)
|
||||
assert any(not rest for rest in kopecks)
|
||||
|
||||
|
||||
def test_every_category_of_the_assortment_is_covered():
|
||||
"""Каталог покрывает ассортимент целиком: пустых категорий не бывает."""
|
||||
present = {row["category"] for row in rows()}
|
||||
|
||||
Reference in New Issue
Block a user