/// A failing account's backoff grows over hours before its caps apply, far
/// past what an E2E poll can wait for.
import albedo/daemon/quota.{Settings}
import gleam/list
import gleeunit/should

fn waits(settings: quota.Settings, failures: List(Int)) -> List(Int) {
  list.map(failures, quota.wait_seconds(settings, _, False))
}

pub fn a_healthy_account_keeps_its_cadence_test() -> Nil {
  let settings = Settings(600, 120, True)
  quota.wait_seconds(settings, 0, False) |> should.equal(600)
  quota.wait_seconds(settings, 0, True) |> should.equal(120)
}

pub fn failures_double_the_wait_whether_or_not_the_account_is_busy_test() -> Nil {
  let settings = Settings(10, 5, True)
  waits(settings, [1, 2, 3]) |> should.equal([20, 40, 80])
  quota.wait_seconds(settings, 1, True) |> should.equal(20)
}

pub fn the_backoff_stops_doubling_after_six_failures_test() -> Nil {
  waits(Settings(10, 5, True), [6, 7, 50]) |> should.equal([640, 640, 640])
}

pub fn the_backoff_never_waits_past_an_hour_test() -> Nil {
  waits(Settings(600, 120, True), [1, 2, 3, 6])
  |> should.equal([1200, 2400, 3600, 3600])
}
