public void TestAddReviewToCreatedBookAndCheckReviewAddedHandlerOk() { //SETUP var showLog = false; var options = SqliteInMemory.CreateOptionsWithLogging <SqlEventsDbContext>(x => { if (showLog) { _output.WriteLine(x.DecodeMessage()); } }); var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookOneAuthor(); context.Add(book); context.SaveChanges(); //ATTEMPT showLog = true; book.AddReview(4, "OK", "me"); context.SaveChanges(); //VERIFY book.ReviewsCount.ShouldEqual(1); book.ReviewsAverageVotes.ShouldEqual(4); }
public void TestCreateBookAndCheckPartsOk() { //SETUP var options = SqliteInMemory.CreateOptionsWithLogging <SqlEventsDbContext>(x => _output.WriteLine(x.Message)); using (var context = new SqlEventsDbContext(options, null)) { context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookTwoAuthorsTwoReviews(); context.Add(book); context.SaveChanges(); } using (var context = new SqlEventsDbContext(options, null)) { //ATTEMPT var bookWithRelationships = context.Books .Include(p => p.AuthorsLink).ThenInclude(p => p.Author) .Include(p => p.Reviews) .Single(); //VERIFY bookWithRelationships.AuthorsLink.Select(y => y.Author.Name).OrderBy(x => x).ToArray() .ShouldEqual(new[] { "Author1", "Author2" }); bookWithRelationships.Reviews.Count().ShouldEqual(2); } }
public void TestAddReviewConcurrencyFixed() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); var config = new GenericEventRunnerConfig(); config.RegisterSaveChangesExceptionHandler <SqlEventsDbContext>(BookWithEventsConcurrencyHandler.HandleCacheValuesConcurrency); var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(config: config); context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookOneAuthor(); context.Add(book); context.SaveChanges(); book.AddReview(4, "OK", "me"); //This simulates adding a review with NumStars of 2 before the AddReview context.Database.ExecuteSqlRaw( "UPDATE Books SET ReviewsCount = @p0, ReviewsAverageVotes = @p1 WHERE BookId = @p2", 1, 2, book.BookId); //ATTEMPT context.SaveChanges(); //VERIFY var foundBook = context.Find <BookWithEvents>(book.BookId); foundBook.ReviewsCount.ShouldEqual(2); foundBook.ReviewsAverageVotes.ShouldEqual(6.0 / 2.0); }
public void TestBookDeletedConcurrencyFixed() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); var config = new GenericEventRunnerConfig(); config.RegisterSaveChangesExceptionHandler <SqlEventsDbContext>(BookWithEventsConcurrencyHandler.HandleCacheValuesConcurrency); var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(config: config); context.Database.EnsureCreated(); var books = WithEventsEfTestData.CreateDummyBooks(2); context.AddRange(books); context.SaveChanges(); //ATTEMPT books.First().AuthorsLink.Last().Author.ChangeName("New common name"); //This simulates changing the AuthorsOrdered value context.Database.ExecuteSqlRaw("DELETE FROM Books WHERE BookId = @p0", books.First().BookId); //ATTEMPT context.SaveChanges(); //VERIFY var readBooks = context.Books.ToList(); readBooks.Count().ShouldEqual(1); readBooks.First().AuthorsOrdered.ShouldEqual("Author0001, New common name"); }
public void TestCreateBookWithOneAuthorAndChangeTheAuthorsName() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); { var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookOneAuthor(); context.Add(book); context.SaveChanges(); //ATTEMPT book.AuthorsOrdered.ShouldEqual("Test Author"); book.AuthorsLink.First().Author.ChangeName("New name"); context.SaveChanges(); //VERIFY context.Books.First().AuthorsOrdered.ShouldEqual("New name"); } }
public void TestBookRemoveReviewCausesEventOk() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); using (var context = new SqlEventsDbContext(options, null)) { context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookTwoAuthorsTwoReviews(); context.Add(book); context.SaveChanges(); book.GetBeforeSaveEventsThenClear(); //ATTEMPT book.RemoveReview(book.Reviews.First().ReviewId); //VERIFY var dEvent = book.GetBeforeSaveEventsThenClear().Single(); dEvent.ShouldBeType <BookReviewRemovedEvent>(); } }
public void TestCreateBookWithReviewsThenRemoveReviewCheckReviewRemovedHandlerOk() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); { var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookTwoAuthorsTwoReviews(); context.Add(book); context.SaveChanges(); //ATTEMPT var reviewToRemove = book.Reviews.First(); book.RemoveReview(reviewToRemove.ReviewId); context.SaveChanges(); //VERIFY book.ReviewsCount.ShouldEqual(1); book.ReviewsAverageVotes.ShouldEqual(1); } }
public void TestAuthorChangeNameCausesEventOk() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); using (var context = new SqlEventsDbContext(options, null)) { context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookTwoAuthorsTwoReviews(); context.Add(book); context.SaveChanges(); var author = book.AuthorsLink.First().Author; author.GetBeforeSaveEventsThenClear(); //ATTEMPT author.ChangeName("new name"); //VERIFY var dEvent = author.GetBeforeSaveEventsThenClear().Single(); dEvent.ShouldBeType <AuthorNameUpdatedEvent>(); } }
public void TestCreateBookTwoAuthorsChangeCommonAuthorOk() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); { var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var books = WithEventsEfTestData.CreateDummyBooks(2); context.AddRange(books); context.SaveChanges(); //ATTEMPT books.First().AuthorsOrdered.ShouldEqual("Author0000, CommonAuthor"); books.First().AuthorsLink.Last().Author.ChangeName("New common name"); context.SaveChanges(); //VERIFY var readBooks = context.Books.ToList(); readBooks.First().AuthorsOrdered.ShouldEqual("Author0000, New common name"); readBooks.Last().AuthorsOrdered.ShouldEqual("Author0001, New common name"); } }
public void TestAddReviewCauseConcurrencyThrown() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookOneAuthor(); context.Add(book); context.SaveChanges(); //ATTEMPT book.AddReview(4, "OK", "me"); //This simulates adding a review with NumStars of 2 before the AddReview context.Database.ExecuteSqlRaw( "UPDATE Books SET ReviewsCount = @p0, ReviewsAverageVotes = @p1 WHERE BookId = @p2", 1, 2, book.BookId); //VERIFY Assert.Throws <DbUpdateConcurrencyException>(() => context.SaveChanges()); }
public void TestChangeAuthorOrderedCauseConcurrencyThrown() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var books = WithEventsEfTestData.CreateDummyBooks(2); context.AddRange(books); context.SaveChanges(); //ATTEMPT books.First().AuthorsLink.Last().Author.ChangeName("New common name"); //This simulates changing the AuthorsOrdered value context.Database.ExecuteSqlRaw( "UPDATE Books SET AuthorsOrdered = @p0 WHERE BookId = @p1", "different author string", books.First().BookId); //VERIFY Assert.Throws <DbUpdateConcurrencyException>(() => context.SaveChanges()); }
public void TestAddReviewToExistingBookAndCheckReviewAddedHandlerOk() { //SETUP var options = SqliteInMemory.CreateOptions <SqlEventsDbContext>(); { var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); context.Database.EnsureCreated(); var book = WithEventsEfTestData.CreateDummyBookOneAuthor(); context.Add(book); context.SaveChanges(); } { var context = options.CreateDbWithDiForHandlers <SqlEventsDbContext, ReviewAddedHandler>(); var book = context.Books.Single(); //ATTEMPT book.AddReview(4, "OK", "me", context); context.SaveChanges(); //VERIFY book.ReviewsCount.ShouldEqual(1); book.ReviewsAverageVotes.ShouldEqual(4); } }