Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #4
0
    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"}
Exemple #5
0
    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": [],
        }
Exemple #6
0
    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
Exemple #7
0
    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,
            }],
        }