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)
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
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)
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)
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))
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)
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