class TestBookModel(BaseTestCase): def setUp(self): super().setUp() self.user = User( email='*****@*****.**', password='******', registered_on=datetime.datetime.utcnow() ) db.session.add(self.user) self.book = Book( name='Test' ) db.session.add(self.user) db.session.add(self.book) db.session.commit() self.ratings_len = 5 self.ratings = [Rating(user_id=self.user.id, book_id=self.book.id, value=randint(1, 5)) for _ in range(self.ratings_len)] db.session.add_all(self.ratings) for rating in self.ratings: self.book.add_rating_count() self.book.add_rating_sum(rating.value) db.session.add(self.book) db.session.commit() def test_ratings_value(self): avg = sum(rating.value for rating in self.ratings) / self.ratings_len self.assertEqual(self.book.rating, avg)
def test_add_book_rating(self): book_with_empty_rating = Book(name='book_with_empty_rating') db.session.add(book_with_empty_rating) db.session.commit() rating_value = 4 success_response_object = { 'status': 'success', 'message': 'New rating for book successfully added.', } fail_response_object = { 'status': 'fail', 'message': 'Book or user does not exists.', } response_object, code = add_book_rating(self.user.id, book_with_empty_rating.id, {'value': rating_value}) self.assertEqual(response_object, success_response_object) self.assertEqual(code, 201) self.assertEqual(book_with_empty_rating.rating, rating_value) response_object, code = add_book_rating(self.user.id, 999, {'value': rating_value}) self.assertEqual(response_object, fail_response_object) self.assertEqual(code, 404) response_object, code = add_book_rating(999, book_with_empty_rating.id, {'value': rating_value}) self.assertEqual(response_object, fail_response_object) self.assertEqual(code, 404) with self.assertRaises(AssertionError): add_book_rating(999, book_with_empty_rating.id, {'value': 999})
def setUp(self): super().setUp() self.user = User(email='*****@*****.**', password='******', registered_on=datetime.datetime.utcnow()) db.session.add(self.user) self.book = Book(name='Test') db.session.add(self.user) db.session.add(self.book) db.session.commit() self.ratings_len = 5 self.ratings = [ Rating(user_id=self.user.id, book_id=self.book.id, value=randint(1, 5)) for _ in range(self.ratings_len) ] db.session.add_all(self.ratings) db.session.commit()
def setUp(self): super().setUp() self.user = User( email='*****@*****.**', password='******', registered_on=datetime.datetime.utcnow() ) self.writer = Writer( first_name='Test', last_name='Test' ) self.writer_books = [Book(name=f'Book{i}', authors=[self.writer]) for i in range(10)] db.session.add(self.user) db.session.add(self.writer) db.session.add_all(self.writer_books) db.session.commit() self.ratings = [Rating(user_id=self.user.id, book_id=book.id, value=randint(1, 5)) for book in self.writer_books] db.session.add_all(self.ratings) db.session.commit()
def test_delete_book(self): book_for_delete = Book(name='TestForDelete') db.session.add(book_for_delete) db.session.commit() deleted_book_id = book_for_delete.id success_response_object = { 'status': 'success', 'message': 'Book successfully deleted.', } fail_response_object = { 'status': 'fail', 'message': 'Book does not exists.', } response_object, code = delete_book(deleted_book_id) self.assertEqual(response_object, success_response_object) self.assertEqual(code, 204) response_object, code = delete_book(9999) self.assertEqual(response_object, fail_response_object) self.assertEqual(code, 404)
def save_new_book(data): book_exists = Book.query.filter_by(name=data['name']).first() if not book_exists: authors_data = data.get('authors', []) authors = [] for author_data in authors_data: author = get_or_create(db, Writer, first_name=author_data.get('first_name'), last_name=author_data.get('last_name')) authors.append(author) new_book = Book(name=data['name'], authors=authors) save_changes(new_book) response_object = { 'status': 'success', 'message': 'Book successfully created.', } return response_object, 201 else: response_object = { 'status': 'fail', 'message': 'Book already exists. Please try other name.', } return response_object, 409