예제 #1
0
def test_landlord_process_another_appliation_when_one_application_was_unsuccessful_ok(
    session: Session,
    application: Application,
    failed_apartment_application: ApartmentApplication,
    another_considered_apartment_application: ApartmentApplication,
):
    assert (another_considered_apartment_application.status ==
            ApartmentApplicationStatus.CONSIDERED)
    assert (not session.query(ApartmentApplication).join(Contract).filter(
        or_(
            ApartmentApplication.status
            == ApartmentApplicationStatus.PROCESSING,
            ApartmentApplication.status == ApartmentApplicationStatus.AWARDED,
        )).count())
    application.process_apartment_application(
        session, another_considered_apartment_application)
    session.expire_all()
    assert (another_considered_apartment_application.status ==
            ApartmentApplicationStatus.PROCESSING)
    assert (session.query(ApartmentApplication).join(Contract).filter(
        or_(
            ApartmentApplication.status ==
            ApartmentApplicationStatus.PROCESSING,
            ApartmentApplication.status == ApartmentApplicationStatus.AWARDED,
        )).count() == 1)
예제 #2
0
def test_all_other_applications_rejected_on_application_completed_ok(
    session: Session,
    application: Application,
    new_apartment_applications: List[ApartmentApplication],
):
    assert len(new_apartment_applications) == 5
    assert all(app.status == ApartmentApplicationStatus.NEW
               for app in new_apartment_applications)
    app1, app2, app3, app4, app5 = new_apartment_applications
    application.reject_apartment_application(session, app1)
    application.consider_apartment_application(session, app2)
    application.consider_apartment_application(session, app3)
    application.process_apartment_application(session, app3)
    application.consider_apartment_application(session, app4)
    application.consider_apartment_application(session, app5)
    assert app1.status == ApartmentApplicationStatus.REJECTED
    assert all(app.status == ApartmentApplicationStatus.CONSIDERED
               for app in (app2, app4, app5))
    assert app3.status == ApartmentApplicationStatus.PROCESSING
    application.tenant_signed_contract(session, app3, datetime.now())
    application.landlord_signed_contract(session, app3, datetime.now())
    assert app1.status == ApartmentApplicationStatus.REJECTED
    assert all(app.status == ApartmentApplicationStatus.CONSIDERED
               for app in (app2, app4, app5))
    assert app3.status == ApartmentApplicationStatus.AWARDED
    application.provide_keys_to_tenant(session, app3)
    application.tenant_receive_keys(session, app3)
    assert all(app.status == ApartmentApplicationStatus.REJECTED
               for app in (app1, app2, app4, app5))
    assert app3.status == ApartmentApplicationStatus.COMPLETED
예제 #3
0
def test_landlord_process_another_application_when_one_application_is_complete_fail(
    another_considered_apartment_application: ApartmentApplication,
    completed_apartment_application: ApartmentApplication,
    session: Session,
    application: Application,
):
    with pytest.raises(ApplicationError):
        application.process_apartment_application(
            session, another_considered_apartment_application)
예제 #4
0
def test_landlord_start_move_in_process_for_application_not_in_considered_status_fail(
    application: Application,
    session: Session,
    new_apartment_application: ApartmentApplication,
):
    assert new_apartment_application.status == ApartmentApplicationStatus.NEW
    with pytest.raises(ApplicationError):
        application.process_apartment_application(session,
                                                  new_apartment_application)
예제 #5
0
def process_application(
    application_id: UUID,
    background_tasks: BackgroundTasks,
    landlord: Landlord = Depends(deps.get_current_landlord),
    session: Session = Depends(deps.get_database_session),
    app: Application = Depends(deps.get_application),
):
    try:
        apartment_application: ApartmentApplication = (
            session.query(ApartmentApplication)
            .join(Apartment, ApartmentApplication.apartment_id == Apartment.id)
            .filter(ApartmentApplication.id == application_id)
            .filter(Apartment.landlord_id == landlord.id)
            .one_or_none()
        )
        if not apartment_application:
            raise HTTPException(404, "application not found")
        email_message = f"Your application for apartment {apartment_application.apartment.name} is processing. Please sign the contract"
        background_tasks.add_task(
            send_email,
            to=apartment_application.tenant.email,
            subject="Digirent Apartment Application Notification",
            message=email_message,
        )
        return app.process_apartment_application(session, apartment_application)
    except ApplicationError as e:
        raise HTTPException(400, str(e))
예제 #6
0
def test_landlord_start_move_in_process_for_another_apartment_application_when_there_is_an_ongoing_move_in_process_fail(
    application: Application,
    session: Session,
    process_apartment_application: ApartmentApplication,
    another_new_apartment_application: ApartmentApplication,
):
    assert another_new_apartment_application.id != process_apartment_application.id
    assert process_apartment_application.status == ApartmentApplicationStatus.PROCESSING
    assert another_new_apartment_application.status == ApartmentApplicationStatus.NEW
    application.consider_apartment_application(
        session, another_new_apartment_application)
    assert (another_new_apartment_application.status ==
            ApartmentApplicationStatus.CONSIDERED)
    with pytest.raises(ApplicationError):
        application.process_apartment_application(
            session, another_new_apartment_application)
예제 #7
0
def test_landlord_start_move_in_process_ok(
    considered_apartment_application: ApartmentApplication,
    application: Application,
    session: Session,
):
    assert not session.query(Contract).count()
    tenant_application = application.process_apartment_application(
        session, considered_apartment_application)
    assert tenant_application.status == ApartmentApplicationStatus.PROCESSING
    assert session.query(Contract).count() == 1
    contract: Contract = session.query(Contract).all()[0]
    assert contract.status == ContractStatus.NEW