public void WithdrawMoney_WithCurrencyMismatch_Throws() { var bankAccount = new BankAccountBuilder(DefaultBankAccountId).WithCurrency(Currency.Euro).WithDepositedMoney(100).Build(); var bankAccountRepository = ConfigureBankAccountRepositoryForAccount(bankAccount); var systemUnderTest = new WithdrawMoneyHandler(bankAccountRepository); var command = new WithdrawMoney(DefaultBankAccountId, Transaction.Of(Guid.Parse("996228f4-70cb-4e44-9716-8a2a3b27d18c")), new Money(100, Currency.Dollar), TimeStamp.Of(3)); systemUnderTest.Awaiting(it => it.Handle(command, CancellationToken.None)).Should().Throw <CurrencyMismatchException>(); }
private static Task CreateAccountAsync(IMediator mediator) { System.Console.Clear(); System.Console.Write("IBAN: "); var iban = Iban.Of(System.Console.ReadLine()); var createBankAccount = new CreateBankAccount(OId.Of <AccountHolder, Guid>(Guid.NewGuid()), OId.Of <Employee, Guid>(EmployeeId), Currency.Euro, iban, TimeStamp.Of(DateTimeOffset.Now.ToUnixTimeSeconds())); return(mediator.Send(createBankAccount)); }
private static Task Deposit(IMediator mediator, AvailableAccountsProjection availableAccountsProjection) { System.Console.Clear(); System.Console.Write("IBAN: "); var iban = Iban.Of(System.Console.ReadLine()); System.Console.Write("Amount: "); var amount = decimal.Parse(System.Console.ReadLine()); var bankAccountId = OId.Of <CoreDomain.BankAccount, Guid>(availableAccountsProjection.GetId(iban)); var depositMoney = new DepositMoney(bankAccountId, Transaction.Of(Guid.NewGuid()), new Money(amount, Currency.Euro), TimeStamp.Of(DateTimeOffset.Now.ToUnixTimeSeconds())); return(mediator.Send(depositMoney)); }
public void CreateNewBankAccount_Always_SavesNewBankAccount() { var bankAccountRepository = Substitute.For <IBankAccountRepository>(); var systemUnderTest = new CreateBankAccountHandler(bankAccountRepository); var employeeId = OId.Of <Employee, Guid>(Guid.Parse("309dc64d-bde5-4ee5-9e21-33a517e2fe35")); var accountHolderId = OId.Of <AccountHolder, Guid>(Guid.Parse("59ed2782-881b-49a9-8230-d0b3bb1c9072")); var iban = Iban.Of("DE37200505501340426749"); const int unixTimestamp = 1; var command = new CreateBankAccount(accountHolderId, employeeId, Currency.Euro, iban, TimeStamp.Of(unixTimestamp)); var expectedAccountId = Guid.Parse("5fd9c8fe-2a2c-4d76-9c57-2460dd516dbf"); UniqueId.OverrideNewGuid(expectedAccountId); systemUnderTest.Handle(command, CancellationToken.None).GetAwaiter().GetResult(); var expectedEvents = new BankAccountEvent[] { new BankAccountCreated(expectedAccountId, accountHolderId.Value, iban.Value, Currency.Euro.Value, employeeId.Value, unixTimestamp) }; bankAccountRepository.Received() .SaveAsync(Arg.Is <BankAccount>(it => it.IsCorrectBankAccount(aggregate => aggregate.Id.Value.Equals(expectedAccountId) && aggregate.Version == 1 && aggregate.GetUncommittedEvents().SequenceEqual(expectedEvents)))); UniqueId.ResetOverride(); }
public void DepositMoney_WithBankAccountNotCreated_Throws() { var bankAccountRepository = Substitute.For <IBankAccountRepository>(); var systemUnderTest = new DepositMoneyHandler(bankAccountRepository); var transaction = Transaction.Of(Guid.Parse("f0ad5ace-c64f-4f82-9487-a26b376dcf8b")); var command = new DepositMoney(DefaultBankAccountId, transaction, new Money(100, Currency.Euro), TimeStamp.Of(1)); var bankAccount = BankAccount.Rehydrate(DefaultBankAccountId, Enumerable.Empty <BankAccountEvent>()); bankAccountRepository.GetByIdAsync(DefaultBankAccountId).Returns(Task.FromResult(bankAccount)); systemUnderTest.Awaiting(it => systemUnderTest.Handle(command, CancellationToken.None)).Should().Throw <ConstraintViolationException>(); }
public void DepositMoney_WithCurrencyMismatch_Throws(decimal amount, string currency, string accountCurrency) { var transaction = Transaction.Of(Guid.Parse("f0ad5ace-c64f-4f82-9487-a26b376dcf8b")); var bankAccountRepository = Substitute.For <IBankAccountRepository>(); var systemUnderTest = new DepositMoneyHandler(bankAccountRepository); var bankAccount = RehydrateWithCreatedEvent(DefaultBankAccountId, Currency.Of(accountCurrency)); var command = new DepositMoney(DefaultBankAccountId, transaction, new Money(amount, Currency.Of(currency)), TimeStamp.Of(1)); bankAccountRepository.GetByIdAsync(DefaultBankAccountId).Returns(Task.FromResult(bankAccount)); systemUnderTest.Awaiting(it => systemUnderTest.Handle(command, CancellationToken.None)).Should().Throw <CurrencyMismatchException>(); }
public void DepositMoney_WithCorrectCurrency_DepositsMoneyInAccount(decimal amount, string currency) { var bankAccountRepository = Substitute.For <IBankAccountRepository>(); var systemUnderTest = new DepositMoneyHandler(bankAccountRepository); var transaction = Transaction.Of(Guid.Parse("f0ad5ace-c64f-4f82-9487-a26b376dcf8b")); var accountCurrency = Currency.Of(currency); var command = new DepositMoney(DefaultBankAccountId, transaction, new Money(amount, accountCurrency), TimeStamp.Of(1)); var bankAccount = RehydrateWithCreatedEvent(DefaultBankAccountId, accountCurrency); bankAccountRepository.GetByIdAsync(DefaultBankAccountId).Returns(Task.FromResult(bankAccount)); systemUnderTest.Handle(command, CancellationToken.None).GetAwaiter().GetResult(); var expectedEvents = new BankAccountEvent[] { new MoneyDeposited(DefaultBankAccountId.Value, transaction.Value, amount, 1) }; bankAccountRepository.Received() .SaveAsync(Arg.Is <BankAccount>(it => it.IsCorrectBankAccount(aggregate => aggregate.Version == 2 && aggregate.InitialVersion == 0 && aggregate.GetUncommittedEvents().SequenceEqual(expectedEvents)))); }
public void WithdrawMoney_OnUninitializedBankAccount_Throws() { var bankAccount = BankAccount.Rehydrate(DefaultBankAccountId, Enumerable.Empty <BankAccountEvent>()); var bankAccountRepository = ConfigureBankAccountRepositoryForAccount(bankAccount); var systemUnderTest = new WithdrawMoneyHandler(bankAccountRepository); var command = new WithdrawMoney(DefaultBankAccountId, Transaction.Of(Guid.Parse("996228f4-70cb-4e44-9716-8a2a3b27d18c")), new Money(200, Currency.Euro), TimeStamp.Of(3)); systemUnderTest.Awaiting(it => it.Handle(command, CancellationToken.None)).Should().Throw <ConstraintViolationException>(); }
public void WithdrawMoney_WithLimitNotExceeded_WithdrawsMoney() { var bankAccount = new BankAccountBuilder(DefaultBankAccountId).WithCurrency(Currency.Euro).WithDepositedMoney(50).WithDepositedMoney(50).Build(); var bankAccountRepository = ConfigureBankAccountRepositoryForAccount(bankAccount); var systemUnderTest = new WithdrawMoneyHandler(bankAccountRepository); var command = new WithdrawMoney(DefaultBankAccountId, Transaction.Of(Guid.Parse("996228f4-70cb-4e44-9716-8a2a3b27d18c")), new Money(100, Currency.Euro), TimeStamp.Of(3)); systemUnderTest.Handle(command, CancellationToken.None).GetAwaiter().GetResult(); var moneyDeposited = new MoneyWithdrawn(DefaultBankAccountId.Value, command.Transaction.Value, command.Amount.Amount, command.TimeStamp.Value); bankAccountRepository.Received().SaveAsync(Arg.Is <BankAccount>(it => it.IsCorrectBankAccount(DefaultBankAccountId, 4, moneyDeposited))); }