def test_get_book_by_filter_no_filter(self):
        # Check response of get_book_by_filter if no filters are specified. [Should return all books]
        for i in range(3):
            db_util.add_book(self.get_book_json(i))

        self.assertEqual(db_util.get_all_books(),
                         db_util.get_books_by_filter())
    def test_delete_exiting_book(self):
        # Check response when an existing book is deleted.
        book_data = self.get_book_data(0)
        book_dict = self.get_book_dict(book_data)
        added_book = db_util.add_book(book_dict)

        response = self.client.delete(
            url_for("api_blueprint.delete_book", book_id=added_book.id))
        self.assertEqual(response.status_code, 200)
        data = response.get_data()
        self.assertIsNotNone(data)
        data = json.loads(data)
        self.assertEqual(added_book.book_name, data["book_name"])
        self.assertEqual(added_book.author_name, data["author_name"])
        self.assertEqual(added_book.comments, data["comments"])

        # Check if the book has actually been deleted.
        response = self.client.delete(
            url_for("api_blueprint.get_book", book_id=added_book.id))
        self.assertEqual(response.status_code, 404)

        # Add and delete multiple books just to be sure.
        books = [
            db_util.add_book(self.get_book_dict(self.get_book_data(i)))
            for i in range(3)
        ]

        for i in range(3):
            response = self.client.delete(
                url_for("api_blueprint.delete_book", book_id=books[i].id))
            self.assertEqual(response.status_code, 200)
            self.assertEqual(len(db_util.get_all_books()), (3 - i) - 1)
    def test_delete_all_books(self):
        # Check response when all books are tried to be deleted.
        for i in range(3):
            db_util.add_book(self.get_book_dict(self.get_book_data(i)))

        response = self.client.delete("/api/books")
        self.assertEqual(response.status_code, 405)
    def test_remove_book(self):
        org_book = db_util.add_book(self.get_book_json(0))
        org_book_2 = db_util.add_book(self.get_book_json(1))

        book = db_util.remove_book(org_book.id)
        self.assertTrue(book.book_name == org_book.book_name)
        self.assertTrue(book.author_name == org_book.author_name)
        self.assertTrue(book.comments == org_book.comments)
        self.assertTrue(len(db_util.get_all_books()) == 1)

        db_util.remove_book(org_book_2.id)
        self.assertTrue(len(db_util.get_all_books()) == 0)
    def test_get_book_by_filter_author_name(self):
        # Check response of get_book_by_filter when the author's name is provided.
        for i in range(2):
            db_util.add_book(self.get_book_json(i))

        required_book = self.get_book_json(0)
        books = db_util.get_books_by_filter(
            author_name=required_book["author_name"])
        self.assertIsNotNone(books)
        self.assertEqual(len(books), 1)
        book = books[0]
        self.assertEqual(required_book["book_name"], book.book_name)
        self.assertEqual(required_book["author_name"], book.author_name)
        self.assertEqual(required_book["comments"], book.comments)
    def test_bookname_unique_constraint(self):
        # Check the response when two books with same name are added to the DB.
        book_json = self.get_book_json(0)
        db_util.add_book(book_json)
        book_json["author"] = "somethingelse"
        book_json["comments"] = "some other comment."

        unique_constraint_raised = False
        try:
            db_util.add_book(book_json)
        except:
            unique_constraint_raised = True

        self.assertTrue(unique_constraint_raised)
 def test_add_book(self):
     book_json = self.get_book_json(0)
     book = db_util.add_book(book_json)
     self.assertTrue(book is not None)
     self.assertTrue(book.book_name == book_json["book_name"])
     self.assertTrue(book.author_name == book_json["author_name"])
     self.assertTrue(book.comments == book_json["comments"])
    def test_get_all_books(self):
        books = []
        books.append(db_util.add_book(self.get_book_json(0)))
        all_books = db_util.get_all_books()

        self.assertTrue(all_books is not None)
        self.assertTrue(len(all_books) == 1)

        books.append(db_util.add_book(self.get_book_json(1)))
        all_books = db_util.get_all_books()
        self.assertTrue(len(all_books) == 2)

        books.append(db_util.add_book(self.get_book_json(2)))
        all_books = db_util.get_all_books()
        self.assertTrue(len(all_books) == 3)

        for i in range(3):
            self.assertTrue(books[i].book_name == all_books[i].book_name)
            self.assertTrue(books[i].author_name == all_books[i].author_name)
            self.assertTrue(books[i].comments == all_books[i].comments)
    def test_get_book(self):
        book_from_get = db_util.get_book(-1)
        self.assertTrue(book_from_get is None)

        book_json = self.get_book_json(0)
        book = db_util.add_book(book_json)
        book_from_get = db_util.get_book(book.id)
        self.assertTrue(book_from_get is not None)
        self.assertTrue(book.book_name == book_from_get.book_name)
        self.assertTrue(book.author_name == book_from_get.author_name)
        self.assertTrue(book.comments == book_from_get.comments)
    def test_update_book_authorname(self):
        book_json = self.get_book_json(0)

        # Modifying only the author name.
        modified_json = book_json.copy()
        modified_json["author_name"] = "New author name"

        org_book = db_util.add_book(book_json)
        updated_book = db_util.update_book(org_book.id, modified_json)

        self.assertTrue(book_json["book_name"] == updated_book.book_name)
        self.assertTrue(book_json["comments"] == updated_book.comments)
        self.assertTrue(book_json["author_name"] != updated_book.author_name)
    def test_update_book_all(self):
        book_json = self.get_book_json(0)

        # Modifying all the attributes.
        modified_json = book_json.copy()
        modified_json["author_name"] = "New author name"
        modified_json["book_name"] = "New book name"
        modified_json["comments"] = "Updated comments."

        org_book = db_util.add_book(book_json)
        updated_book = db_util.update_book(org_book.id, modified_json)

        self.assertTrue(book_json["book_name"] != updated_book.book_name)
        self.assertTrue(book_json["comments"] != updated_book.comments)
        self.assertTrue(book_json["author_name"] != updated_book.author_name)
    def test_get_book_that_exists(self):
        # Check response when a book that exists is requested.
        book_data = self.get_book_data(0)
        book_dict = self.get_book_dict(book_data)
        added_book = db_util.add_book(book_dict)

        response = self.client.get(
            url_for("api_blueprint.get_book", book_id=added_book.id))
        self.assertEqual(response.status_code, 200)
        data = response.get_data()
        self.assertIsNotNone(data)
        data = json.loads(data)
        for key in ("book_name", "author_name", "comments", "id", "url"):
            self.assertIn(key, data)
        self.assertEqual(data["book_name"], added_book.book_name)
        self.assertEqual(data["author_name"], added_book.author_name)
        self.assertEqual(data["comments"], added_book.comments)
 def test_get_all_books(self):
     # Check the response for get all books.
     books = [
         db_util.add_book(self.get_book_dict(self.get_book_data(i)))
         for i in range(5)
     ]
     response = self.client.get(url_for("api_blueprint.get_all_books"))
     self.assertEqual(response.status_code, 200)
     data = response.get_data()
     self.assertIsNotNone(data)
     data = json.loads(data)
     for index, book_json in enumerate(data["books"]):
         book = json.loads(book_json)
         self.assertEqual(books[index].id, book["id"])
         self.assertEqual(books[index].book_name, book["book_name"])
         self.assertEqual(books[index].author_name, book["author_name"])
         self.assertEqual(books[index].comments, book["comments"])
         self.assertEqual(books[index].author_name, book["author_name"])