def test_get_not_cancelled_educational_bookings_amount(self, db_session): educational_institution = EducationalInstitutionFactory() another_educational_institution = EducationalInstitutionFactory() educational_year = EducationalYearFactory(adageId="1") another_educational_year = EducationalYearFactory(adageId="2") EducationalBookingFactory( amount=Decimal(20.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, ) EducationalBookingFactory( amount=Decimal(400.00), quantity=1, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.CONFIRMED, ) EducationalBookingFactory( amount=Decimal(400.00), quantity=1, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.USED, ) EducationalBookingFactory( amount=Decimal(20.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.PENDING, ) EducationalBookingFactory( amount=Decimal(10.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.CANCELLED, isCancelled=True, ) EducationalBookingFactory( amount=Decimal(10.00), quantity=20, educationalBooking__educationalInstitution= another_educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.CONFIRMED, ) EducationalBookingFactory( amount=Decimal(10.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=another_educational_year, status=BookingStatus.CONFIRMED, ) total_amount = get_confirmed_educational_bookings_amount( educational_institution.id, educational_year.adageId) assert total_amount == Decimal(1200.00)
def test_insufficient_temporary_fund(self, app, db_session) -> None: educational_institution = EducationalInstitutionFactory() educational_year = EducationalYearFactory(adageId="1") EducationalDeposit( educationalInstitution=educational_institution, educationalYear=educational_year, amount=Decimal(400.00), isFinal=False, ) booking = EducationalBookingFactory( amount=Decimal(400.00), quantity=1, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.PENDING, educationalBooking__confirmationLimitDate=datetime( 2021, 10, 15, 10), ) client = TestClient(app.test_client()).with_eac_token() response = client.post( f"/adage/v1/prebookings/{booking.educationalBookingId}/confirm") assert response.status_code == 422 assert response.json == {"code": "INSUFFICIENT_FUND_DEPOSIT_NOT_FINAL"}
def test_institution_fund_is_insufficient(self, db_session): educational_institution = EducationalInstitutionFactory() educational_year = EducationalYearFactory(adageId="1") educational_deposit = EducationalDeposit( educationalInstitution=educational_institution, educationalYear=educational_year, amount=Decimal(400.00), ) EducationalBookingFactory( amount=Decimal(20.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.CONFIRMED, ) EducationalBookingFactory( amount=Decimal(400.00), quantity=1, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.CONFIRMED, ) EducationalBookingFactory( amount=Decimal(400.00), quantity=1, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.USED, ) with pytest.raises(exceptions.InsufficientFund): check_institution_fund(educational_institution.id, educational_year.adageId, Decimal(200.00), educational_deposit)
def test_get_educational_institution_not_found(self, app, db_session) -> None: educational_year = EducationalYearFactory() EducationalInstitutionFactory() client = TestClient(app.test_client()).with_eac_token() response = client.get( f"/adage/v1/years/{educational_year.adageId}/educational_institution/UNKNOWN" ) assert response.status_code == 404 assert response.json == {"code": "EDUCATIONAL_INSTITUTION_NOT_FOUND"}
def test_get_educational_institution_without_deposit(self, app) -> None: educational_year = EducationalYearFactory() educational_institution = EducationalInstitutionFactory() client = TestClient(app.test_client()).with_eac_token() response = client.get( f"/adage/v1/years/{educational_year.adageId}/educational_institution/{educational_institution.institutionId}" ) assert response.status_code == 200 assert response.json == { "credit": 0, "isFinal": False, "prebookings": [], }
def test_confirm_prebooking(self, app, db_session) -> None: redactor = EducationalRedactorFactory( civility="Mme", firstName="Jeanne", lastName="Dodu", email="*****@*****.**", ) educational_institution = EducationalInstitutionFactory() educational_year = EducationalYearFactory(adageId="1") EducationalDeposit( educationalInstitution=educational_institution, educationalYear=educational_year, amount=Decimal(1400.00), isFinal=True, ) EducationalBookingFactory( amount=Decimal(20.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, status=BookingStatus.CONFIRMED, ) booking = EducationalBookingFactory( amount=Decimal(20.00), quantity=20, educationalBooking__educationalInstitution=educational_institution, educationalBooking__educationalYear=educational_year, educationalBooking__educationalRedactor=redactor, status=BookingStatus.PENDING, educationalBooking__confirmationLimitDate=datetime( 2021, 10, 15, 10), ) client = TestClient(app.test_client()).with_eac_token() response = client.post( f"/adage/v1/prebookings/{booking.educationalBookingId}/confirm") assert response.status_code == 200 stock = booking.stock offer = stock.offer venue = offer.venue educational_booking = booking.educationalBooking assert response.json == { "address": venue.address, "beginningDatetime": format_into_utc_date(stock.beginningDatetime), "cancellationDate": None, "cancellationLimitDate": format_into_utc_date(booking.cancellationLimitDate), "city": venue.city, "confirmationDate": "2021-10-15T09:00:00Z", "confirmationLimitDate": format_into_utc_date(educational_booking.confirmationLimitDate), "coordinates": { "latitude": float(venue.latitude), "longitude": float(venue.longitude), }, "creationDate": format_into_utc_date(booking.dateCreated), "description": offer.description, "durationMinutes": offer.durationMinutes, "expirationDate": booking.expirationDate, "id": educational_booking.id, "image": None, "isDigital": offer.isDigital, "venueName": venue.name, "name": offer.name, "postalCode": venue.postalCode, "price": booking.amount, "quantity": booking.quantity, "redactor": { "email": "*****@*****.**", "redactorFirstName": "Jeanne", "redactorLastName": "Dodu", "redactorCivility": "Mme", }, "UAICode": educational_booking.educationalInstitution.institutionId, "yearId": int(educational_booking.educationalYearId), "status": "CONFIRMED", "venueTimezone": venue.timezone, "totalAmount": booking.total_amount, "url": offer_webapp_link(offer), "withdrawalDetails": offer.withdrawalDetails, } assert Booking.query.filter( Booking.id == booking.id).one().status == BookingStatus.CONFIRMED
def test_get_educational_institution(self, app) -> None: redactor = EducationalRedactorFactory( civility="M.", firstName="Jean", lastName="Doudou", email="*****@*****.**", ) educational_year = EducationalYearFactory() educational_institution = EducationalInstitutionFactory() EducationalDepositFactory( educationalInstitution=educational_institution, educationalYear=educational_year, amount=2000, isFinal=True, ) EducationalInstitutionFactory() booking = EducationalBookingFactory( educationalBooking__educationalRedactor=redactor, educationalBooking__educationalYear=educational_year, educationalBooking__educationalInstitution=educational_institution, ) other_educational_year = EducationalYearFactory(adageId="toto") other_educational_institution = EducationalInstitutionFactory( institutionId="tata") EducationalBookingFactory( educationalBooking__educationalYear=other_educational_year) EducationalBookingFactory(educationalBooking__educationalInstitution= other_educational_institution) EducationalDepositFactory( educationalInstitution=educational_institution, educationalYear=other_educational_year, amount=2000, isFinal=False, ) EducationalDepositFactory( educationalInstitution=other_educational_institution, educationalYear=educational_year, amount=2000, isFinal=False, ) client = TestClient(app.test_client()).with_eac_token() response = client.get( f"/adage/v1/years/{educational_year.adageId}/educational_institution/{educational_institution.institutionId}" ) assert response.status_code == 200 stock = booking.stock offer = stock.offer venue = offer.venue educational_booking = booking.educationalBooking assert response.json == { "credit": 2000, "isFinal": True, "prebookings": [{ "address": venue.address, "beginningDatetime": format_into_utc_date(stock.beginningDatetime), "cancellationDate": None, "cancellationLimitDate": format_into_utc_date(booking.cancellationLimitDate), "city": venue.city, "confirmationDate": format_into_utc_date(educational_booking.confirmationDate) if educational_booking.confirmationDate else None, "confirmationLimitDate": format_into_utc_date( educational_booking.confirmationLimitDate), "coordinates": { "latitude": float(venue.latitude), "longitude": float(venue.longitude), }, "creationDate": format_into_utc_date(booking.dateCreated), "description": offer.description, "durationMinutes": offer.durationMinutes, "expirationDate": booking.expirationDate, "id": educational_booking.id, "image": { "url": offer.image.url, "credit": offer.image.credit } if offer.image else None, "isDigital": offer.isDigital, "venueName": venue.name, "name": offer.name, "postalCode": venue.postalCode, "price": booking.amount, "quantity": booking.quantity, "redactor": { "email": "*****@*****.**", "redactorFirstName": "Jean", "redactorLastName": "Doudou", "redactorCivility": "M.", }, "UAICode": educational_booking.educationalInstitution.institutionId, "yearId": int(educational_booking.educationalYearId), "status": "CONFIRMED", "venueTimezone": venue.timezone, "totalAmount": booking.amount * booking.quantity, "url": offer_webapp_link(offer), "withdrawalDetails": offer.withdrawalDetails, }], }
def test_get_prebookings_with_query_params(self, app) -> None: redactor = EducationalRedactorFactory( civility="M.", firstName="Jean", lastName="Doudou", email="*****@*****.**", ) another_redactor = EducationalRedactorFactory( civility="Mme.", firstName="Jeanne", lastName="Dodu", email="*****@*****.**", ) educationalYear = EducationalYearFactory() educationalInstitution = EducationalInstitutionFactory() booking = EducationalBookingFactory( educationalBooking__educationalRedactor=redactor, educationalBooking__educationalYear=educationalYear, educationalBooking__educationalInstitution=educationalInstitution, educationalBooking__status="USED_BY_INSTITUTE", status="CONFIRMED", ) EducationalBookingFactory( educationalBooking__educationalRedactor=another_redactor, educationalBooking__educationalYear=educationalYear, educationalBooking__educationalInstitution=educationalInstitution, educationalBooking__status="USED_BY_INSTITUTE", status="CONFIRMED", ) EducationalBookingFactory( educationalBooking__educationalRedactorId=redactor, educationalBooking__educationalYear=educationalYear, educationalBooking__educationalInstitution=educationalInstitution, status="PENDING", ) client = TestClient(app.test_client()).with_eac_token() response = client.get( f"/adage/v1/years/{booking.educationalBooking.educationalYear.adageId}/educational_institution/{booking.educationalBooking.educationalInstitution.institutionId}/prebookings?status=USED_BY_INSTITUTE&redactorEmail={redactor.email}" ) assert response.status_code == 200 stock = booking.stock offer = stock.offer venue = offer.venue educational_booking = booking.educationalBooking assert response.json == { "prebookings": [{ "address": venue.address, "beginningDatetime": format_into_utc_date(stock.beginningDatetime), "cancellationDate": None, "cancellationLimitDate": format_into_utc_date(booking.cancellationLimitDate), "city": venue.city, "confirmationDate": None, "confirmationLimitDate": format_into_utc_date( educational_booking.confirmationLimitDate), "coordinates": { "latitude": float(venue.latitude), "longitude": float(venue.longitude), }, "creationDate": format_into_utc_date(booking.dateCreated), "description": offer.description, "durationMinutes": offer.durationMinutes, "expirationDate": booking.expirationDate, "id": educational_booking.id, "image": None, "isDigital": offer.isDigital, "venueName": venue.name, "name": offer.name, "postalCode": venue.postalCode, "price": booking.amount, "quantity": booking.quantity, "redactor": { "email": "*****@*****.**", "redactorFirstName": "Jean", "redactorLastName": "Doudou", "redactorCivility": "M.", }, "UAICode": educational_booking.educationalInstitution.institutionId, "yearId": int(educational_booking.educationalYearId), "status": "USED_BY_INSTITUTE", "venueTimezone": venue.timezone, "totalAmount": booking.total_amount, "url": offer_webapp_link(offer), "withdrawalDetails": offer.withdrawalDetails, }], }