using FluentAssertions; using foodmarket.Application.Sales; using Xunit; namespace foodmarket.UnitTests; /// Достаточность оплаты розничного чека (логика RetailSalesController.Post). public class RetailPaymentValidatorTests { [Theory] [InlineData(1000, 0, 1000)] // ровно наличными [InlineData(0, 1000, 1000)] // ровно картой [InlineData(600, 400, 1000)] // смешанная оплата, ровно [InlineData(1500, 0, 1000)] // переплата наличными (сдача) — ок [InlineData(700, 700, 1000)] // переплата смешанная — ок public void Sufficient_payment_passes(decimal cash, decimal card, decimal total) => RetailPaymentValidator.IsSufficient(cash, card, total).Should().BeTrue(); [Theory] [InlineData(999, 0, 1000)] // недоплата наличными [InlineData(0, 0, 1000)] // не оплачено вовсе [InlineData(400, 400, 1000)] // смешанная недоплата public void Insufficient_payment_fails(decimal cash, decimal card, decimal total) => RetailPaymentValidator.IsSufficient(cash, card, total).Should().BeFalse(); [Fact] public void Rounds_to_two_decimals_before_comparing() { // 999.999 округляется до 1000.00 ≥ 1000 → ок (защита от float-дрейфа) RetailPaymentValidator.IsSufficient(999.999m, 0m, 1000m).Should().BeTrue(); // 999.994 → 999.99 < 1000 → недоплата RetailPaymentValidator.IsSufficient(999.994m, 0m, 1000m).Should().BeFalse(); } }