tests/cart_test.oxl
use super.model { EmptyCart, CartFull, OrderId, NotFound, Sku }
use super.checkout { Shop }
use super.orders { Orders, Stats, relayStats }
use super.config { Features }
use super.limits { PAGE_SIZE }
test "the cart is limited by Features.maxCart" {
asUser(UserId(50)) {
let max = Features.get().maxCart.get()
var i: u32 = 0
while i < max {
Shop.addToCart(testItem("SKU-{i}", 1))!
i += 1
}
assert_fails(Shop.addToCart(testItem("ONE-MORE", 1)), CartFull)
}
}
test "carts of different users are independent" {
asUser(UserId(51)) { Shop.addToCart(testItem("BOOK-1", 1))! }
asUser(UserId(52)) { assert_fails(Shop.checkout(), EmptyCart) }
asUser(UserId(51)) { assert Shop.checkout()!.items.len() == 1 }
}
test "Orders.recent lists own orders, newest first, and pages" {
asUser(UserId(60)) {
var i: u32 = 0
while i < 3 {
Shop.addToCart(testItem("BOOK-{i}", 1))!
Shop.checkout()!
i += 1
}
let first = Orders.recent(0)!
assert first.len() == 3
assert first[0].createdAt >= first[2].createdAt
assert Orders.recent(1)!.len() == 0
}
asUser(UserId(61)) { assert Orders.recent(0)!.len() == 0 }
}
// `checkout` ждёт очистки корзины (V.5, исправлено): следующий запрос не гоняется с ней и видит только новые позиции
test "checkout clears only what it ordered, and the next request sees an up-to-date cart" {
asUser(UserId(63)) {
var i: u32 = 0
while i < 25 {
Shop.addToCart(testItem("BOOK-{i}", 1))!
assert Shop.checkout()!.items.len() == 1
i += 1
}
assert Orders.recent(0)!.len() == 25
}
}
test "Orders.recent needs a user" {
assert_fails(Orders.recent(0), AccessDenied)
}
test "Orders.get finds an order or fails with NotFound" {
asUser(UserId(62)) {
Shop.addToCart(testItem("BOOK-1", 2))!
let o = Shop.checkout()!
assert Orders.get(o.id)!.total == o.total
assert_fails(Orders.get(OrderId(1)), NotFound)
}
}
// Серверный стрим: подписчик получает последнюю опубликованную статистику (replay: 1)
test "liveStats streams statistics" {
asUser(UserId(70)) {
Shop.addToCart(testItem("BOOK-1", 2))!
Shop.checkout()!
}
// как `main` на узле api: подписка на топик → локальный broadcast
node.background.spawn { _ = relayStats() }
Orders.publishStats()!
var seen: List<u64> = []
for await r in Orders.liveStats().results() {
match r {
Shared<Stats> s => seen.push(s.ordersToday)
Lagged _ => seen.push(0)
NetError _ => seen.push(0)
}
if seen.len() == 1 { break }
}
assert seen.len() == 1 && seen[0] >= 1
}
test "refined Sku and quantity" {
assert Sku.from("bad sku") is InvalidValue
assert PAGE_SIZE == 50
}Source: examples/shop/tests/cart_test.oxl