using AccountSample.Domain;
using NUnit.Framework;
using SpecUnit;
namespace AccountSample.Specifications
{
[TestFixture]
[Concern("Account Transfers")] public class When_The_Requested_Transfer_Amount_Is_Greater_Than_The_Originating_Account_Balance : ContextSpecification
{
#region Context
private const double originatingAccountBalance = 100;
private const double receivingAccountBalance = 0;
private const double requestedTransferAmmount = 125.95;
private Account originatingAccount;
private Account receivingAccount;
private AccountTransfer accountTransfer;
protected override void Context()
{ originatingAccount = new Account(originatingAccountBalance);
receivingAccount = new Account(receivingAccountBalance);
accountTransfer = originatingAccount.Transfer(requestedTransferAmmount).To(receivingAccount);
}
#endregion
#region Observations
[Test]
[Observation]
public void The_Transfer_Should_Fail()
{ accountTransfer.Status.ShouldEqual(TransferStatus.Failed);
}
[Test]
[Observation]
public void The_Originating_Account_Balance_Should_Not_Be_Changed()
{ originatingAccount.Balance.ShouldEqual(originatingAccountBalance);
}
[Test]
[Observation]
public void The_Receiving_Account_Balance_Should_Not_Be_Changed()
{ receivingAccount.Balance.ShouldEqual(receivingAccountBalance);
}
#endregion
}
[TestFixture]
[Concern("Account Transfers")] public class When_The_Requested_Transfer_Amount_is_Less_Than_The_Originating_Account_Balance: ContextSpecification
{
#region Context
private const double originatingAccountBalance = 100;
private const double receivingAccountBalance = 0;
private const double requestedTransferAmmount = 25;
private Account originatingAccount;
private Account receivingAccount;
private AccountTransfer accountTransfer;
protected override void Context()
{ originatingAccount = new Account(originatingAccountBalance);
receivingAccount = new Account(receivingAccountBalance);
accountTransfer = originatingAccount.Transfer(requestedTransferAmmount).To(receivingAccount);
}
#endregion
#region Observations
[Test]
[Observation]
public void The_Transfer_Is_Successful()
{ accountTransfer.Status.ShouldEqual(TransferStatus.Success);
}
[Test]
[Observation]
public void The_Originating_Account_Is_Debited_The_Transfer_Amount()
{ const double newBalance = originatingAccountBalance - requestedTransferAmmount;
originatingAccount.Balance.ShouldEqual(newBalance);
}
[Test]
[Observation]
public void The_Receiving_Account_Is_Credited_The_Transfer_Amount()
{ const double newBalance = receivingAccountBalance + requestedTransferAmmount;
receivingAccount.Balance.ShouldEqual(newBalance);
}
#endregion
}
}