R-002 — Desconto precisa ser menor que o total do checkout

TLDR: discount_amount aceita de 0 até menos que o total do checkout; igual ou maior é inválido, para a base nunca cair a zero.

Given / When / Then

Dado um checkout com total definido, Quando o discount_amount informado é maior ou igual ao total, ou é negativo, Então o checkout é inválido e errors[:discount_amount] é preenchido.

Dado o mesmo checkout, Quando o discount_amount informado é maior ou igual a 0 e menor que o total, Então o checkout é válido.

Tabela de decisão

total discount_amount Válido?
897,00 -1,00 ❌ negativo
897,00 0,00 ✅
897,00 200,00 ✅
897,00 897,00 ❌ igual ao total
897,00 900,00 ❌ maior que o total

Restrições

  • discount_amount é decimal(10,2), default: 0, null: false.
  • A validação cobre o checkout.total, não os totais por tipo de pagamento. Se o total de um checkout_payment_type for menor que o discount_amount, a base daquele tipo cai a 0 e o gateway rejeita o pagamento — essa lacuna é conhecida e não está coberta pela validação.

Teste vinculado

spec/models/checkout_spec.rb — “is invalid when discount_amount is negative” spec/models/checkout_spec.rb — “is invalid when discount_amount is equal to the total” spec/models/checkout_spec.rb — “is invalid when discount_amount is greater than the total” spec/models/checkout_spec.rb — “is valid when discount_amount is lower than the total”

Referências