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_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
Exemple #3
0
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
        )
Exemple #4
0
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
Exemple #5
0
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_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)
Exemple #7
0
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
        )
Exemple #8
0
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
Exemple #9
0
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
Exemple #10
0
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)
Exemple #11
0
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_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)
Exemple #14
0
def test_get_customer(db: Session) -> None:
    customer = create_test_customer(db)

    stored_customer = services.customer.get(db=db, _id=customer.id)

    assert stored_customer
    assert stored_customer.full_name == customer.full_name
    assert stored_customer.address == customer.address
    assert stored_customer.phone_number == customer.phone_number
    assert stored_customer.id is not None
Exemple #15
0
def test_delete_customer(db: Session) -> None:
    customer = create_test_customer(db)

    deleted_customer = services.customer.remove(db=db, _id=customer.id)
    customer_after_delete = services.customer.get(db=db, _id=customer.id)

    assert customer_after_delete is None
    assert deleted_customer.id == customer.id
    assert deleted_customer.full_name == customer.full_name
    assert deleted_customer.address == customer.address
    assert deleted_customer.phone_number == customer.phone_number
Exemple #16
0
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_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_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)
Exemple #19
0
def test_update_customer(db: Session) -> None:
    customer = create_test_customer(db)

    customer_update_dto = CustomerUpdateDto(
        full_name="Test customer 2")  # type: ignore
    updated_customer = services.customer.update(db=db,
                                                db_obj=customer,
                                                obj_in=customer_update_dto)

    assert customer.id == updated_customer.id
    assert updated_customer.full_name is not None
    assert updated_customer.full_name == customer_update_dto.full_name
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
Exemple #21
0
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_get_customer_by_id(
    client: TestClient, superuser_token_headers: dict, db: Session
) -> None:
    customer = create_test_customer(db)
    response = client.get(
        f"{settings.API_V1_STR}/customers/{customer.id}",
        headers=superuser_token_headers,
    )
    assert response.status_code == 200
    content = response.json()
    assert content["id"] == customer.id
    assert content["full_name"] == customer.full_name
    assert content["address"] == customer.address
    assert content["phone_number"] == customer.phone_number
Exemple #23
0
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
Exemple #25
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_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
Exemple #27
0
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_delete_customer(
    client: TestClient, superuser_token_headers: dict, db: Session
) -> None:
    customer = create_test_customer(db)

    response = client.delete(
        f"{settings.API_V1_STR}/customers/{customer.id}",
        headers=superuser_token_headers,
    )
    assert response.status_code == 200

    response = client.get(
        f"{settings.API_V1_STR}/customers/{customer.id}",
        headers=superuser_token_headers,
    )
    assert response.status_code == 404
Exemple #29
0
def test_create_reservation_same_car_one_day_intersection_will_throw2(
    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, 2, 9)
    end_date2 = get_datetime(2030, 12, 5, 7)

    create_test_reservation(db, car, customer, start_date1, end_date1)

    with pytest.raises(ReservationCollisionException):
        create_test_reservation(db, car, customer, start_date2, end_date2)
Exemple #30
0
def test_create_reservation_with_custom_status_will_default_to_new(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.COLLECTED
    )

    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