def test_edit_user_valid(self, mock_db_session, mock_user_resource):
     edited_user_payload = copy.deepcopy(mock_user_resource)
     edited_user_payload["first_name"] = "Jane"
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_user_by_id"
     ) as mock_db_get:
         mock_db_get.side_effect = [
             UsersDBModel(**mock_user_resource),
             UsersDBModel(**edited_user_payload)
         ]
         user_service = UserService()
         response = user_service.update_user(mock_user_resource["id"],
                                             edited_user_payload)
     assert edited_user_payload == response
 def test_list_all_reservations_valid(self, mock_db_session,
                                      mock_books_resource,
                                      mock_users_resource,
                                      mock_reservations_resource):
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_full_reserved_books_info"
     ) as mock_db:
         reservations = []
         mock_result = []
         for index, reservation in enumerate(mock_reservations_resource):
             mock_user = mock_users_resource[index]
             mock_book = mock_books_resource[index]
             mock_reservation = ReservationsDBModel(
                 user_id=mock_user["id"],
                 book_id=mock_book["id"],
                 reservation_date=reservation["reservation_date"],
                 reservation_expiration_date=reservation[
                     "reservation_expiration_date"])
             reservations.append(
                 (UsersDBModel(**mock_user), BooksDBModel(**mock_book),
                  mock_reservation))
             mock_result.append({
                 "user":
                 mock_user,
                 "book":
                 mock_book,
                 "reservation_date":
                 reservation["reservation_date"],
                 "reservation_expiration_date":
                 reservation["reservation_expiration_date"]
             })
         mock_db.return_value = reservations
         reservation_service = ReservationService()
         response = reservation_service.list_reservations()
     assert mock_result == response
 def test_get_user_by_id(self, mock_db_session, mock_user_resource):
     mock_db_session.query(mock.ANY).filter(
         mock.ANY).one_or_none.return_value = UsersDBModel(
             **mock_user_resource)
     user_service = UserService()
     response = user_service.get_user("123")
     assert mock_user_resource == response
 def test_create_user_valid(self, mock_db_session, mock_user_payload,
                            mock_user_resource):
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_user_by_email"
     ) as mock_db_get:
         mock_db_get.side_effect = [
             None, UsersDBModel(**mock_user_resource)
         ]
         user_service = UserService()
         response = user_service.create_user(mock_user_payload)
     assert mock_user_resource == response
 def test_create_user_with_existing_email(self, mock_db_session,
                                          mock_user_payload,
                                          mock_user_resource):
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_user_by_email"
     ) as mock_db_get:
         mock_db_get.return_value = UsersDBModel(**mock_user_resource)
         user_service = UserService()
         with pytest.raises(UserAlreadyExists) as exc:
             response = user_service.create_user(mock_user_payload)
     assert f"User with email: {mock_user_payload['email']} already exists" in exc.value.args[
         0]
 def test_edit_user_invalid_email_change(self, mock_db_session,
                                         mock_user_resource):
     edited_user_payload = copy.deepcopy(mock_user_resource)
     edited_user_payload["email"] = "*****@*****.**"
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_user_by_id"
     ) as mock_db_get:
         mock_db_get.return_value = UsersDBModel(**mock_user_resource)
         user_service = UserService()
         with pytest.raises(InvalidFieldException) as exc:
             response = user_service.update_user(mock_user_resource["id"],
                                                 edited_user_payload)
         assert f"'email' is invalid" in exc.value.args[0]
 def test_get_reservation_by_user_and_book_id_valid(
         self, mock_db_session, mock_reservation_payload,
         mock_book_resource, mock_user_resource, mock_reservation_resource):
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_reserved_book_by_user_id_and_book_id"
     ) as mock_db:
         mock_db.return_value = (UsersDBModel(**mock_user_resource),
                                 BooksDBModel(**mock_book_resource),
                                 ReservationsDBModel(
                                     **mock_reservation_payload))
         reservation_service = ReservationService()
         response = reservation_service.get_reservation_by_user_id_and_book_id(
             book_id=mock_book_resource["id"],
             user_id=mock_user_resource["id"])
     assert mock_reservation_resource == response
 def test_create_reservation_already_exists(self, mock_db_session,
                                            mock_reservation_payload,
                                            mock_book_resource,
                                            mock_user_resource):
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_reserved_book_by_user_id_and_book_id"
     ) as mock_db:
         mock_db.return_value = (UsersDBModel(**mock_user_resource),
                                 BooksDBModel(**mock_book_resource),
                                 ReservationsDBModel(
                                     **mock_reservation_payload))
         reservation_service = ReservationService()
         with pytest.raises(ReservationAlreadyExists) as exc:
             response = reservation_service.add_reservation(
                 mock_reservation_payload)
         assert f"Reservation for user: {mock_user_resource['id']}" \
                f" and book: {mock_book_resource['id']} already exists" in exc.value.args[0]
 def test_create_reservation_valid(self, mock_db_session,
                                   mock_reservation_payload,
                                   mock_book_resource, mock_user_resource,
                                   mock_reservation_resource):
     with mock.patch(
             "library_backend.database.SQLiteDatabaseConnection.get_reserved_book_by_user_id_and_book_id"
     ) as mock_db:
         mock_db.side_effect = [
             None,
             (UsersDBModel(**mock_user_resource),
              BooksDBModel(**mock_book_resource),
              ReservationsDBModel(**mock_reservation_payload))
         ]
         reservation_service = ReservationService()
         response = reservation_service.add_reservation(
             mock_reservation_payload)
     assert mock_reservation_resource == response
 def test_get_all_users(self, mock_db_session, mock_users_resource):
     mock_users = [UsersDBModel(**user) for user in mock_users_resource]
     mock_db_session.query(mock.ANY).all.return_value = mock_users
     user_service = UserService()
     response = user_service.list_users()
     assert mock_users_resource == response