OxL Reference

tests/cart_test.oxl

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