public async Task ItShouldUpdateIfUncommittedEntryAlreadyExists()
        {
            await this.DatabaseTestAsync(async testDatabase =>
            {
                this.target = new PersistCommittedAndUncommittedRecordsDbStatement(testDatabase);

                await this.target.ExecuteAsync(
                    SubscriberId,
                    CreatorId,
                    LedgerRecords.Select(v => new AppendOnlyLedgerRecord(
                                             Guid.NewGuid(),
                                             v.AccountOwnerId,
                                             v.CounterpartyId,
                                             Now.AddDays(-1),
                                             v.Amount,
                                             v.AccountType,
                                             v.TransactionType,
                                             Guid.NewGuid(),
                                             Guid.NewGuid(),
                                             null,
                                             null,
                                             null)).ToList(),
                    new UncommittedSubscriptionPayment(
                        UncommittedRecord.SubscriberId,
                        UncommittedRecord.CreatorId,
                        UncommittedRecord.StartTimestampInclusive.AddDays(-1),
                        UncommittedRecord.EndTimestampExclusive.AddDays(-1),
                        UncommittedRecord.Amount,
                        Guid.NewGuid()));

                await testDatabase.TakeSnapshotAsync();

                await this.target.ExecuteAsync(SubscriberId, CreatorId, LedgerRecords, UncommittedRecord);

                var sideEffects = new List <IIdentityEquatable>();
                sideEffects.AddRange(LedgerRecords);
                sideEffects.Add(UncommittedRecord);

                return(new ExpectedSideEffects
                {
                    Inserts = LedgerRecords,
                    Update = UncommittedRecord
                });
            });
        }
        public async Task ItShouldNotAllowDuplicateLedgerEntries()
        {
            await this.DatabaseTestAsync(async testDatabase =>
            {
                this.target = new PersistCommittedAndUncommittedRecordsDbStatement(testDatabase);

                await this.target.ExecuteAsync(
                    SubscriberId,
                    CreatorId,
                    LedgerRecords.Select(v => new AppendOnlyLedgerRecord(
                                             Guid.NewGuid(),
                                             v.AccountOwnerId,
                                             v.CounterpartyId,
                                             v.Timestamp,
                                             v.Amount,
                                             v.AccountType,
                                             v.TransactionType,
                                             Guid.NewGuid(),
                                             Guid.NewGuid(),
                                             null,
                                             null,
                                             null)).ToList(),
                    UncommittedRecord);

                await testDatabase.TakeSnapshotAsync();

                Exception expectedException = null;
                try
                {
                    await this.target.ExecuteAsync(SubscriberId, CreatorId, LedgerRecords, UncommittedRecord);
                }
                catch (SqlException t)
                {
                    if (t.Number == 2601)
                    {
                        expectedException = t;
                    }
                }

                Assert.IsNotNull(expectedException);

                return(ExpectedSideEffects.TransactionAborted);
            });
        }
        public async Task ItShouldInsertIfEntriesDoNotExist()
        {
            await this.DatabaseTestAsync(async testDatabase =>
            {
                this.target = new PersistCommittedAndUncommittedRecordsDbStatement(testDatabase);

                await testDatabase.TakeSnapshotAsync();

                await this.target.ExecuteAsync(SubscriberId, CreatorId, LedgerRecords, UncommittedRecord);

                var sideEffects = new List <IIdentityEquatable>();
                sideEffects.AddRange(LedgerRecords);
                sideEffects.Add(UncommittedRecord);

                return(new ExpectedSideEffects
                {
                    Inserts = sideEffects
                });
            });
        }
        public async Task ItShouldDeleteExistingUncommittedEntryIfUncommittedEntryNotSupplied()
        {
            await this.DatabaseTestAsync(async testDatabase =>
            {
                this.target = new PersistCommittedAndUncommittedRecordsDbStatement(testDatabase);

                await this.target.ExecuteAsync(
                    SubscriberId,
                    CreatorId,
                    LedgerRecords.Select(v => new AppendOnlyLedgerRecord(
                                             Guid.NewGuid(),
                                             v.AccountOwnerId,
                                             v.CounterpartyId,
                                             Now.AddDays(-1),
                                             v.Amount,
                                             v.AccountType,
                                             v.TransactionType,
                                             Guid.NewGuid(),
                                             Guid.NewGuid(),
                                             null,
                                             null,
                                             null)).ToList(),
                    UncommittedRecord);

                await testDatabase.TakeSnapshotAsync();

                await this.target.ExecuteAsync(SubscriberId, CreatorId, LedgerRecords, null);

                var sideEffects = new List <IIdentityEquatable>();
                sideEffects.AddRange(LedgerRecords);
                sideEffects.Add(UncommittedRecord);

                return(new ExpectedSideEffects
                {
                    Inserts = LedgerRecords,
                    Delete = UncommittedRecord
                });
            });
        }
 public void Initialize()
 {
     this.target = new PersistCommittedAndUncommittedRecordsDbStatement(new Mock <IFifthweekDbConnectionFactory>(MockBehavior.Strict).Object);
 }