public void When_calling_Save_it_will_add_the_domain_events_to_the_domain_event_storage()
        {
            _ledgers = new List <Ledger>
            {
                new CreditMutation(1, new AccountNumber("0987654321")),
                new DebitMutation(1, new AccountNumber("0987654321")),
                new CreditTransfer(1, new AccountNumber("0987654321")),
                new DebitTransfer(1, new AccountNumber("0987654321")),
                new DebitTransferFailed(1, new AccountNumber("0987654321")),
            };

            var closedAccount = ClosedAccount.CreateNew(Guid.NewGuid(), Guid.NewGuid(), _ledgers, new AccountName("AccountName"), new AccountNumber("1234567890"));

            _repository.Add(closedAccount);
            _eventStoreUnitOfWork.Commit();

            Assert.That(_domainEventStorage.GetEventsSinceLastSnapShot(closedAccount.Id).Count(), Is.EqualTo(1));
            Assert.That(_domainEventStorage.GetAllEvents(closedAccount.Id).Count(), Is.EqualTo(1));
        }
        private static void ClosedAccountComparer(ClosedAccount original, ClosedAccount recreated)
        {
            var fields = typeof(ClosedAccount).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            foreach (var field in fields)
            {
                if (field.FieldType == typeof(List <Ledger>))
                {
                    var counter = 0;
                    var ledgers = (List <Ledger>)field.GetValue(recreated);
                    foreach (var ledger in (List <Ledger>)field.GetValue(original))
                    {
                        Assert.That(ledger.ToString(), Is.EqualTo(ledgers[counter++].ToString()));
                    }
                    continue;
                }
                Assert.That(field.GetValue(original).ToString(), Is.EqualTo(field.GetValue(recreated).ToString()));
            }
        }
        public void When_calling_Save_it_will_reset_the_domain_events()
        {
            _ledgers = new List <Ledger>
            {
                new CreditMutation(1, new AccountNumber("0987654321")),
                new DebitMutation(1, new AccountNumber("0987654321")),
                new CreditTransfer(1, new AccountNumber("0987654321")),
                new DebitTransfer(1, new AccountNumber("0987654321")),
                new DebitTransferFailed(1, new AccountNumber("0987654321")),
            };

            var closedAccount = ClosedAccount.CreateNew(Guid.NewGuid(), Guid.NewGuid(), _ledgers, new AccountName("AccountName"), new AccountNumber("1234567890"));

            _repository.Add(closedAccount);
            _eventStoreUnitOfWork.Commit();

            var closedAccountForRepository = (IEventProvider <IDomainEvent>)closedAccount;

            Assert.That(closedAccountForRepository.GetChanges().Count(), Is.EqualTo(0));
        }
        public void When_calling_CreateMemento_it_will_return_a_closed_account_memento()
        {
            _ledgers = new List <Ledger>
            {
                new CreditMutation(1, new AccountNumber("0987654321")),
                new DebitMutation(1, new AccountNumber("0987654321")),
                new CreditTransfer(1, new AccountNumber("0987654321")),
                new DebitTransfer(1, new AccountNumber("0987654321")),
                new DebitTransferFailed(1, new AccountNumber("0987654321")),
            };

            var closedAccount = ClosedAccount.CreateNew(Guid.NewGuid(), Guid.NewGuid(), _ledgers, new AccountName("AccountName"), new AccountNumber("1234567890"));

            var memento = ((IOrginator)closedAccount).CreateMemento();

            var newClosedAccount = new ClosedAccount();

            ((IOrginator)newClosedAccount).SetMemento(memento);

            ClosedAccountComparer(closedAccount, newClosedAccount);
        }
        public void When_calling_CreateMemento_it_will_return_a_closed_account_memento()
        {
            _ledgers = new List<Ledger>
            {
                new CreditMutation(1, new AccountNumber("0987654321")),
                new DebitMutation(1, new AccountNumber("0987654321")),
                new CreditTransfer(1, new AccountNumber("0987654321")),
                new DebitTransfer(1, new AccountNumber("0987654321")),
                new DebitTransferFailed(1, new AccountNumber("0987654321")),
            };

            var closedAccount = ClosedAccount.CreateNew(Guid.NewGuid(), Guid.NewGuid(), _ledgers, new AccountName("AccountName"), new AccountNumber("1234567890"));

            var memento = ((IOrginator)closedAccount).CreateMemento();

            var newClosedAccount = new ClosedAccount();

            ((IOrginator)newClosedAccount).SetMemento(memento);

            ClosedAccountComparer(closedAccount, newClosedAccount);
        }
 private static void ClosedAccountComparer(ClosedAccount original, ClosedAccount recreated)
 {
     var fields = typeof(ClosedAccount).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
     foreach (var field in fields)
     {
         if (field.FieldType == typeof(List<Ledger>))
         {
             var counter = 0;
             var ledgers = (List<Ledger>)field.GetValue(recreated);
             foreach (var ledger in (List<Ledger>)field.GetValue(original))
             {
                 Assert.That(ledger.ToString(), Is.EqualTo(ledgers[counter++].ToString()));
             }
             continue;
         }
         Assert.That(field.GetValue(original).ToString(), Is.EqualTo(field.GetValue(recreated).ToString()));
     }
 }