- Order records payments: Payments, AmountPaid, Outstanding, IsFullyPaid (parameterless, replaces IsFullyPaid(expectedTotal)) - Pay rejects open orders, non-positive amounts, and overpayments - 4 new OrderCompletion tests assert observable state: PaymentOnOpenOrder_Throws_OrderStillUnpaid, CompletedOrder_PartialPayment_IsNotFullyPaid, CompletedOrder_PaymentsSummingToTotal_IsFullyPaid, Overpayment_Throws_AmountPaidUnchanged - 11 tests green (6 OrderTotal + 5 OrderCompletion)
73 lines
1.8 KiB
C#
73 lines
1.8 KiB
C#
using NUnit.Framework;
|
|
using OrderDomain;
|
|
|
|
namespace OrderTests;
|
|
|
|
public class OrderCompletionTests
|
|
{
|
|
[Test]
|
|
public void CompletedOrder_TotalIsCorrect()
|
|
{
|
|
var order = new Order();
|
|
order.AddLine(100m, 1);
|
|
order.Complete();
|
|
|
|
Assert.That(order.IsCompleted && order.Total == 100m, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void PaymentOnOpenOrder_Throws_OrderStillUnpaid()
|
|
{
|
|
var order = new Order();
|
|
order.AddLine(100m, 1);
|
|
|
|
Assert.Throws<InvalidOperationException>(() => order.Pay(100m));
|
|
|
|
Assert.That(order.IsCompleted, Is.False);
|
|
Assert.That(order.AmountPaid, Is.EqualTo(0m));
|
|
}
|
|
|
|
[Test]
|
|
public void CompletedOrder_PartialPayment_IsNotFullyPaid()
|
|
{
|
|
var order = new Order();
|
|
order.AddLine(100m, 1);
|
|
order.Complete();
|
|
|
|
order.Pay(40m);
|
|
|
|
Assert.That(order.AmountPaid, Is.EqualTo(40m));
|
|
Assert.That(order.Outstanding, Is.EqualTo(60m));
|
|
Assert.That(order.IsFullyPaid, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void CompletedOrder_PaymentsSummingToTotal_IsFullyPaid()
|
|
{
|
|
var order = new Order();
|
|
order.AddLine(100m, 1);
|
|
order.Complete();
|
|
|
|
order.Pay(40m);
|
|
order.Pay(60m);
|
|
|
|
Assert.That(order.Payments, Is.EqualTo(new[] { 40m, 60m }));
|
|
Assert.That(order.Outstanding, Is.EqualTo(0m));
|
|
Assert.That(order.IsFullyPaid, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Overpayment_Throws_AmountPaidUnchanged()
|
|
{
|
|
var order = new Order();
|
|
order.AddLine(100m, 1);
|
|
order.Complete();
|
|
order.Pay(100m);
|
|
|
|
Assert.Throws<InvalidOperationException>(() => order.Pay(10m));
|
|
|
|
Assert.That(order.AmountPaid, Is.EqualTo(100m));
|
|
Assert.That(order.IsFullyPaid, Is.True);
|
|
}
|
|
}
|