public async Task TestNoSqlBookUpdaterOk()
        {
            //SETUP
            var config  = AppSettings.GetConfiguration();
            var builder = new DbContextOptionsBuilder <NoSqlDbContext>()
                          .UseCosmos(
                config["endpoint"],
                config["authKey"],
                nameof(TestNoSqlBookUpdaterAsync));


            using (var sqlContext = new SqlDbContext(_sqlOptions))
                using (var noSqlContext = new NoSqlDbContext(builder.Options))
                {
                    await sqlContext.Database.EnsureCreatedAsync();

                    await noSqlContext.Database.EnsureCreatedAsync();

                    var updater = new NoSqlBookUpdater(noSqlContext);

                    //ATTEMPT
                    var book = DddEfTestData.CreateDummyBookOneAuthor();
                    sqlContext.Add(book);
                    var hasUpdates = updater.FindBookChangesToProjectToNoSql(sqlContext);
                    await updater.CallBaseSaveChangesWithNoSqlWriteInTransactionAsync(sqlContext, () => sqlContext.SaveChangesAsync());

                    //VERIFY
                    hasUpdates.ShouldBeTrue();
                    sqlContext.Books.Count().ShouldEqual(1);
                    (await noSqlContext.Books.CountAsync(p => p.BookId == book.BookId)).ShouldEqual(1);
                }
        }
        public async Task TestNoSqlBookUpdaterOk()
        {
            //SETUP
            var config  = AppSettings.GetConfiguration();
            var builder = new DbContextOptionsBuilder <NoSqlDbContext>()
                          .UseCosmos(
                config["endpoint"],
                config["authKey"],
                GetType().Name);


            using var sqlContext   = new SqlDbContext(_sqlOptions);
            using var noSqlContext = new NoSqlDbContext(builder.Options);

            await sqlContext.Database.EnsureCreatedAsync();

            await noSqlContext.Database.EnsureCreatedAsync();

            var updater = new NoSqlBookUpdater(noSqlContext);

            //ATTEMPT
            var book = DddEfTestData.CreateDummyBookOneAuthor();

            sqlContext.Add(book);
            var numBooksChanged = updater.FindNumBooksChanged(sqlContext);
            await updater.CallBaseSaveChangesWithNoSqlWriteInTransactionAsync(sqlContext, numBooksChanged,
                                                                              () => sqlContext.SaveChangesAsync());

            //VERIFY
            numBooksChanged.ShouldEqual(1);
            sqlContext.Books.Count().ShouldEqual(1);
            noSqlContext.Books.Find(book.BookId).ShouldNotBeNull();
        }
        public async Task TestNoSqlBookUpdaterFail_NoBookAddedToSqlDatabase()
        {
            //SETUP
            var config  = AppSettings.GetConfiguration();
            var builder = new DbContextOptionsBuilder <NoSqlDbContext>()
                          .UseCosmos(
                config["endpoint"],
                config["authKey"],
                "UNKNOWNDATASBASENAME");


            using (var sqlContext = new SqlDbContext(_sqlOptions))
                using (var noSqlContext = new NoSqlDbContext(builder.Options))
                {
                    await sqlContext.Database.EnsureCreatedAsync();

                    var updater = new NoSqlBookUpdater(noSqlContext);

                    //ATTEMPT
                    var book = DddEfTestData.CreateDummyBookOneAuthor();
                    sqlContext.Add(book);
                    var hasUpdates = updater.FindBookChangesToProjectToNoSql(sqlContext);
                    var ex         = await Assert.ThrowsAsync <HttpException>(async() =>
                                                                              await updater.CallBaseSaveChangesWithNoSqlWriteInTransactionAsync(sqlContext, () => sqlContext.SaveChangesAsync()));

                    //VERIFY
                    ex.Message.ShouldEqual("NotFound");
                    hasUpdates.ShouldBeTrue();
                    sqlContext.Books.Count().ShouldEqual(0);
                }
        }
        public async Task TestNoSqlBookUpdaterFail_NoBookAddedToSqlDatabase()
        {
            //SETUP
            var config  = AppSettings.GetConfiguration();
            var builder = new DbContextOptionsBuilder <NoSqlDbContext>()
                          .UseCosmos(
                config["endpoint"],
                config["authKey"],
                "UNKNOWNDATASBASENAME");


            using (var sqlContext = new SqlDbContext(_sqlOptions))
                using (var noSqlContext = new NoSqlDbContext(builder.Options))
                {
                    await sqlContext.Database.EnsureCreatedAsync();

                    var updater = new NoSqlBookUpdater(noSqlContext);

                    //ATTEMPT
                    var book = DddEfTestData.CreateDummyBookOneAuthor();
                    sqlContext.Add(book);
                    var numBooksChanged = updater.FindNumBooksChanged(sqlContext);
                    var ex = await Assert.ThrowsAsync <CosmosException>(async() =>
                                                                        await updater.CallBaseSaveChangesWithNoSqlWriteInTransactionAsync(sqlContext, numBooksChanged,
                                                                                                                                          () => sqlContext.SaveChangesAsync()));

                    //VERIFY
                    ex.Message.ShouldStartWith("Response status code does not indicate success: 404 Substatus:");
                    numBooksChanged.ShouldEqual(1);
                    sqlContext.Books.Count().ShouldEqual(0);
                }
        }