示例#1
0
        public void Test_EventReplaying_evaluating_CurrentAccountBalance_using_a_stream_containing_both_past_and_future_events()
        {
            var currentAccountId = Guid.NewGuid();
            var accountOpening   = new AccountOpenedEvent
            {
                CurrentAccountId = currentAccountId,
                Balance          = 200
            };

            EventStore.Save(accountOpening);

            var withdrawal1 = new WithdrawalEvent()
            {
                CurrentAccountId = currentAccountId,
                Amount           = 100
            };

            withdrawal1.SetTimeStamp(DateTime.Now.AddMonths(1));
            EventStore.Save(withdrawal1);

            var withdrawal2 = new WithdrawalEvent()
            {
                CurrentAccountId = currentAccountId,
                Amount           = 100
            };

            withdrawal2.SetTimeStamp(DateTime.Now.AddMonths(3));
            EventStore.Save(withdrawal2);

            WaitForIndexing(documentStore);
            var sut            = new Repository(EventStore);
            var currentAccount = sut.GetById <CurrentAccount>(currentAccountId, DateTime.Now.AddMonths(2));

            Assert.Equal(100, currentAccount.Balance);
        }
        public void Handle(WithdrawalEvent domainEvent)
        {
            var account = dbContext.Accounts.SingleOrDefault(x => x.Id == domainEvent.AggregateRootId);

            account.Balance -= domainEvent.Value.Amount;
            dbContext.SaveChanges();
        }
        public void Test_EventReplaying_evaluating_CurrentAccountBalance_using_a_stream_containing_past_events_only_and_a_different_timeline()
        {
            var currentAccountId = Guid.NewGuid();
            var accountOpening   = new AccountOpenedEvent
            {
                CurrentAccountId = currentAccountId,
                Balance          = 200
            };

            EventStore.Save(accountOpening);

            var withdrawal1 = new WithdrawalEvent()
            {
                CurrentAccountId = currentAccountId,
                Amount           = 100
            };

            withdrawal1.SetTimeStamp(DateTime.Now.AddMonths(1));
            EventStore.Save(withdrawal1);

            var withdrawal2 = new WithdrawalEvent()
            {
                CurrentAccountId = currentAccountId,
                Amount           = 100,
                TimelineId       = Guid.NewGuid()
            };

            withdrawal2.SetTimeStamp(DateTime.Now.AddMonths(3));
            EventStore.Save(withdrawal2);

            var sut            = new Repository(EventStore);
            var currentAccount = sut.GetById <SelfRetrievingCurrentAccount>(currentAccountId, DateTime.Now.AddMonths(3));

            Assert.AreEqual(100, currentAccount.Balance);
        }
        public void Test_EventCount_at_a_specific_date()
        {
            var currentAccountId = Guid.NewGuid();
            var accountOpening   = new AccountOpenedEvent
            {
                CurrentAccountId = currentAccountId,
                Balance          = 200
            };

            EventStore.Save(accountOpening);

            var withdrawal1 = new WithdrawalEvent()
            {
                CurrentAccountId = currentAccountId,
                Amount           = 100
            };

            withdrawal1.SetTimeStamp(DateTime.Now.AddMonths(1));
            EventStore.Save(withdrawal1);

            var sut            = new Repository(EventStore);
            var currentAccount = sut.GetById <CurrentAccount>(currentAccountId, DateTime.Now.AddMonths(2));

            Assert.AreEqual(2, ((IAggregate)currentAccount).OccurredEvents.Count);
        }
        public void Saving_an_event_within_a_timeline_should_allow_for_later_retrieval()
        {
            var @event = new WithdrawalEvent()
            {
                CurrentAccountId = Guid.NewGuid(), TimelineId = Guid.NewGuid(), Amount = 101
            };

            EventStore.Save(@event);
            var events = EventStore.Find <WithdrawalEvent>(e => e.TimelineId == @event.TimelineId && e.CurrentAccountId == @event.CurrentAccountId);

            Assert.Single(events);
            Assert.Equal(@event.CurrentAccountId, events.First().CurrentAccountId);
            Assert.Equal(@event.Amount, events.First().Amount);
        }
        public void Saving_an_event_should_allow_for_later_retrieval()
        {
            var @event = new WithdrawalEvent()
            {
                CurrentAccountId = Guid.NewGuid(), Amount = 101
            };

            EventStore.Save(@event);
            var events = EventStore.Find <WithdrawalEvent>(e => e.CurrentAccountId == @event.CurrentAccountId);

            Assert.AreEqual(1, events.Count());
            Assert.AreEqual(@event.CurrentAccountId, events.First().CurrentAccountId);
            Assert.AreEqual(@event.Amount, events.First().Amount);
        }
        public void Saving_an_event_should_dispatch_it_as_well()
        {
            DomainEvent @event = new WithdrawalEvent()
            {
                CurrentAccountId = Guid.NewGuid(), Amount = 101
            };
            var eventDispatcherMockBuilder = new Mock <IEventDispatcher>();

            eventDispatcherMockBuilder.Setup(v => v.Dispatch(@event));

            var sut = new InMemoryEventStore(eventDispatcherMockBuilder.Object);

            sut.Save(@event);
            eventDispatcherMockBuilder.Verify(v => v.Dispatch(@event), Times.Once());
        }
        public void Event_retrieval_should_discriminate_between_timelines()
        {
            var eventDispatcherMockBuilder = new Mock <IEventDispatcher>();
            var sut = new InMemoryEventStore(eventDispatcherMockBuilder.Object);

            var sourceAccountId      = Guid.NewGuid();
            var destinationAccountId = Guid.NewGuid();

            var withdrawalEvent = new WithdrawalEvent()
            {
                CurrentAccountId = sourceAccountId, Amount = 101
            };

            sut.Save(withdrawalEvent);

            var depositEvent = new DepositEvent()
            {
                CurrentAccountId = sourceAccountId, Amount = 42
            };

            sut.Save(depositEvent);

            var moneyTransferredEvent = new MoneyTransferredEvent()
            {
                SourceAccountId = sourceAccountId, DestinationAccountId = destinationAccountId, Amount = 42, TimelineId = Guid.NewGuid()
            };

            sut.Save(moneyTransferredEvent);

            var eventDescriptors = new List <EventMapping>()
            {
                new EventMapping
                {
                    AggregateIdPropertyName = nameof(WithdrawalEvent.CurrentAccountId),
                    EventType = typeof(WithdrawalEvent)
                },
                new EventMapping
                {
                    AggregateIdPropertyName = nameof(MoneyTransferredEvent.SourceAccountId),
                    EventType = typeof(MoneyTransferredEvent)
                }
            };

            var events = sut.RetrieveEvents(sourceAccountId, DateTime.Now, eventDescriptors, null);

            Assert.Single(events);
        }
示例#9
0
        private void StoreIntoWithdrawalHistory(WithdrawalEvent @event)
        {
            var repository = Container.Resolve <IPaymentRepository>();

            repository.OfflineWithdrawalHistories.Add(new OfflineWithdrawalHistory()
            {
                Id                  = Guid.NewGuid(),
                UserId              = @event.UserId,
                Action              = @event.Status,
                DateCreated         = @event.DateCreated,
                OfflineWithdrawalId = @event.WithdrawalId,
                Remark              = @event.Remark,
                TransactionNumber   = @event.TransactionNumber,
                //Kristian: TODO this is temporary. I have to remove it from here after Konstantin is ready with Core.Auth.
                //Kristian: TODO: There's a task related to that refactoring(https://jira.afusion.com/browse/AFTREGO-3615)
                Username = @event.Username
            });

            repository.SaveChanges();
        }
        public void Saving_two_events_should_allow_for_later_retrieval_of_one_of_them()
        {
            var withdrawalEvent = new WithdrawalEvent()
            {
                CurrentAccountId = Guid.NewGuid(), Amount = 101
            };

            EventStore.Save(withdrawalEvent);
            var depositEvent = new DepositEvent()
            {
                CurrentAccountId = Guid.NewGuid(), Amount = 42
            };

            EventStore.Save(depositEvent);

            var events = EventStore.Find <WithdrawalEvent>(e => e.CurrentAccountId == withdrawalEvent.CurrentAccountId);

            Assert.Single(events);
            Assert.Equal(withdrawalEvent.CurrentAccountId, events.First().CurrentAccountId);
            Assert.Equal(withdrawalEvent.Amount, events.First().Amount);
        }
        public void Test_EventCount()
        {
            var currentAccountId = Guid.NewGuid();
            var accountOpening   = new AccountOpenedEvent
            {
                CurrentAccountId = currentAccountId,
                Balance          = 200
            };

            EventStore.Save(accountOpening);

            var withdrawal1 = new WithdrawalEvent()
            {
                CurrentAccountId = currentAccountId,
                Amount           = 100
            };

            EventStore.Save(withdrawal1);

            var sut            = new Repository(EventStore);
            var currentAccount = sut.GetById <CurrentAccount>(currentAccountId);

            Assert.AreEqual(2, ((IAggregate)currentAccount).OccurredEvents.Count);
        }
 public void ApplyEvent(WithdrawalEvent @event)
 {
     this.Balance -= @event.Amount;
 }
示例#13
0
 public void OnWithdrawal(WithdrawalEvent evt)
 {
     Balance = new SimpleMoney(Balance.Amount - evt.Value.Amount);
 }
 public void Consume(WithdrawalEvent message)
 {
     _eventHandlers.Handle(message);
 }
示例#15
0
        /// <summary>
        /// For the handle method, when we add ctivity to the admin log we should pas a concrete event but not a common parent as WithdrawalEvent is
        /// in the case of all the withdrawal events. This is why, based on the WithdrawalEvent.Status we return an instance of the corresponding object.
        /// </summary>
        /// <param name="wdEvent"></param>
        /// <returns></returns>
        private IDomainEvent GetConcreteWithdrawalEvent(WithdrawalEvent wdEvent)
        {
            var wdId      = wdEvent.WithdrawalId;
            var amnt      = wdEvent.Amount;
            var dtCreated = wdEvent.DateCreated;
            var uId       = wdEvent.UserId;
            var status    = wdEvent.Status;
            var remark    = wdEvent.Remark;
            var transNum  = wdEvent.TransactionNumber;
            var wdMadeBy  = wdEvent.WithdrawalMadeBy;
            var uname     = wdEvent.Username;

            switch (wdEvent.Status)
            {
            case WithdrawalStatus.Accepted:
                return(new WithdrawalAccepted(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Approved:
                return(new WithdrawalApproved(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Canceled:
                return(new WithdrawalCancelled(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Reverted:
                return(new WithdrawalReverted(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Investigation:
                return(new WithdrawalInvestigated(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Documents:
                return(new WithdrawalDocumentsChecked(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Verified:
                return(new WithdrawalVerified(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Unverified:
                return(new WithdrawalUnverified(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.New:
                return(new WithdrawalCreated(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            case WithdrawalStatus.Rejected:
                return(new WithdrawalRejected(wdId, amnt, dtCreated, uId, wdMadeBy, status, remark, transNum, uname)
                {
                    EventCreated = dtCreated
                });

            default:
                return(null);
            }
        }
示例#16
0
 public void Handle(WithdrawalEvent @event)
 {
     AddActivityLog(AdminActivityLogCategory.Withdrawal, GetConcreteWithdrawalEvent(@event), @event.Username);
 }
示例#17
0
 public void Handle(WithdrawalEvent @event)
 {
     AddActivityLog(string.Format("Withdrawal created. Amount: {0}", @event.Amount), @event, @event.UserId, GetPlayerName(@event.UserId));
 }
示例#18
0
 //This is an event handler that is common for all the possible events for withdrawal
 public void Handle(WithdrawalEvent @event)
 {
     AddActivityLog(GetEnumDescription(@event.Status), @event, @event.WithdrawalMadeBy, @event.Remark);
     StoreIntoWithdrawalHistory(@event);
 }