Exemple #1
0
    def test_super_admin_can_suspend_then_unsuspend_simple_admin(
            self, mocked_validate_csrf_token, app):
        super_admin = users_factories.AdminFactory(
            email="*****@*****.**")
        admin = users_factories.AdminFactory(email="*****@*****.**")
        client = TestClient(app.test_client()).with_session_auth(
            super_admin.email)

        # Suspend
        url = f"/pc/back-office/admin_users/suspend?user_id={admin.id}"
        suspend_response = client.post(url,
                                       form={
                                           "reason": "fraud",
                                           "csrf_token": "token"
                                       })
        assert suspend_response.status_code == 302
        assert not admin.isActive

        # Unsuspend
        url = f"/pc/back-office/admin_users/unsuspend?user_id={admin.id}"
        unsuspend_response = client.post(url,
                                         form={
                                             "reason": "fraud",
                                             "csrf_token": "token"
                                         })
        assert unsuspend_response.status_code == 302
        assert admin.isActive
Exemple #2
0
    def test_simple_admin_can_not_unsuspend_simple_admin(
            self, mocked_validate_csrf_token, app):
        super_admin = users_factories.AdminFactory(
            email="*****@*****.**")
        admin_1 = users_factories.AdminFactory(email="*****@*****.**")
        admin_2 = users_factories.AdminFactory(email="*****@*****.**")
        super_admin_client = TestClient(app.test_client()).with_session_auth(
            super_admin.email)
        admin_1_client = TestClient(app.test_client()).with_session_auth(
            admin_1.email)

        # super_admin suspends admin_2
        url = f"/pc/back-office/admin_users/suspend?user_id={admin_2.id}"
        suspend_response = super_admin_client.post(url,
                                                   form={
                                                       "reason": "fraud",
                                                       "csrf_token": "token"
                                                   })
        assert suspend_response.status_code == 302
        assert not admin_2.isActive

        # admin_1 tries to unsuspend admin_2 (and fails to)
        url = f"/pc/back-office/admin_users/unsuspend?user_id={admin_2.id}"
        unsuspend_response = admin_1_client.post(url,
                                                 form={
                                                     "reason": "fraud",
                                                     "csrf_token": "token"
                                                 })
        assert unsuspend_response.status_code == 403
        assert not admin_2.isActive
    def test_validation_prod_requires_super_admin(self, client):
        user = users_factories.UserFactory()
        check = fraud_factories.BeneficiaryFraudCheckFactory(
            user=user, type=fraud_models.FraudCheckType.JOUVE)
        admin = users_factories.AdminFactory()
        client.with_session_auth(admin.email)

        with override_settings(IS_PROD=True,
                               SUPER_ADMIN_EMAIL_ADDRESSES=[admin.email]):
            response = client.post(
                f"/pc/back-office/support_beneficiary/validate/beneficiary/{user.id}",
                form={
                    "user_id": user.id,
                    "reason": "User is granted",
                    "review": "OK"
                },
            )
        assert response.status_code == 302
        review = fraud_models.BeneficiaryFraudReview.query.filter_by(
            user=user, author=admin).one_or_none()
        assert review is not None
        assert review.author == admin
        assert user.has_beneficiary_role is True

        jouve_content = fraud_models.JouveContent(**check.resultContent)
        assert user.firstName == jouve_content.firstName
        assert user.lastName == jouve_content.lastName
    def test_validation_view_validate_user_from_dms_data_staging(self, client):
        user = users_factories.UserFactory(dateOfBirth=datetime.utcnow() -
                                           relativedelta(years=18, months=2))
        check = fraud_factories.BeneficiaryFraudCheckFactory(
            user=user, type=fraud_models.FraudCheckType.DMS)
        admin = users_factories.AdminFactory()
        client.with_session_auth(admin.email)

        response = client.post(
            f"/pc/back-office/support_beneficiary/validate/beneficiary/{user.id}",
            form={
                "user_id": user.id,
                "reason": "User is granted",
                "review": "OK"
            },
        )
        assert response.status_code == 302

        review = fraud_models.BeneficiaryFraudReview.query.filter_by(
            user=user, author=admin).one()
        assert review.review == fraud_models.FraudReviewStatus.OK
        assert review.reason == "User is granted"
        user = users_models.User.query.get(user.id)
        assert user.has_beneficiary_role is True
        assert len(user.deposits) == 1

        dms_content = fraud_models.DMSContent(**check.resultContent)
        assert user.firstName == dms_content.first_name
        assert user.lastName == dms_content.last_name
        assert user.idPieceNumber == dms_content.id_piece_number
Exemple #5
0
    def test_approve_last_pending_offer_and_go_to_the_next_offer_redirect_to_validation_page(
        self, mocked_get_offerer_legal_category, mocked_validate_csrf_token, app
    ):
        users_factories.AdminFactory(email="*****@*****.**")
        venue = VenueFactory()
        offerer = venue.managingOfferer

        pro_user = users_factories.ProFactory(email="*****@*****.**")
        offers_factories.UserOffererFactory(user=pro_user, offerer=offerer)

        offer = offers_factories.OfferFactory(
            validation=OfferValidationStatus.PENDING,
            isActive=True,
            venue__bookingEmail="*****@*****.**",
            venue=venue,
        )

        mocked_get_offerer_legal_category.return_value = {
            "legal_category_code": 5202,
            "legal_category_label": "Société en nom collectif",
        }

        data = dict(validation=OfferValidationStatus.APPROVED.value, action="save-and-go-next")
        client = TestClient(app.test_client()).with_session_auth("*****@*****.**")
        response = client.post(f"/pc/back-office/validation/edit?id={offer.id}", form=data)

        assert offer.validation == OfferValidationStatus.APPROVED
        assert response.status_code == 302
        assert response.headers["location"] == "http://localhost/pc/back-office/validation/"
Exemple #6
0
    def test_reject_approved_offer_with_bookings(
        self,
        mocked_send_cancel_booking_notification,
        mocked_send_offer_validation_notification_to_administration,
        mocked_send_offer_validation_status_update_email,
        mocked_validate_csrf_token,
        app,
    ):
        users_factories.AdminFactory(email="*****@*****.**")
        with freeze_time("2020-11-17 15:00:00") as frozen_time:
            offer = offers_factories.OfferFactory(validation=OfferValidationStatus.APPROVED, isActive=True)
            stock = offers_factories.StockFactory(offer=offer, price=10)
            unused_booking = booking_factories.IndividualBookingFactory(stock=stock)
            used_booking = booking_factories.UsedBookingFactory(stock=stock)
            frozen_time.move_to("2020-12-20 15:00:00")
            data = dict(validation=OfferValidationStatus.REJECTED.value)
            client = TestClient(app.test_client()).with_session_auth("*****@*****.**")

            response = client.post(f"/pc/back-office/offer/edit/?id={offer.id}", form=data)

        assert response.status_code == 302
        assert offer.validation == OfferValidationStatus.REJECTED
        assert offer.lastValidationDate == datetime.datetime(2020, 12, 20, 15)
        assert unused_booking.isCancelled
        assert unused_booking.status is BookingStatus.CANCELLED
        assert not used_booking.isCancelled
        assert used_booking.status is not BookingStatus.CANCELLED

        mocked_send_cancel_booking_notification.assert_called_once_with([unused_booking.id])
Exemple #7
0
    def test_reject_approved_offer(
        self,
        mocked_send_offer_validation_notification_to_administration,
        mocked_send_offer_validation_status_update_email,
        mocked_validate_csrf_token,
        app,
    ):
        users_factories.AdminFactory(email="*****@*****.**")
        with freeze_time("2020-11-17 15:00:00") as frozen_time:
            offer = offers_factories.OfferFactory(
                validation=OfferValidationStatus.APPROVED, isActive=True, venue__bookingEmail="*****@*****.**"
            )
            frozen_time.move_to("2020-12-20 15:00:00")
            data = dict(validation=OfferValidationStatus.REJECTED.value)
            client = TestClient(app.test_client()).with_session_auth("*****@*****.**")

            response = client.post(f"/pc/back-office/offer/edit/?id={offer.id}", form=data)

        assert response.status_code == 302
        assert offer.validation == OfferValidationStatus.REJECTED
        assert offer.lastValidationDate == datetime.datetime(2020, 12, 20, 15)

        mocked_send_offer_validation_notification_to_administration.assert_called_once_with(
            OfferValidationStatus.REJECTED, offer
        )
        mocked_send_offer_validation_status_update_email.assert_called_once_with(
            offer, OfferValidationStatus.REJECTED, ["*****@*****.**"]
        )
Exemple #8
0
    def test_access_to_validation_page_with_super_admin_user_on_prod_env(self, app):
        users_factories.AdminFactory(email="*****@*****.**")
        client = TestClient(app.test_client()).with_session_auth("*****@*****.**")

        response = client.get("/pc/back-office/validation/")

        assert response.status_code == 200
Exemple #9
0
    def test_import_validation_config_fail_when_user_is_not_super_admin(self, mocked_validate_csrf_token, app):
        # Given
        users_factories.AdminFactory(email="*****@*****.**")
        config_yaml = """
                    minimum_score: 0.6
                    parameters:
                        name:
                            model: "Offer"
                            attribute: "name"
                            condition:
                                operator: "not in"
                                comparated: "REJECTED"
                            factor: 0
                        price_all_types:
                            model: "Offer"
                            attribute: "max_price"
                            condition:
                                operator: ">"
                                comparated: 100
                            factor: 0.7
                    """

        data = dict(specs=config_yaml, action="save")
        client = TestClient(app.test_client()).with_session_auth("*****@*****.**")

        # When
        response = client.post("pc/back-office/fraud_rules_configuration/new/", form=data)

        # Then
        assert response.status_code == 403
Exemple #10
0
    def test_approve_physical_offer_and_send_mail_to_venue_booking_email(
        self,
        mocked_send_offer_validation_status_update_email,
        mocked_get_offerer_legal_category,
        mocked_validate_csrf_token,
        app,
    ):
        # Given
        users_factories.AdminFactory(email="*****@*****.**")

        venue = VenueFactory(bookingEmail="*****@*****.**")

        offer = offers_factories.OfferFactory(validation=OfferValidationStatus.PENDING, isActive=True, venue=venue)

        mocked_get_offerer_legal_category.return_value = {
            "legal_category_code": 5202,
            "legal_category_label": "Société en nom collectif",
        }
        data = dict(validation=OfferValidationStatus.APPROVED.value, action="save-and-go-next")
        client = TestClient(app.test_client()).with_session_auth("*****@*****.**")

        # When
        client.post(f"/pc/back-office/validation/edit?id={offer.id}", form=data)

        # Then
        mocked_send_offer_validation_status_update_email.assert_called_once_with(
            offer, OfferValidationStatus.APPROVED, ["*****@*****.**"]
        )
Exemple #11
0
    def test_get_eligible_users_created_between(self, app):
        ELIGIBLE_CONDTIONS = {
            "dateCreated": datetime.now(),
            "postalCode": "93000",
            "isBeneficiary": False,
        }
        # 19 yo
        factories.UserFactory(dateOfBirth=datetime(1999, 1, 1), **ELIGIBLE_CONDTIONS)
        user_just_18_in_eligible_area = factories.UserFactory(dateOfBirth=datetime(2000, 1, 1), **ELIGIBLE_CONDTIONS)
        # User just 18 but in an ineligible area
        factories.UserFactory(
            dateOfBirth=datetime(2000, 1, 1),
            dateCreated=datetime.now(),
            postalCode="98712",
        )
        # Beneficiary
        factories.BeneficiaryGrant18Factory(
            dateOfBirth=datetime(2000, 1, 1),
            dateCreated=datetime.now(),
            postalCode="93000",
        )
        # Admin
        factories.AdminFactory(dateOfBirth=datetime(2000, 1, 1), **ELIGIBLE_CONDTIONS)
        # Pro
        pro_user = factories.ProFactory(dateOfBirth=datetime(2000, 1, 1), **ELIGIBLE_CONDTIONS)
        offers_factories.UserOffererFactory(user=pro_user)
        # User not yet 18
        factories.UserFactory(dateOfBirth=datetime(2000, 1, 2), **ELIGIBLE_CONDTIONS)

        result = _get_eligible_users_created_between(
            datetime.now() - timedelta(days=1), datetime.now() + timedelta(minutes=1)
        )

        assert {u.id for u in result} == {user_just_18_in_eligible_area.id}
Exemple #12
0
    def test_edit_product_gcu_compatibility(self, mocked_validate_csrf_token,
                                            mocked_async_index_offer_ids, app,
                                            db_session):
        # Given
        users_factories.AdminFactory(email="*****@*****.**")
        offerer = offers_factories.OffererFactory()
        product_1 = offers_factories.ThingProductFactory(
            description="premier produit inapproprié",
            extraData={"isbn": "isbn-de-test"})
        venue = offers_factories.VenueFactory(managingOfferer=offerer)
        offers_factories.OfferFactory(product=product_1, venue=venue)
        offers_factories.OfferFactory(product=product_1, venue=venue)

        # When
        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")
        response = client.post(
            "/pc/back-office/many_offers_operations/product_gcu_compatibility?isbn=isbn-de-test"
        )

        # Then
        assert response.status_code == 302
        assert response.headers[
            "location"] == "http://localhost/pc/back-office/many_offers_operations/"
        products = Product.query.all()
        offers = Offer.query.all()
        first_product = products[0]
        first_offer = offers[0]
        second_offer = offers[1]

        assert not first_product.isGcuCompatible
        assert not first_offer.isActive
        assert not second_offer.isActive
        mocked_async_index_offer_ids.assert_called_once_with(
            [offer.id for offer in offers])
Exemple #13
0
    def test_admin_user_creation(self, mocked_validate_csrf_token, app):
        users_factories.AdminFactory(email="*****@*****.**")

        data = dict(
            email="*****@*****.**",
            firstName="Powerfull",
            lastName="Admin",
            departementCode="76",
            postalCode="76001",
        )

        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")
        response = client.post("/pc/back-office/admin_users/new", form=data)

        assert response.status_code == 302

        user_created = User.query.filter_by(
            email="*****@*****.**").one()
        assert user_created.firstName == "Powerfull"
        assert user_created.lastName == "Admin"
        assert user_created.publicName == "Powerfull Admin"
        assert user_created.dateOfBirth is None
        assert user_created.departementCode == "76"
        assert user_created.postalCode == "76001"
        assert user_created.isAdmin is True
        assert not user_created.has_beneficiary_role
        assert user_created.has_admin_role
        assert user_created.hasSeenProTutorials is True
        assert user_created.needsToFillCulturalSurvey is False

        token = Token.query.filter_by(userId=user_created.id).first()
        assert token.type == TokenType.RESET_PASSWORD
        assert token.expirationDate > datetime.now() + timedelta(hours=20)
    def test_review_ko_does_not_activate_the_beneficiary(self, client):
        user = users_factories.UserFactory()
        fraud_factories.BeneficiaryFraudCheckFactory(
            user=user, type=fraud_models.FraudCheckType.JOUVE)
        admin = users_factories.AdminFactory()
        client.with_session_auth(admin.email)

        with override_settings(IS_PROD=True,
                               SUPER_ADMIN_EMAIL_ADDRESSES=[admin.email]):
            response = client.post(
                f"/pc/back-office/support_beneficiary/validate/beneficiary/{user.id}",
                form={
                    "user_id": user.id,
                    "reason": "User is denied",
                    "review": "KO"
                },
            )
        assert response.status_code == 302
        review = fraud_models.BeneficiaryFraudReview.query.filter_by(
            user=user, author=admin).one_or_none()
        assert review is not None
        assert review.author == admin
        assert review.review == fraud_models.FraudReviewStatus.KO
        assert user.has_beneficiary_role is False

        assert subscription_models.SubscriptionMessage.query.count() == 1
        message = subscription_models.SubscriptionMessage.query.first()
        assert message.popOverIcon == subscription_models.PopOverIcon.ERROR
        assert message.userMessage == "Ton dossier a été rejeté. Tu n'es malheureusement pas éligible au pass culture."
def test_admin_can_access_reimbursements_data_with_venue_filter(app, client):
    # Given
    beginning_date = date.today() - timedelta(days=2)
    ending_date = date.today() + timedelta(days=2)
    admin = users_factories.AdminFactory()
    user_offerer = offers_factories.UserOffererFactory()
    offerer = user_offerer.offerer
    status = payments_factories.PaymentStatusFactory(
        payment__booking__stock__offer__venue__managingOfferer=offerer,
        status=TransactionStatus.SENT,
        payment__transactionLabel=
        "pass Culture Pro - remboursement 1ère quinzaine 06-21",
        date=date.today(),
    )
    venue = status.payment.booking.venue

    # When
    admin_client = client.with_session_auth(admin.email)
    response = admin_client.get(
        "/reimbursements/csv?venueId={}&reimbursementPeriodBeginningDate={}&reimbursementPeriodEndingDate={}"
        .format(humanize(venue.id), beginning_date.isoformat(),
                ending_date.isoformat()))

    # Then
    assert response.status_code == 200
    assert response.headers["Content-type"] == "text/csv; charset=utf-8;"
    assert response.headers[
        "Content-Disposition"] == "attachment; filename=remboursements_pass_culture.csv"
    rows = response.data.decode("utf-8").splitlines()
    assert len(rows) == 2  # header + payments
    def when_add_allocine_stocks_provider_with_price_but_no_isDuo_config(
            self, app):
        # Given
        venue = offer_factories.VenueFactory(
            managingOfferer__siren="775671464")
        user = user_factories.AdminFactory()
        AllocinePivotFactory(siret=venue.siret)

        provider = activate_provider("AllocineStocks")

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
            "price": "9.99"
        }

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)

        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 201
        json = response.json
        assert "_sa_polymorphic_on" not in json
        venue_provider = VenueProvider.query.one()
        assert json["venueId"] == humanize(venue_provider.venueId)
    def when_add_allocine_stocks_provider_with_default_settings_at_import(
            self, app):
        # Given
        venue = offer_factories.VenueFactory(
            managingOfferer__siren="775671464")
        user = user_factories.AdminFactory()
        AllocinePivotFactory(siret=venue.siret)

        provider = activate_provider("AllocineStocks")

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
            "price": "9.99",
            "quantity": 50,
            "isDuo": True,
        }

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)

        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 201
        assert response.json["isDuo"]
        assert response.json["price"] == 9.99
        assert response.json["quantity"] == 50
    def when_provider_api_not_available(self, mock_siret_can_be_synchronized,
                                        app):
        # Given
        user = user_factories.AdminFactory()
        venue = offer_factories.VenueFactory(siret="12345678912345")

        provider = offerers_factories.APIProviderFactory()

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
        }

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)

        errors = ApiErrors()
        errors.status_code = 422
        errors.add_error(
            "provider",
            "L’importation d’offres avec LesLibraires n’est pas disponible "
            "pour le SIRET 12345678912345",
        )
        mock_siret_can_be_synchronized.side_effect = [errors]

        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 422
        assert response.json["provider"] == [
            "L’importation d’offres avec LesLibraires n’est pas disponible pour le SIRET 12345678912345"
        ]
        assert VenueProvider.query.count() == 0
    def should_connect_to_allocine(
        self,
        app,
    ):
        # Given
        user = user_factories.AdminFactory()
        venue = offer_factories.VenueFactory(siret="12345678912345")
        AllocinePivotFactory(siret=venue.siret)

        provider = activate_provider("AllocineStocks")

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
            "price": "33.33"
        }

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)

        # When
        auth_request.post("/venueProviders", json=venue_provider_data)

        # Then
        assert len(venue.venueProviders) == 1
        assert venue.venueProviders[0].provider == provider
    def when_add_allocine_stocks_provider_with_no_price(self, app):
        # Given
        venue = offer_factories.VenueFactory(
            managingOfferer__siren="775671464")
        user = user_factories.AdminFactory()
        AllocinePivotFactory(siret=venue.siret)

        provider = activate_provider("AllocineStocks")

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
        }

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)

        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 400
        assert response.json["price"] == [
            "Il est obligatoire de saisir un prix."
        ]
        assert VenueProvider.query.count() == 0
    def when_add_allocine_pivot_is_missing(self, app):
        # Given
        venue = offer_factories.VenueFactory(
            managingOfferer__siren="775671464")
        user = user_factories.AdminFactory()
        provider = activate_provider("AllocineStocks")

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
        }

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)

        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 404
        assert response.json == {
            "allocine": [
                "Ce lieu n'est pas autorisé à être synchronisé avec Allociné. Veuillez contacter le support si vous souhaitez le faire."
            ]
        }
        assert VenueProvider.query.count() == 0
    def test_when_add_same_provider(self, mock_siret_can_be_synchronized,
                                    mock_synchronize_venue_provider, app):
        # Given
        user = user_factories.AdminFactory()
        venue = offer_factories.VenueFactory(siret="12345678912345")
        provider = offerers_factories.APIProviderFactory()
        venue_provider = create_venue_provider(
            venue, provider, venue_id_at_offer_provider="12345678912345")
        repository.save(venue_provider)

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)
        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
        }
        mock_siret_can_be_synchronized.return_value = True

        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 400
        assert response.json == {
            "global": ["Votre lieu est déjà lié à cette source"]
        }
        assert venue.venueProviders[0].provider.id == provider.id
    def when_venue_provider_is_successfully_created(
            self, mock_siret_can_be_synchronized,
            mock_synchronize_venue_provider, app):
        # Given
        user = user_factories.AdminFactory()
        venue = offer_factories.VenueFactory(siret="12345678912345")

        provider = offerers_factories.APIProviderFactory()

        venue_provider_data = {
            "providerId": humanize(provider.id),
            "venueId": humanize(venue.id),
        }
        mock_siret_can_be_synchronized.return_value = True

        auth_request = TestClient(
            app.test_client()).with_session_auth(email=user.email)
        # When
        response = auth_request.post("/venueProviders",
                                     json=venue_provider_data)

        # Then
        assert response.status_code == 201
        venue_provider = VenueProvider.query.one()
        assert venue_provider.venueId == venue.id
        assert venue_provider.providerId == provider.id
        assert venue_provider.venueIdAtOfferProvider == "12345678912345"
        assert "id" in response.json

        venue_provider_id = response.json["id"]
        mock_synchronize_venue_provider.assert_called_once_with(
            dehumanize(venue_provider_id))
Exemple #24
0
    def test_beneficiary_user_edition_does_not_send_email(
            self, mocked_validate_csrf_token, mocked_flask_flash, app):
        users_factories.AdminFactory(email="*****@*****.**")
        user_to_edit = users_factories.BeneficiaryGrant18Factory(
            email="*****@*****.**", isAdmin=False)

        data = dict(
            email="*****@*****.**",
            firstName=user_to_edit.firstName,
            lastName=user_to_edit.lastName,
            dateOfBirth=user_to_edit.dateOfBirth.isoformat(sep=" ",
                                                           timespec="seconds"),
            departementCode=user_to_edit.departementCode,
            postalCode="76000",
        )

        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")
        response = client.post(
            f"/pc/back-office/beneficiary_users/edit/?id={user_to_edit.id}",
            form=data)

        assert response.status_code == 302

        user_edited = User.query.filter_by(
            email="*****@*****.**").one_or_none()
        assert user_edited is not None
        assert len(push_testing.requests) == 1

        mocked_flask_flash.assert_not_called()
        assert not mails_testing.outbox
        assert len(push_testing.requests) == 1
        assert len(sendinblue_testing.sendinblue_requests) == 1
Exemple #25
0
    def test_beneficiary_user_creation_is_restricted_in_prod(
            self, app, db_session):
        users_factories.AdminFactory(email="*****@*****.**")

        data = dict(
            email="*****@*****.**",
            firstName="Serge",
            lastName="Lama",
            dateOfBirth=f"{self.AGE18_ELIGIBLE_BIRTH_DATE:%Y-%m-%d %H:%M:%S}",
            departementCode="93",
            postalCode="93000",
        )

        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")
        response = client.post("/pc/back-office/beneficiary_users/new",
                               form=data)

        assert response.status_code == 302

        filtered_users = User.query.filter_by(email="*****@*****.**").all()
        deposits = Deposit.query.all()
        assert len(filtered_users) == 0
        assert len(deposits) == 0
        assert len(push_testing.requests) == 0
Exemple #26
0
    def test_beneficiary_user_creation_for_deposit_v2(
            self, mocked_validate_csrf_token, app):
        users_factories.AdminFactory(email="*****@*****.**")

        data = dict(
            email="*****@*****.**",
            firstName="Serge",
            lastName="Lama",
            dateOfBirth=f"{self.AGE18_ELIGIBLE_BIRTH_DATE:%Y-%m-%d %H:%M:%S}",
            departementCode="93",
            postalCode="93000",
            phoneNumber="0601020304",
            depositVersion="2",
        )

        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")
        response = client.post("/pc/back-office/beneficiary_users/new",
                               form=data)

        assert response.status_code == 302

        user_created = User.query.filter_by(email="*****@*****.**").one()
        assert len(user_created.deposits) == 1
        assert user_created.deposit.version == 2
        assert user_created.deposit.source == "pass-culture-admin"
        assert user_created.deposit.amount == 300

        assert push_testing.requests[0]["attribute_values"][
            "u.credit"] == 30000
Exemple #27
0
    def test_access_to_validation_page_with_none_super_admin_user_on_prod_env(self, app):
        users_factories.AdminFactory(email="*****@*****.**")
        client = TestClient(app.test_client()).with_session_auth("*****@*****.**")

        response = client.get("/pc/back-office/validation/")

        assert response.status_code == 302
        assert response.headers["location"] == "http://localhost/pc/back-office/"
    def test_pro_user_creation(self, mocked_validate_csrf_token, app):
        # Given
        users_factories.AdminFactory(email="*****@*****.**")
        offerers_factories.VirtualVenueTypeFactory()

        data = dict(
            email="*****@*****.**",
            firstName="Juste",
            lastName="Leblanc",
            phoneNumber="0601020304",
            dateOfBirth="2020-12-09 09:45:00",
            departementCode="93",
            postalCode="93000",
            offererSiren="123654987",
            offererName="Les films du plat pays",
            offererPostalCode="93000",
            offererCity="Nantes",
            csrf_token="token",
        )

        # When
        client = TestClient(
            app.test_client()).with_session_auth("*****@*****.**")

        # Then
        response = client.post("/pc/back-office/pro_users/new", form=data)

        assert response.status_code == 302

        users_filtered = User.query.filter_by(email="*****@*****.**").all()
        assert len(users_filtered) == 1
        user_created = users_filtered[0]
        assert user_created.firstName == "Juste"
        assert user_created.lastName == "Leblanc"
        assert user_created.publicName == "Juste Leblanc"
        assert user_created.dateOfBirth == datetime(2020, 12, 9, 9, 45)
        assert user_created.departementCode == "93"
        assert user_created.postalCode == "93000"
        assert not user_created.has_beneficiary_role
        assert user_created.has_pro_role
        assert len(user_created.deposits) == 0

        offerers_filtered = Offerer.query.filter_by(siren="123654987").all()
        assert len(offerers_filtered) == 1
        offerer_created = offerers_filtered[0]
        assert offerer_created.name == "Les films du plat pays"
        assert offerer_created.postalCode == "93000"
        assert offerer_created.city == "Nantes"

        user_offerers_filtered = UserOfferer.query.filter(
            and_(UserOfferer.userId == user_created.id,
                 UserOfferer.offererId == offerer_created.id)).all()
        assert len(user_offerers_filtered) == 1

        token = Token.query.filter_by(userId=user_created.id).first()
        assert token.type == TokenType.RESET_PASSWORD
        assert token.expirationDate > datetime.now() + timedelta(days=29)
        assert token.expirationDate < datetime.now() + timedelta(days=31)
 def test_detail_view(self, client):
     admin = users_factories.AdminFactory(email="*****@*****.**")
     user = users_factories.UserFactory()
     fraud_factories.BeneficiaryFraudCheckFactory(user=user)
     fraud_factories.BeneficiaryFraudResultFactory(user=user)
     client.with_session_auth(admin.email)
     response = client.get(
         "/pc/back-office/support_beneficiary/?id={user.id}")
     assert response.status_code == 200
    def test_authorized_user(self, app, db_session, client):
        admin = users_factories.AdminFactory(email="*****@*****.**")
        client.with_session_auth(admin.email)

        response = client.get("/pc/back-office/categories")

        assert response.status_code == 200
        assert any(c.id in response.data.decode("utf-8")
                   for c in categories.ALL_CATEGORIES)