def test_update_rental_with_reservation_change_carid_customerid_will_throw( db: Session, ) -> None: car = create_test_car(db) customer = create_test_customer(db) car1 = create_test_car(db) customer2 = create_test_customer(db) start_date = get_datetime(2030, 12, 1, 9, 0) end_date = get_datetime(2030, 12, 2, 12, 0) reservation = create_test_reservation(db, car, customer, start_date, end_date) rental = create_test_rental( db, car, customer, start_date, end_date, reservation=reservation ) rental_update_dto = RentalUpdateDto( car_id=car1.id, customer_id=customer2.id, reservation_id=rental.reservation_id, start_date=rental.start_date, end_date=rental.end_date, status=rental.status, ) with pytest.raises(RentalAndReservationDifferenceException): services.rental.update(db=db, db_obj=rental, obj_in=rental_update_dto)
def test_update_car(client: TestClient, superuser_token_headers: dict, db: Session) -> None: car = create_test_car(db) data = { "model_name": "test", "type": "CAR", "fuel_type": "DIESEL", "gearbox_type": "AUTO", "ac_type": "AUTO", "number_of_passengers": 8, "drive_type": "FRONT", "number_of_airbags": 8, "price_per_day": "99.99", } response = client.put( f"{settings.API_V1_STR}/cars/{car.id}", headers=superuser_token_headers, json=data, ) assert response.status_code == 200 content = response.json() assert content["id"] == car.id assert content["model_name"] == car.model_name assert content["type"] == "CAR" assert content["number_of_passengers"] == data["number_of_passengers"]
def test_update_reservation_collected_to_new_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 3, 9) end_date1 = get_datetime(2030, 12, 4, 12) reservation = create_test_reservation(db, car, customer, start_date1, end_date1) reservation_update_dto = ReservationUpdateDto( car_id=reservation.car_id, customer_id=reservation.customer_id, start_date=reservation.start_date, end_date=reservation.end_date, status=ReservationStatus.COLLECTED, ) services.reservation.update( db=db, db_obj=reservation, obj_in=reservation_update_dto ) reservation_update_dto = ReservationUpdateDto( car_id=reservation.car_id, customer_id=reservation.customer_id, start_date=reservation.start_date, end_date=reservation.end_date + timedelta(days=1), status=ReservationStatus.NEW, ) with pytest.raises(UpdatingCollectedReservationException): services.reservation.update( db=db, db_obj=reservation, obj_in=reservation_update_dto )
def test_update_reservation( client: TestClient, superuser_token_headers: dict, db: Session ) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = datetime.now(tz=pytz.UTC) end_date = datetime.now(tz=pytz.UTC) + timedelta(milliseconds=1) reservation = create_test_reservation(db, car, customer, start_date, end_date) data = { "car_id": reservation.car_id, "customer_id": reservation.customer_id, "start_date": reservation.start_date.isoformat(), "end_date": reservation.end_date.isoformat(), "status": "COLLECTED", } response = client.put( f"{settings.API_V1_STR}/reservations/{reservation.id}", headers=superuser_token_headers, json=data, ) assert response.status_code == 200
def test_create_reservation_dates_collision_on_cancelled(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 3, 9) end_date1 = get_datetime(2030, 12, 4, 12) reservation = create_test_reservation(db, car, customer, start_date1, end_date1) reservation_update_dto = ReservationUpdateDto( car_id=reservation.car_id, customer_id=reservation.customer_id, start_date=reservation.start_date, end_date=reservation.end_date, status=ReservationStatus.CANCELLED, ) services.reservation.update( db=db, db_obj=reservation, obj_in=reservation_update_dto ) start_date2 = get_datetime(2030, 12, 3, 9) end_date2 = get_datetime(2030, 12, 4, 12) create_test_reservation(db, car, customer, start_date2, end_date2)
def test_update_reservation_dates_collision_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 3, 9) end_date1 = get_datetime(2030, 12, 4, 12) create_test_reservation(db, car, customer, start_date1, end_date1) start_date2 = get_datetime(2030, 12, 1, 9) end_date2 = get_datetime(2030, 12, 2, 12) reservation = create_test_reservation(db, car, customer, start_date2, end_date2) reservation_update_dto = ReservationUpdateDto( car_id=reservation.car_id, customer_id=reservation.customer_id, start_date=start_date1, end_date=end_date1, status=ReservationStatus.COLLECTED, ) with pytest.raises(ReservationCollisionException): services.reservation.update( db=db, db_obj=reservation, obj_in=reservation_update_dto )
def test_get_active_by_car_id_only_active(db: Session) -> None: car1 = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 1) end_date1 = get_datetime(2030, 12, 2) reservation = create_test_reservation( db, car1, customer, start_date1, end_date1, status=ReservationStatus.NEW ) reservation_update_dto = ReservationUpdateDto( car_id=reservation.car_id, customer_id=reservation.customer_id, start_date=reservation.start_date, end_date=reservation.end_date, status=ReservationStatus.CANCELLED, ) services.reservation.update( db=db, db_obj=reservation, obj_in=reservation_update_dto ) active_reservations = services.reservation.get_active_by_car_id(db, car1.id) assert len(active_reservations) == 0
def test_create_rental_with_reservation(client: TestClient, superuser_token_headers: dict, db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 24) end_date = get_datetime(2030, 12, 25) reservation = create_test_reservation(db, car, customer, start_date, end_date) data = { "car_id": car.id, "customer_id": customer.id, "reservation_id": reservation.id, "start_date": start_date.isoformat(), "end_date": end_date.isoformat(), "status": "IN_PROGRESS", } response = client.post( f"{settings.API_V1_STR}/rentals/", headers=superuser_token_headers, json=data, ) assert response.status_code == 200 content = response.json() assert "id" in content
def test_update_reservation(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 1) end_date = get_datetime(2030, 12, 2) reservation = create_test_reservation( db, car, customer, start_date, end_date, status=ReservationStatus.NEW ) reservation_update_dto = ReservationUpdateDto( car_id=reservation.car_id, customer_id=reservation.customer_id, start_date=reservation.start_date, end_date=reservation.end_date, status=ReservationStatus.COLLECTED, ) stored_reservation = services.reservation.update( db=db, db_obj=reservation, obj_in=reservation_update_dto ) assert stored_reservation assert stored_reservation.start_date == reservation.start_date assert stored_reservation.end_date == reservation.end_date assert stored_reservation.status == ReservationStatus.COLLECTED assert stored_reservation.id is not None
def test_update_completed_rental_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 1, 9, 0) end_date = get_datetime(2030, 12, 2, 12, 0) rental = create_test_rental(db, car, customer, start_date, end_date) rental_update_dto = RentalUpdateDto( car_id=rental.car_id, customer_id=rental.customer_id, start_date=rental.start_date, end_date=rental.end_date, status=RentalStatus.COMPLETED, ) services.rental.update(db=db, db_obj=rental, obj_in=rental_update_dto) rental_update_dto = RentalUpdateDto( car_id=rental.car_id, customer_id=rental.customer_id, start_date=rental.start_date + timedelta(days=1), end_date=rental.end_date, status=RentalStatus.COMPLETED, ) with pytest.raises(UpdatingCompletedRentalException): services.rental.update(db=db, db_obj=rental, obj_in=rental_update_dto)
def test_create_rental_end_before_start_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 2, 9, 0) end_date = get_datetime(2030, 12, 1, 12, 0) with pytest.raises(StartDateNotBeforeEndDateException): create_test_rental(db, car, customer, start_date, end_date)
def test_create_rental_in_the_past_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2020, 12, 1, 9, 0) end_date = get_datetime(2020, 12, 2, 12, 0) with pytest.raises(RentalCreatedInThePastException): create_test_rental(db, car, customer, start_date, end_date)
def test_create_reservation_in_the_past_will_throw(db: Session,) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2020, 12, 1, 9) end_date = get_datetime(2020, 12, 5, 12) with pytest.raises(ReservationCreatedInThePastException): create_test_reservation(db, car, customer, start_date, end_date)
def test_create_reservation_wrong_dates2(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 1, 9, 0) end_date = get_datetime(2030, 12, 1, 9, 0) with pytest.raises(StartDateNotBeforeEndDateException): create_test_reservation(db, car, customer, start_date, end_date)
def test_delete_car_no_permissions(client: TestClient, normal_user_token_headers: dict, db: Session) -> None: car = create_test_car(db) response = client.delete( f"{settings.API_V1_STR}/cars/{car.id}", headers=normal_user_token_headers, ) assert response.status_code == 401
def test_get_car(db: Session) -> None: car = create_test_car(db) stored_car = services.car.get(db=db, _id=car.id) assert stored_car assert stored_car.type == car.type assert stored_car.price_per_day == car.price_per_day assert stored_car.model_name == car.model_name assert stored_car.id is not None
def test_delete_car(db: Session) -> None: car = create_test_car(db) deleted_car = services.car.remove(db=db, _id=car.id) car_after_delete = services.car.get(db=db, _id=car.id) assert car_after_delete is None assert deleted_car.id == car.id assert deleted_car.price_per_day == car.price_per_day assert deleted_car.model_name == car.model_name
def test_get_overtime_rentals_no_overtime(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = datetime.now(tz=pytz.UTC) end_date1 = datetime.now(tz=pytz.UTC) + timedelta(days=1) rental = create_test_rental(db, car, customer, start_date1, end_date1) overtime = services.rental.get_overtime(db) assert rental.id not in [rental.id for rental in overtime]
def test_get_active(db: Session) -> None: car = create_test_car(db) car2 = create_test_car(db) customer = create_test_customer(db) customer2 = create_test_customer(db) start_date1 = get_datetime(2030, 12, 1) end_date1 = get_datetime(2030, 12, 2) start_date2 = get_datetime(2030, 12, 3) end_date2 = get_datetime(2030, 12, 4) create_test_reservation(db, car, customer, start_date1, end_date1) create_test_reservation(db, car, customer, start_date2, end_date2) create_test_reservation(db, car2, customer2, start_date2, end_date2) active_reservations = services.reservation.get_active(db) assert len(active_reservations) >= 3 # there might be other objects in db
def test_create_rental_collision_with_reservation_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 1) end_date = get_datetime(2030, 12, 2) create_test_reservation(db, car, customer, start_date, end_date) with pytest.raises(ReservationCollisionException): create_test_rental(db, car, customer, start_date, end_date)
def test_get_active_by_car_id(db: Session) -> None: car1 = create_test_car(db) car2 = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 1) end_date1 = get_datetime(2030, 12, 2) start_date2 = get_datetime(2030, 12, 3) end_date2 = get_datetime(2030, 12, 4) create_test_reservation( db, car1, customer, start_date1, end_date1, status=ReservationStatus.NEW ) create_test_reservation( db, car2, customer, start_date2, end_date2, status=ReservationStatus.NEW ) active_reservations = services.reservation.get_active_by_car_id(db, car2.id) assert len(active_reservations) == 1
def test_create_reservation_same_car_different_intervals(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 5, 9) end_date1 = get_datetime(2030, 12, 9, 12) start_date2 = get_datetime(2030, 12, 10, 3) end_date2 = get_datetime(2030, 12, 15, 7) create_test_reservation(db, car, customer, start_date1, end_date1) create_test_reservation(db, car, customer, start_date2, end_date2)
def test_delete_rental(client: TestClient, superuser_token_headers: dict, db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 24) end_date = get_datetime(2030, 12, 25) rental = create_test_rental(db, car, customer, start_date, end_date) response = client.delete(f"{settings.API_V1_STR}/rentals/{rental.id}", headers=superuser_token_headers) assert response.status_code == 200
def test_get_car_by_id(client: TestClient, superuser_token_headers: dict, db: Session) -> None: car = create_test_car(db) response = client.get( f"{settings.API_V1_STR}/cars/{car.id}", headers=superuser_token_headers, ) assert response.status_code == 200 content = response.json() assert content["id"] == car.id assert content["model_name"] == car.model_name assert content["type"] == "CAR" assert content["number_of_passengers"] == car.number_of_passengers
def test_create_reservation_same_car_same_dates_will_throw(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 1, 9) end_date1 = get_datetime(2030, 12, 2, 12) start_date2 = get_datetime(2030, 12, 1, 11) end_date2 = get_datetime(2030, 12, 2, 15) create_test_reservation(db, car, customer, start_date1, end_date1) with pytest.raises(ReservationCollisionException): create_test_reservation(db, car, customer, start_date2, end_date2)
def test_get_overtime_rentals(client: TestClient, superuser_token_headers: dict, db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = datetime.now(tz=pytz.UTC) end_date = datetime.now(tz=pytz.UTC) + timedelta(milliseconds=1) create_test_rental(db, car, customer, start_date, end_date) response = client.get(f"{settings.API_V1_STR}/rentals/overtime", headers=superuser_token_headers) assert response.status_code == 200 assert len(response.json()) > 0
def test_create_reservation(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 1, 9, 0) end_date = get_datetime(2030, 12, 2, 12, 0) reservation = create_test_reservation(db, car, customer, start_date, end_date) assert reservation.id is not None assert reservation.start_date == start_date assert reservation.end_date == end_date assert reservation.status == ReservationStatus.NEW assert reservation.car == car assert reservation.customer == customer
def test_delete_car(client: TestClient, superuser_token_headers: dict, db: Session) -> None: car = create_test_car(db) response = client.delete( f"{settings.API_V1_STR}/cars/{car.id}", headers=superuser_token_headers, ) assert response.status_code == 200 response = client.get( f"{settings.API_V1_STR}/cars/{car.id}", headers=superuser_token_headers, ) assert response.status_code == 404
def test_mark_reservation_collected(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date1 = get_datetime(2030, 12, 1) end_date1 = get_datetime(2030, 12, 2) reservation = create_test_reservation(db, car, customer, start_date1, end_date1) services.reservation.mark_collected(db=db, reservation_id=reservation.id) updated_reservation = services.reservation.get(db=db, _id=reservation.id) assert updated_reservation assert updated_reservation.id == reservation.id assert updated_reservation.status == ReservationStatus.COLLECTED
def test_create_standalone_rental(db: Session) -> None: car = create_test_car(db) customer = create_test_customer(db) start_date = get_datetime(2030, 12, 1, 9, 0) end_date = get_datetime(2030, 12, 2, 12, 0) rental = create_test_rental(db, car, customer, start_date, end_date) assert rental.id is not None assert rental.start_date == start_date assert rental.end_date == end_date assert rental.status == RentalStatus.IN_PROGRESS assert rental.reservation is None assert rental.car == car assert rental.customer == customer