public async Task GetAllBooksAsync_ReturnsAllBooksAsyncTest()
        {
            //--Arrange
            var mockSet         = new Mock <DbSet <BookModel> >();
            var dataAsQueryable = Data.AsQueryable();

            mockSet.As <IDbAsyncEnumerable <BookModel> >()
            .Setup(m => m.GetAsyncEnumerator())
            .Returns(new TestDbAsyncEnumerator <BookModel>(dataAsQueryable.GetEnumerator()));

            mockSet.As <IQueryable <BookModel> >()
            .Setup(m => m.Provider)
            .Returns(new TestDbAsyncQueryProvider <BookModel>(dataAsQueryable.Provider));

            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Expression).Returns(dataAsQueryable.Expression);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.ElementType).Returns(dataAsQueryable.ElementType);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.GetEnumerator()).Returns(dataAsQueryable.GetEnumerator());

            var mockContext = new Mock <BookContext>();

            mockContext.Setup(c => c.Books).Returns(mockSet.Object);

            //--Act
            var library = new BookLibraryDb(mockContext.Object);
            var books   = await library.GetAllBooksAsync();

            //--Assert
            Assert.AreEqual(2, books.Count);
            Assert.AreEqual("J.R.R Tolkien", books[0].Author);
            Assert.AreEqual("Brandon Sanderson", books[1].Author);
        }
        public void AddBook_SavesBook_ViaContextTest()
        {
            //--Arrange
            var mockSet     = new Mock <DbSet <BookModel> >();
            var mockContext = new Mock <BookContext>();
            var library     = new BookLibraryDb(mockContext.Object);

            //--Act
            mockContext.Setup(m => m.Books).Returns(mockSet.Object);
            library.AddBook(new BookModel()
            {
                BookId      = 10000,
                Title       = "The Final Empire, Mistborn",
                Author      = "Brandon Sanderson",
                Description = "In a world where ash falls from the sky, and mist dominates the night, an evil cloaks the land and stifles all life. " +
                              "The future of the empire rests on the shoulders of a troublemaker and his young apprentice. " +
                              "Together, can they fill the world with color once more?",
                ImageUrl = "https://images.gr-assets.com/books/1480717416l/68428.jpg",
                IsRead   = false
            });

            //--Assert
            mockSet.Verify(m => m.Add(It.IsAny <BookModel>()), Times.Once);
            mockContext.Verify(m => m.SaveChanges(), Times.Once);
        }
        public void UpdateBook_UpdateBook_ViaContextTest()
        {
            //--Arrange
            var mockSet = new Mock <DbSet <BookModel> >();
            var data    = Data.AsQueryable();

            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Provider).Returns(data.Provider);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Expression).Returns(data.Expression);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.ElementType).Returns(data.ElementType);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
            var mockContext = new Mock <BookContext>();
            var library     = new BookLibraryDb(mockContext.Object);

            //--Act
            mockContext.Setup(m => m.Books).Returns(mockSet.Object);
            var updatedModel = (new BookModel()
            {
                BookId = 9999,
                Title = "Hobbit - Here and back",
                Author = "J.R.R Tolkien",
                Description = "In a hole in the ground there lived a hobbit. " +
                              "Not a nasty, dirty, wet hole, filled with the ends of worms and an oozy smell, " +
                              "nor yet a dry, bare, sandy hole with nothing in it to sit down on or to eat: " +
                              "it was a hobbit-hole, and that means comfort.",
                ImageUrl = "https://images.gr-assets.com/books/1372847500l/5907.jpg",
                IsRead = true
            });

            library.UpdateBook(updatedModel);

            //--Assert
            Assert.AreEqual(updatedModel.Title, mockSet.Object.FirstOrDefault(b => b.BookId == updatedModel.BookId)?.Title);
        }
        public virtual void OnDelete(BookModel book)
        {
            if (book == null)
            {
                return;
            }

            using (var context = new BookContext())
            {
                LibraryDb = new BookLibraryDb(context);
                LibraryDb.DeleteBook(book.BookId);
            }
        }
        public void DeleteBook_DeletesBook_ViaContextTest()
        {
            //--Arrange
            var mockSet = new Mock <DbSet <BookModel> >();
            var data    = Data.AsQueryable();

            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Provider).Returns(data.Provider);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Expression).Returns(data.Expression);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.ElementType).Returns(data.ElementType);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
            var mockContext = new Mock <BookContext>();
            var library     = new BookLibraryDb(mockContext.Object);

            //--Act
            mockContext.Setup(m => m.Books).Returns(mockSet.Object);
            library.DeleteBook(9999);

            //--Assert
            mockSet.Verify(m => m.Remove(It.IsAny <BookModel>()), Times.Once);
            mockContext.Verify(m => m.SaveChanges(), Times.Once);
        }
        public void GetAllBooksUnRead_ReturnsAllBooks_NotRead()
        {
            //--Arrange
            var mockSet         = new Mock <DbSet <BookModel> >();
            var dataAsQueryable = Data.AsQueryable();

            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Provider).Returns(dataAsQueryable.Provider);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Expression).Returns(dataAsQueryable.Expression);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.ElementType).Returns(dataAsQueryable.ElementType);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.GetEnumerator()).Returns(dataAsQueryable.GetEnumerator());
            var mockContext = new Mock <BookContext>();
            var library     = new BookLibraryDb(mockContext.Object);

            //-- Act
            mockContext.Setup(m => m.Books).Returns(mockSet.Object);
            var actual = library.GetAllBooksRead();

            //--Assert
            Assert.IsTrue(actual.Any());
            Assert.IsTrue(actual.Count == 1);
        }
        public void MarkBookAsRead_MarkAsReadByBookId_ViaContextTest()
        {
            //--Arrange
            var mockSet = new Mock <DbSet <BookModel> >();
            var data    = Data.AsQueryable();

            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Provider).Returns(data.Provider);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Expression).Returns(data.Expression);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.ElementType).Returns(data.ElementType);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
            var mockContext = new Mock <BookContext>();
            var library     = new BookLibraryDb(mockContext.Object);


            //-- Act
            mockContext.Setup(m => m.Books).Returns(mockSet.Object);
            library.MarkBookAsRead(9999);

            //--Assert
            mockContext.Verify(m => m.SaveChanges(), Times.Once);
            Assert.IsTrue(library.GetBook(9999).IsRead);
        }
        public void GetBook_ReturnsBookByBookId_ViaContextTests()
        {
            //--Arrange
            var mockSet = new Mock <DbSet <BookModel> >();
            var data    = Data.AsQueryable();

            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Provider).Returns(data.Provider);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.Expression).Returns(data.Expression);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.ElementType).Returns(data.ElementType);
            mockSet.As <IQueryable <BookModel> >().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
            var mockContext = new Mock <BookContext>();
            var library     = new BookLibraryDb(mockContext.Object);

            var expected = Data[0]; // Hobbit

            //-- Act
            mockContext.Setup(m => m.Books).Returns(mockSet.Object);
            var actual = library.GetBook(9999);

            //--Assert
            Assert.AreEqual(expected.Author, actual.Author);
        }