public async Task post_book_with_correct_data_should_return_status_code_201()
        {
            //Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(post_book_with_correct_data_should_return_status_code_201));
            var mapper = new Mock <IMapper>();
            var book   = new Book
            {
                Id          = 10,
                Title       = "Adaptive Code",
                Author      = "Gary McLean Hall",
                Description = "By applying this book’s principles, you can create code" +
                              " that accommodates new requirements and unforeseen scenarios without significant rewrites.",
                Isbn        = "978-1509302581",
                PublishedAt = new DateTime(2004, 10, 02)
            };

            mapper.Setup(x => x.Map <Book>(It.IsAny <CreationBookDto>())).Returns(book);
            var controller = new BookController(repository, mapper.Object);

            //Act
            var response = await controller.Post(CorrectDummyCreationBookDto()) as ObjectResult;

            var item = response?.Value as Book;

            //Assert
            response.StatusCode.Should().Be(201);
            item.Title.Should().BeEquivalentTo("Adaptive Code");
        }
        public async Task update_existing_book()
        {
            // Arrange
            var  repository = BookContextMocker.GetInMemoryBookRepository(nameof(get_book_with_existing_id));
            var  controller = new BookController(repository);
            Book newBook    = new Book()
            {
                Title     = "New_Book",
                Isbn      = "6622557799110",
                Published = Convert.ToDateTime("2002/11/06")
            };

            // Act
            await controller.Put(3, newBook);

            var response = await controller.Get(3) as ObjectResult;

            var book = response.Value as Book;

            // Assert
            Assert.Equal(200, response.StatusCode);
            Assert.Equal(newBook.Isbn, book.Isbn);
            Assert.Equal(newBook.Published, book.Published);
            Assert.Equal(newBook.Title, book.Title);
        }
        public async Task add_new_book()
        {
            // Arrange
            var  repository    = BookContextMocker.GetInMemoryBookRepository(nameof(get_book_with_existing_id));
            var  controller    = new BookController(repository);
            int  expectedValue = 6;
            Book newBook       = new Book()
            {
                Id        = 6,
                Title     = "New Book",
                Isbn      = "9900119922881",
                Published = Convert.ToDateTime("2010/10/10")
            };

            // Act
            await controller.Post(newBook);

            var response = await controller.GetAll() as ObjectResult;

            var books = response.Value as List <Book>;

            // Assert
            Assert.Equal(200, response.StatusCode);
            Assert.Equal(expectedValue, books.Count);
        }
        public async Task get_book_with_existing_id()
        {
            // Arrange
            var repository   = BookContextMocker.GetInMemoryBookRepository(nameof(get_book_with_existing_id));
            var controller   = new BookController(repository);
            var expectedBook = new Book()
            {
                Id        = 1,
                Title     = "Book_01",
                Isbn      = "1234567890123",
                Published = Convert.ToDateTime("2000/10/25")
            };

            // Act
            var response = await controller.Get(1) as ObjectResult;

            var book = response.Value as Book;

            // Assert
            Assert.Equal(200, response.StatusCode);
            Assert.Equal(expectedBook.Id, book.Id);
            Assert.Equal(expectedBook.Isbn, book.Isbn);
            Assert.Equal(expectedBook.Published, book.Published);
            Assert.Equal(expectedBook.Title, book.Title);
        }
        public async Task get_book_with_not_existing_isbn()
        {
            var repository = BookContextMocker.GetInMemoryBooksRepository(nameof(get_book_with_not_existing_isbn));
            var controller = new BookController(repository);

            var response = await controller.Get(1234567) as ObjectResult;

            var book = response.Value as Book;

            Assert.Equal(200, response.StatusCode);
            Assert.Equal(null, book);
        }
        public async Task get_book_with_existing_isbn()
        {
            var repository    = BookContextMocker.GetInMemoryBooksRepository(nameof(get_book_with_existing_isbn));
            var controller    = new BookController(repository);
            var expectedValue = "Harry Potter";

            var response = await controller.Get(123456) as ObjectResult;

            var book = response.Value as Book;

            Assert.Equal(200, response.StatusCode);
            Assert.Equal(expectedValue, book.Title);
        }
        public async Task get_all_books()
        {
            var repository = BookContextMocker.GetInMemoryBooksRepository(nameof(get_all_books));
            var controller = new BookController(repository);


            var response = await controller.GetAll() as ObjectResult;

            var books = response.Value as List <Book>;


            Assert.Equal(200, response.StatusCode);
            Assert.Equal(5, books.Count);
        }
        public async Task update_book_with_invalid_book_id_should_return_status_code_404()
        {
            //Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(post_book_with_exist_isbn_should_return_status_code_409));
            var mapper     = new Mock <IMapper>();
            var controller = new BookController(repository, mapper.Object);

            //Act
            var response = await controller.Put(222, ExistIsbnDummyCreationBookDto()) as ObjectResult;

            //Assert
            response.StatusCode.Should().Be(404);
        }
        public async Task get_book_with_nonexisting_id()
        {
            // Arrange
            var repository      = BookContextMocker.GetInMemoryBookRepository(nameof(get_book_with_nonexisting_id));
            var controller      = new BookController(repository);
            var expectedMessage = "The book record couldn't be found.";

            // Act
            var response = await controller.Get(9999999) as ObjectResult;

            // Assert
            Assert.Equal(StatusCodes.Status404NotFound, response.StatusCode);
            Assert.Equal(expectedMessage, response.Value);
        }
        public async Task update_book_with_correct_data_should_return_status_code_204()
        {
            //Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(update_book_with_correct_data_should_return_status_code_204));
            var mapper     = new Mock <IMapper>();
            var controller = new BookController(repository, mapper.Object);

            //Act
            var response = await controller.Put(2, ExistIsbnDummyCreationBookDto());

            //Assert
            response.Should().BeOfType <NoContentResult>();
        }
        public async Task post_book_with_exist_isbn_should_return_status_code_409()
        {
            //Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(post_book_with_exist_isbn_should_return_status_code_409));
            var mapper     = new Mock <IMapper>();
            var controller = new BookController(repository, mapper.Object);

            //Act
            var response = await controller.Post(ExistIsbnDummyCreationBookDto());

            //Assert
            response.Should().BeOfType <ConflictObjectResult>();
        }
        public async Task delete_book_with_not_existing_id_should_return_status_code_404()
        {
            //Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(delete_book_with_not_existing_id_should_return_status_code_404));
            var mapperMock = new Mock <IMapper>();
            var controller = new BookController(repository, mapperMock.Object);

            //Act
            var response = await controller.Delete(999);

            //Assert
            response.Should().BeOfType <NotFoundObjectResult>();
        }
        public async Task post_new_book_with_null()
        {
            // Arrange
            var  repository      = BookContextMocker.GetInMemoryBookRepository(nameof(post_new_book_with_null));
            var  controller      = new BookController(repository);
            Book bookToInsert    = null;
            var  expectedMessage = "Book is null.";

            // Act
            var response = await controller.Post(bookToInsert) as ObjectResult;

            // Assert
            Assert.Equal(StatusCodes.Status400BadRequest, response.StatusCode);
            Assert.Equal(expectedMessage, response.Value);
        }
        public async Task get_book_with_existing_id()
        {
            // Arrange
            var repository    = BookContextMocker.GetInMemoryBookRepository(nameof(get_book_with_existing_id));
            var controller    = new BookController(repository);
            var expectedTitle = "Zbrodnia i kara";

            // Act
            var response = await controller.Get(1) as ObjectResult;

            var book = response.Value as Book;

            // Assert
            Assert.Equal(StatusCodes.Status200OK, response.StatusCode);
            Assert.Equal(expectedTitle, book.Title);
        }
        public async Task get_book_by_isbn_with_not_existing_isbn_should_return_status_code_404()
        {
            // Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(get_book_by_isbn_with_not_existing_isbn_should_return_status_code_404));
            var mapperMock      = new Mock <IMapper>();
            var controller      = new BookController(repository, mapperMock.Object);
            var exceptedMessage = "Book with isbn '1111111111111' was not found ";

            //Act
            var response = await controller.GetByIsbn("1111111111111") as ObjectResult;

            //Assert
            response.StatusCode.Should().Be(404);
            response.Value.Should().BeEquivalentTo(exceptedMessage);
        }
        public async Task delete_existing_book()
        {
            // Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository(nameof(delete_existing_book));
            var controller = new BookController(repository);

            // Act
            var response = await controller.Delete(3);

            var getBooks = await controller.GetAll() as ObjectResult;

            var books = getBooks.Value as List <Book>;

            // Assert
            Assert.IsType <OkResult>(response);
            Assert.Equal(2, books.Count);
        }
        public async Task get_book_by_id_with_existing_id_should_return_status_code_200()
        {
            // Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(get_book_by_id_with_existing_id_should_return_status_code_200));
            var mapperMock     = new Mock <IMapper>();
            var controller     = new BookController(repository, mapperMock.Object);
            var expectedAuthor = "Jon Skeet";

            //Act
            var response = await controller.GetById(2) as ObjectResult;

            var book = response.Value as Book;

            //Assert
            response.StatusCode.Should().Be(200);
            book.Author.Should().BeEquivalentTo(expectedAuthor);
        }
        public async Task get_book_by_isbn_with_existing_isbn_should_return_status_code_200()
        {
            // Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(get_book_by_isbn_with_existing_isbn_should_return_status_code_200));
            var mapperMock    = new Mock <IMapper>();
            var controller    = new BookController(repository, mapperMock.Object);
            var expectedTitle = "Clean Architecture: A Craftsman's Guide to Software Structure and Design";

            //Act
            var response = await controller.GetByIsbn("978-0134494166") as ObjectResult;

            var book = response.Value as Book;

            //Assert
            response.StatusCode.Should().Be(200);
            book.Title.Should().BeEquivalentTo(expectedTitle);
        }
        public async Task search_book_by_phrase_code_should_return_status_code_200()
        {
            // Arrange
            var repository = BookContextMocker.GetInMemoryBookRepository
                                 (nameof(search_book_by_phrase_code_should_return_status_code_200));
            var mapperMock           = new Mock <IMapper>();
            var controller           = new BookController(repository, mapperMock.Object);
            var countOfExceptedBooks = 2;

            //Act
            var response = await controller.Search("Code") as ObjectResult;

            var books = response.Value as IEnumerable <Book>;

            //Assert
            response.StatusCode.Should().Be(200);
            books.Count().Should().Be(countOfExceptedBooks);
        }
        public async Task update_existing_book()
        {
            // Arrange
            var repository  = BookContextMocker.GetInMemoryBookRepository(nameof(update_existing_book));
            var controller  = new BookController(repository);
            var updatedBook = new Book()
            {
                Title  = "Ender's Game",
                Author = "Orson Scott Card",
                ISBN   = "312159785",
                Year   = 1985
            };

            // Act
            var response = await controller.Put(1, updatedBook);

            // Assert
            Assert.IsType <OkResult>(response);
        }
        public async Task delete_nonexisting_book()
        {
            // Arrange
            var repository      = BookContextMocker.GetInMemoryBookRepository(nameof(delete_nonexisting_book));
            var controller      = new BookController(repository);
            var expectedMessage = "The book to delete record couldn't be found.";

            // Act
            var response = await controller.Delete(999) as ObjectResult;

            var getBooks = await controller.GetAll() as ObjectResult;

            var books = getBooks.Value as List <Book>;

            // Assert
            Assert.Equal(StatusCodes.Status404NotFound, response.StatusCode);
            Assert.Equal(expectedMessage, response.Value);
            Assert.Equal(3, books.Count);
        }
        [Fact] async Task delete_existing_book()
        {
            // Arrange
            var repository    = BookContextMocker.GetInMemoryBookRepository(nameof(get_book_with_existing_id));
            var controller    = new BookController(repository);
            int expectedValue = 3;

            // Act
            await controller.Delete(1);

            await controller.Delete(3);

            var response = await controller.GetAll() as ObjectResult;

            var books = response.Value as List <Book>;

            // Assert
            Assert.Equal(200, response.StatusCode);
            Assert.Equal(expectedValue, books.Count);
        }
        public async Task update_nonexisting_id()
        {
            // Arrange
            var repository  = BookContextMocker.GetInMemoryBookRepository(nameof(update_nonexisting_id));
            var controller  = new BookController(repository);
            var updatedBook = new Book()
            {
                Title  = "Ender's Game",
                Author = "Orson Scott Card",
                ISBN   = "312159785",
                Year   = 1985
            };
            var expectedMessage = "The book to update record couldn't be found.";

            // Act
            var response = await controller.Put(999, updatedBook) as ObjectResult;

            // Assert
            Assert.Equal(StatusCodes.Status404NotFound, response.StatusCode);
            Assert.Equal(expectedMessage, response.Value);
        }
        public async Task post_new_book_on_existing_id()
        {
            // Arrange
            var repository   = BookContextMocker.GetInMemoryBookRepository(nameof(post_new_book_on_existing_id));
            var controller   = new BookController(repository);
            var bookToInsert = new Book()
            {
                Id     = 1,
                Title  = "Ender's Game",
                Author = "Orson Scott Card",
                ISBN   = "312159785",
                Year   = 1985
            };
            var expectedMessage = "Book with specified ID already exists.";

            // Act
            var response = await controller.Post(bookToInsert) as ObjectResult;

            // Assert
            Assert.Equal(StatusCodes.Status409Conflict, response.StatusCode);
            Assert.Equal(expectedMessage, response.Value);
        }
        public async Task post_new_book()
        {
            // Arrange
            var repository   = BookContextMocker.GetInMemoryBookRepository(nameof(post_new_book));
            var controller   = new BookController(repository);
            var bookToInsert = new Book()
            {
                Id     = 4,
                Title  = "Ender's Game",
                Author = "Orson Scott Card",
                ISBN   = "312159785",
                Year   = 1985
            };
            var expectedTitle = "Ender's Game";

            // Act
            var response = await controller.Post(bookToInsert) as ObjectResult;

            var bookreceived = response.Value as Book;

            // Assert
            Assert.Equal(StatusCodes.Status201Created, response.StatusCode);
            Assert.Equal(expectedTitle, bookreceived.Title);
        }