示例#1
0
        public void event_handler_should_handle_event_via_router()
        {
            // arrange
            var e = new AccountCreated(m_id);

            // act
            m_sender.SendOne(e);

            // assert
        }
示例#2
0
        public void Apply(AccountCreated e)
        {
            Created = true;

            _account.AccountId = e.AccountId;
            _account.EntityName = e.EntityName;
            _account.TaxNumber = e.TaxNumber;
            _account.AccountType = e.Type;
            Version = e.Version;
        }
示例#3
0
        public void file_record_storage_should_append_new()
        {
            // arrange

            // act
            var storage = m_factory.GetOrCreateStorage(m_accountID);
            var account = new AccountCreated(m_accountID);

            // assert
            storage.TryAppend(new object[]{ account });
        }
示例#4
0
        public void event_handler_should_handle_multiple_events_via_router()
        {
            // arrange
            var e1 = new AccountCreated(m_id);
            var e2 = new AccountCreated(m_id);
            var e3 = new AccountCreated(m_id);

            // act
            m_sender.SendBatch(new object[] { e1, e2, e3 });

            // assert
        }
示例#5
0
        public void event_handler_should_handle_event()
        {
            // arrange
            var e = new AccountCreated(m_id);

            var handler = new MessageHandler();
            handler.WireToLambda<AccountCreated>(new AccountCreatedHandler().Handle);

            // act
            handler.Handle(e);

            // assert
        }
示例#6
0
        public void file_record_storage_should_append_new_and_fetch()
        {
            // arrange
            var storage = m_factory.GetOrCreateStorage(m_accountID);
            var account = new AccountCreated(m_accountID);

            storage.TryAppend(new object[] { account });

            // act
            var fetch = storage.GetRecords(0, int.MaxValue);

            // assert
            fetch.ShouldNotBeEmpty();
        }
示例#7
0
        public async Task CannnotWithdrawCashIfOverdrafdIsExceeded(decimal deposit, decimal overdraft, decimal withdraw)
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var depositSetEv = new CashDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = deposit
            };

            var overdraftSetEv = new OverdraftLimitSet(CorrelatedMessage.NewRoot())
            {
                AccountId      = _accountId,
                OverdraftLimit = overdraft
            };

            var cmd = new WithdrawCash()
            {
                AccountId = _accountId,
                Amount    = withdraw
            };

            var withdrawalFailedEv = new WithdrawalFailed(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = cmd.Amount
            };

            var accBlockedEv = new AccountBlocked(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv, depositSetEv, overdraftSetEv)
                .When(cmd)
                .Then(withdrawalFailedEv, accBlockedEv));
        }
        /// <summary>
        /// Attempts to insert a new company into the database
        /// </summary>
        /// <param name="accountInfo">Contains the info about the new company to be added to the database</param>
        /// <returns>true if successful, false otherwise</returns>
        public bool insertNewCompany(AccountCreated accountInfo)
        {
            if (openConnection() == true)
            {
                string query =
                    @"INSERT INTO company(companyname, phonenumber, email) " +
                    @"VALUES('" + accountInfo.username + @"', '" + accountInfo.phonenumber +
                    @"', '" + accountInfo.email + @"');" +
                    @"INSERT INTO location(address, companyname) " +
                    @"VALUES('" + accountInfo.address + @"', '" + accountInfo.username + @"');";

                try
                {
                    MySqlCommand command = new MySqlCommand(query, connection);
                    command.ExecuteNonQuery();
                }
                catch (MySqlException e)
                {
                    Messages.Debug.consoleMsg("Unable to complete insert new company into database." +
                                              " Error :" + e.Number + e.Message);
                    closeConnection();
                    return(false);
                }
                catch (Exception e)
                {
                    closeConnection();
                    Messages.Debug.consoleMsg("Unable to Unable to complete insert new company into database." +
                                              " Error:" + e.Message);
                    return(false);
                }
                finally
                {
                    closeConnection();
                }
            }
            else
            {
                return(false);
            }
            closeConnection();
            return(true);
        }
示例#9
0
        public async Task CannotWithrawNonPoitiveCashTests(decimal amount)
        {
            var accCreateEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cmd = new WithdrawCash()
            {
                AccountId = _accountId,
                Amount    = amount
            };

            await _runner.Run(
                def => def
                .Given(accCreateEv)
                .When(cmd)
                .Throws(new SystemException("Withdrawn Cash amount should be greater than 0.")));
        }
示例#10
0
        public async Task CashWithdrawAmountCannotBeNegative()
        {
            decimal withdrawAmount = -5000;

            var accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };

            var cmd = new WithdrawCash()
            {
                AccountId      = _accountId,
                WithdrawAmount = withdrawAmount
            };

            await _runner.Run(
                def => def.Given(accountCreated).When(cmd).Throws(new ValidationException("Cash withdrawal amount cannot be negative"))
                );
        }
示例#11
0
        private void BgwAccountUpdater_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            switch (e.UserState.ToString())
            {
            case "ACCOUNT_CREATED":
                AccountCreated?.Invoke(this, new AccountEventArgs(accountData));
                break;

            case "ACCOUNT_DELETED":
                AccountDeleted?.Invoke(this, new AccountEventArgs(accountData));
                break;

            case "ACCOUNT_INFO_UPDATED":
                AccountInfoUpdated?.Invoke(this, new AccountEventArgs(accountData));
                break;

            default:
                throw (new ArgumentException());
            }
        }
        public async Task CannotConfigureNegativeWireTransferLimitOnAccount()
        {
            decimal dailyWireTransferLimit = -5000;

            var accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };

            var cmd = new ConfigureDailyWireTransferLimit
            {
                AccountId = _accountId,
                DailyWireTransferLimit = dailyWireTransferLimit
            };

            await _runner.Run(
                def => def.Given(accountCreated).When(cmd).Throws(new ValidationException("Daily wire transfer limit cannot be negative"))
                );
        }
        private static BankAccountEvent DeserializeEvent(string eventType, string dataString)
        {
            dynamic obj = JsonConvert.DeserializeObject(dataString);

            switch (eventType)
            {
            case nameof(AccountCreated):
                var a = JsonConvert.DeserializeObject <AccountCreated>(dataString);

                var b = new AccountCreated(
                    new AccountId((Guid)obj.AppliesTo.Value),
                    new EventId((int)obj.Id.Value),
                    new EventDateTime((DateTimeOffset)obj.OccurredOn.Value)
                    );

                return(b);

            default: throw new Exception($"Unrecognized event type: {eventType}");
            }
        }
示例#14
0
        public Account_transactions_projection_tests()
        {
            // Given_account_created_and_projecting()
            var msgCreated = new AccountCreated(Guid.NewGuid(), Guid.NewGuid(), 42);
            var user       = new User {
                Id = msgCreated.UserId, Login = "******"
            };

            _msgReplenish  = new AccountReplenish(msgCreated.SourceId, Guid.NewGuid(), new Money(100));
            _msgWithdrawal = new AccountWithdrawal(msgCreated.SourceId, Guid.NewGuid(), new Money(30));

            using (var context = CreateContext())
            {
                context.Users.Add(user);
                context.SaveChanges();
            }

            ProjectionBuilder.Handle(msgCreated).Wait();
            ProjectionBuilder.Handle(_msgReplenish).Wait();
            ProjectionBuilder.Handle(_msgWithdrawal).Wait();
        }
示例#15
0
        public async Task CannotSetOverdraftLimit(decimal limit)
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cmd = new SetOverdraftLimit
            {
                AccountId      = _accountId,
                OverdraftLimit = limit
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv)
                .When(cmd)
                .Throws(new SystemException("The overdraft limit cannot be negative."))
                );
        }
示例#16
0
        public async Task CannotDepositCheque(decimal amount)
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cmd = new DepositCheque()
            {
                AccountId = _accountId,
                Amount    = amount
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv)
                .When(cmd)
                .Throws(new SystemException("The deposited cheque amount should be greater than 0."))
                );
        }
示例#17
0
 private void InitiateAccount(CreateAccount command)
 {
     this.Monitor();
     if (_accountState.AccountNumber == null)
     {
         /**
          * we want to use behaviours here to make sure we don't allow the account to be created
          * once it has been created -- Become AccountBoarded perhaps?
          */
         var @event = new AccountCreated(command.AccountNumber);
         Persist(@event, s =>
         {
             _accountState = _accountState.Event(@event);
             _log.Debug($"Created account {command.AccountNumber}");
         });
     }
     else
     {
         _log.Info($"You are trying to create {command.AccountNumber}, but has already been created. No action taken.");
     }
 }
示例#18
0
        public async Task CashDepositAmountCannotBeNegative()
        {
            decimal  depositeAmount = -5000;
            DateTime depositeDate   = System.DateTime.Now;

            var accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };

            var cmd = new DepositCash
            {
                AccountId     = _accountId,
                DepositAmount = depositeAmount
            };

            await _runner.Run(
                def => def.Given(accountCreated).When(cmd).Throws(new ValidationException("Cash deposit amount cannot be negative"))
                );
        }
示例#19
0
        public async Task CannotWireTransferIfAccountIsBlocked()
        {
            var deposit  = 5000m;
            var transfer = 100m;

            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cashDepositedEv = new CashDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = deposit
            };

            var accBlocked = new AccountBlocked(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId
            };

            var cmd = new TryWireTransfer()
            {
                AccountId = _accountId,
                Amount    = transfer
            };

            var transferFailedEv = new WireTransferFailed(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = cmd.Amount
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv, cashDepositedEv, accBlocked)
                .When(cmd)
                .Then(transferFailedEv));
        }
示例#20
0
        public async Task CannnotWithdrawCashFromBlockedAccount()
        {
            var deposit  = 1000m;
            var withdraw = 500m;

            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var depositSetEv = new CashDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = deposit
            };

            var accBlockedEv = new AccountBlocked(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId
            };

            var cmd = new WithdrawCash()
            {
                AccountId = _accountId,
                Amount    = withdraw
            };

            var transferFailedEv = new WithdrawalFailed(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = cmd.Amount
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv, depositSetEv, accBlockedEv)
                .When(cmd)
                .Then(transferFailedEv));
        }
示例#21
0
        private async Task <bool> Handle(AccountCreated ac)
        {
            Log.Information("Added Account: {ClientId}, {BranchCode}, {InitialBalance}",
                            ac.ClientId, ac.BranchBranchCode, ac.InitialBalance);

            var account = new Account();

            account.AccountId     = ac.Id;
            account.ClientId      = ac.ClientId;
            account.BranchCode    = ac.BranchBranchCode;
            account.Balance       = ac.InitialBalance;
            account.AccountNumber = ac.AccountNumber;

            _dbContext.Add(account);

            if (await _dbContext.SaveChangesAsync() == 0)
            {
                throw new ApplicationException();
            }

            return(true);
        }
示例#22
0
        private void Handle(CreateAccount cmd)
        {
            var sender = Sender;

            if (LastSequenceNr > 0)
            {
                throw new AlreadyCreatedException();
            }

            var created = new AccountCreated
            {
                AccountNumber = cmd.AccountNumber,
                InitialFunds  = cmd.InitialBalance
            };

            // when last event is persisted, send response
            Persist(created, e =>
            {
                ApplyEvent(e);
                Respond(sender, "Created", new[] { created });
            });
        }
示例#23
0
        public async Task CanWireTransferIfEnoughFundsAndNotExceededLimits(
            decimal deposit, decimal limit, decimal transfer)
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cashDepositedEv = new CashDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = deposit
            };

            var dailyLimitSetEv = new DailyWireTransferLimitSet(CorrelatedMessage.NewRoot())
            {
                AccountId  = _accountId,
                DailyLimit = limit
            };

            var cmd = new TryWireTransfer()
            {
                AccountId = _accountId,
                Amount    = transfer
            };

            var transferedEv = new WireTransferHappened(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = cmd.Amount
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv, cashDepositedEv, dailyLimitSetEv)
                .When(cmd)
                .Then(transferedEv));
        }
示例#24
0
        public async Task CashWithdrawalWhenAccountIsBlockedShouldRaiseAccountBlockedEvent()
        {
            decimal withdrawAmount = 10000;
            decimal depositeAmount = 5000;

            var accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };

            var evtCashDeposited = new CashDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId     = _accountId,
                DepositAmount = depositeAmount
            };

            var evtCashWithdrawn = new CashWithdrawn(CorrelatedMessage.NewRoot())
            {
                AccountId      = _accountId,
                WithdrawAmount = withdrawAmount
            };

            var cmdWithdrawCash = new WithdrawCash()
            {
                AccountId      = _accountId,
                WithdrawAmount = withdrawAmount
            };

            var evAccountBlocked = new AccountBlocked(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Amount    = withdrawAmount
            };

            await _runner.Run(
                def => def.Given(accountCreated, evtCashDeposited, evtCashWithdrawn).When(cmdWithdrawCash).Then(evAccountBlocked)
                );
        }
        public async Task CanTransferFundFromValidAccount()
        {
            decimal WireTransferFund = 5000;
            decimal depositeAmount   = 5000;

            var accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };
            var cmdDepositCash = new DepositCash
            {
                AccountId     = _accountId,
                DepositAmount = depositeAmount
            };

            var evtCashDeposited = new CashDeposited(cmdDepositCash)
            {
                AccountId     = _accountId,
                DepositAmount = depositeAmount
            };
            var cmd = new TransferWireFund()
            {
                AccountId = _accountId,
                WireFund  = WireTransferFund
            };

            var ev = new WireFundTransferred(cmd)
            {
                AccountId = _accountId,
                WireFund  = WireTransferFund
            };

            await _runner.Run(
                def => def.Given(accountCreated, evtCashDeposited).When(cmd).Then(ev)
                );
        }
示例#26
0
        public async Task CanWithdrawCashFromValidAccount()
        {
            decimal withdrawAmount = 5000;
            decimal depositeAmount = 5000;

            var accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };
            var cmdDepositCash = new DepositCash
            {
                AccountId     = _accountId,
                DepositAmount = depositeAmount
            };

            var evtCashDeposited = new CashDeposited(cmdDepositCash)
            {
                AccountId     = _accountId,
                DepositAmount = depositeAmount
            };
            var cmd = new WithdrawCash()
            {
                AccountId      = _accountId,
                WithdrawAmount = withdrawAmount
            };

            var ev = new CashWithdrawn(cmd)
            {
                AccountId      = _accountId,
                WithdrawAmount = withdrawAmount
            };

            await _runner.Run(
                def => def.Given(accountCreated, evtCashDeposited).When(cmd).Then(ev)
                );
        }
示例#27
0
        public async Task CanDepositCash(double amount)
        {
            var created = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Parth Sheth"
            };

            var cmd = new DepositCash
            {
                AccountId = _accountId,
                Amount    = Convert.ToDecimal(amount)
            };

            var limitSet = new CashDeposited(cmd)
            {
                AccountId = _accountId,
                Amount    = cmd.Amount
            };

            await _runner.Run(
                def => def.Given(created).When(cmd).Then(limitSet)
                );
        }
示例#28
0
        public async Task CanUnblockAccount()
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var accBlockedEv = new AccountBlocked(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId
            };

            var cmd = new DepositCash()
            {
                AccountId = _accountId,
                Amount    = 1000
            };

            var amountSetEv = new CashDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId = cmd.AccountId,
                Amount    = cmd.Amount
            };

            var accUnblockedEv = new AccountUnblocked(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId
            };

            await _runner.Run(
                def => def
                .Given(accCreatedEv, accBlockedEv)
                .When(cmd)
                .Then(amountSetEv, accUnblockedEv));
        }
示例#29
0
        public async Task CanSetOverdraftLimit(decimal limit)
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cmd = new SetOverdraftLimit
            {
                AccountId      = _accountId,
                OverdraftLimit = limit
            };

            var limitSetEv = new OverdraftLimitSet(CorrelatedMessage.NewRoot())
            {
                AccountId      = cmd.AccountId,
                OverdraftLimit = cmd.OverdraftLimit
            };

            await _runner.Run(
                def => def.Given(accCreatedEv).When(cmd).Then(limitSetEv)
                );
        }
示例#30
0
        private AccountState ApplyEvent(AccountCreated occurred)
        {
            var newState = new AccountState(
                occurred.AccountNumber,
                accountStatus: AccountStatus.Boarded,
                obligations: ImmutableDictionary.Create <string, MaintenanceFee>(),
                simulation: LoadSimulation(),
                log: AuditLog.Add(
                    new StateLog("AccountCreated",
                                 occurred.Message + " Balance After: " + ((decimal)occurred.OpeningBalance).ToString("C"),
                                 occurred.UniqueGuid(),
                                 occurred.OccurredOn()
                                 )
                    ),
                openingBalance: occurred.OpeningBalance,
                currentBalance: 0, //best to affect currBal explicitly with an event
                inventory: occurred.Inventory,
                userName: occurred.UserName,
                lastPaymentAmount: occurred.LastPaymentAmount,
                lastPaymentDate: occurred.LastPaymentDate
                );

            return(newState);
        }
        public async Task CanSetDailyWireTransferLimit(double limit)
        {
            var created = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Parth Sheth"
            };

            var cmd = new SetDailyWireTransferLimit
            {
                AccountId = _accountId,
                DailyWireTransferLimit = Convert.ToDecimal(limit)
            };

            var limitSet = new DailyWireTransferLimitSet(cmd)
            {
                AccountId = _accountId,
                DailyWireTransferLimit = cmd.DailyWireTransferLimit
            };

            await _runner.Run(
                def => def.Given(created).When(cmd).Then(limitSet)
                );
        }
示例#32
0
        public async Task CanDepositCheque(decimal amount)
        {
            var accCreatedEv = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId = _accountId,
                Name      = "Jake Sanders"
            };

            var cmd = new DepositCheque()
            {
                AccountId = _accountId,
                Amount    = amount
            };

            var amountSetEv = new ChequeDeposited(CorrelatedMessage.NewRoot())
            {
                AccountId = cmd.AccountId,
                Amount    = cmd.Amount
            };

            await _runner.Run(
                def => def.Given(accCreatedEv).When(cmd).Then(amountSetEv)
                );
        }
        public async Task CanConfigureOverdraftLimitOnAccount()
        {
            decimal overdraftLimit = 500;
            var     accountCreated = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };
            var cmd = new ConfigureOverdraftLimit
            {
                AccountId      = _accountId,
                OverdraftLimit = overdraftLimit
            };

            var ev = new OverdraftLimitConfigured(cmd)
            {
                AccountId      = cmd.AccountId,
                OverdraftLimit = cmd.OverdraftLimit
            };

            await _runner.Run(
                def => def.Given(accountCreated).When(cmd).Then(ev)
                );
        }
        public async Task CanConfigureDailyWireTransferLimitOnAccount()
        {
            decimal dailyWireTransferLimit = 5000;
            var     accountCreated         = new AccountCreated(CorrelatedMessage.NewRoot())
            {
                AccountId         = _accountId,
                AccountHolderName = "Tushar"
            };
            var cmd = new ConfigureDailyWireTransferLimit
            {
                AccountId = _accountId,
                DailyWireTransferLimit = dailyWireTransferLimit
            };

            var ev = new DailyWireTransferLimitConfigured(cmd)
            {
                AccountId = cmd.AccountId,
                DailyWireTransferLimit = cmd.DailyWireTransferLimit
            };

            await _runner.Run(
                def => def.Given(accountCreated).When(cmd).Then(ev)
                );
        }
示例#35
0
 public NewAccountCreatedEmailTemplate(AccountCreated accountCreatedEvent)
 {
     AccountCreatedEvent = accountCreatedEvent;
 }
示例#36
0
 /// <summary>
 /// Handles <see cref="AccountCreated"/> events
 /// </summary>
 /// <param name="e">Event to handle</param>
 private void When(AccountCreated e)
 {
     this.Name = e.Name;
 }
 protected virtual void Handle(AccountCreated evnt)
 {
     _entityManager.BuildAndSave<LibraryAccountEntity>(evnt);
 }
 private void Handle(AccountCreated evnt)
 {
     _connection.Insert(evnt, "EventSourcing_Sample_LibraryAccount", _transaction);
 }
示例#39
0
 private void Apply(AccountCreated @event)
 {
     Id = @event.AccountId;
 }
示例#40
0
 public void When(AccountCreated e)
 {
     ID = e.Identity;
 }