def test_get_beneficiary_import_for_beneficiary(self):
        """Create 'BeneficiaryImport's with different statuses and check that
        the last one created is the one returned.
        """
        user = users_factories.UserFactory()

        source = BeneficiaryImportSources.demarches_simplifiees.value
        for rejected_import in users_factories.BeneficiaryImportFactory.create_batch(
                3, beneficiary=user, source=source):
            users_factories.BeneficiaryImportStatusFactory(
                beneficiaryImport=rejected_import,
                status=ImportStatus.REJECTED)

        # The created status is set to a random datetime in the past (yesterday at most)
        created_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user)
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=created_import, status=ImportStatus.CREATED)

        latest_created_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user)
        latest_created_import.setStatus(ImportStatus.CREATED)

        beneficiary_import = subscription_repository.get_beneficiary_import_for_beneficiary(
            user)
        assert beneficiary_import.id == latest_created_import.id
    def test_run(self):
        """
        Test that only the expected users are returned.

        Create a context with an extra user and an extra BeneficiaryImport and
        ensure that only those related are the one that are used and receiving
        an email.
        """
        users_factories.UserFactory()
        users_factories.BeneficiaryImportFactory(source="some source")
        beneficiary_imports = users_factories.BeneficiaryImportFactory.create_batch(3, source="source")

        expected_users = sorted([bi.beneficiary for bi in beneficiary_imports], key=lambda x: x.id)
        expected_email_dst = {user.email for user in expected_users}

        application_ids = [bi.applicationId for bi in beneficiary_imports]

        users = send_dms_application_emails.run(application_ids, "source")
        users = sorted(users, key=lambda x: x.id)

        assert users == expected_users
        assert len(mails_testing.outbox) == 1

        email = mails_testing.outbox[0]
        email_dst = {email.strip() for email in email.sent_data["To"].split(",")}
        assert email_dst == expected_email_dst
    def test_archive_applications_only_archive_beneficiary(
            self, dms_archive, dms_applications, caplog):
        caplog.set_level(logging.INFO)
        application_id = 42
        user_to_archive = users_factories.BeneficiaryGrant18Factory()
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            sourceId=self.PROCEDURE_ID,
            applicationId=application_id,
            beneficiary=user_to_archive)
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import, status=ImportStatus.CREATED)
        user_to_not_archive = users_factories.UserFactory()
        application_to_archive = make_graphql_application(
            application_id, "closed", email=user_to_archive.email)
        dms_applications.return_value = [
            make_graphql_application(20,
                                     "closed",
                                     email=user_to_not_archive.email),
            application_to_archive,
        ]
        archive_dms_applications.archive_applications(self.PROCEDURE_ID,
                                                      dry_run=False)
        assert dms_archive.call_count == 1
        assert dms_archive.call_args == [(application_to_archive["id"],
                                          "SomeInstructorId")]

        assert (
            caplog.messages[0] ==
            f"Archiving application {application_id} on procedure {self.PROCEDURE_ID} for user_id {user_to_archive.id}"
        )
        assert caplog.messages[
            1] == "script ran : total applications : 2 to archive applications : 1"
Ejemplo n.º 4
0
    def test_returns_min_year_if_no_beneficiary_import_exist_for_given_source_id(
            self, app):
        # given
        old_source_id = 1
        new_source_id = 2
        now = datetime.utcnow()
        yesterday = now - timedelta(days=1)

        user = users_factories.BeneficiaryGrant18Factory(
            dateCreated=yesterday, email="*****@*****.**")
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user,
            applicationId=3,
            sourceId=old_source_id,
            source=BeneficiaryImportSources.demarches_simplifiees.value,
        )
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import,
            status=ImportStatus.CREATED,
            date=yesterday)

        # when
        most_recent_creation_date = find_most_recent_beneficiary_creation_date_for_source(
            BeneficiaryImportSources.demarches_simplifiees, new_source_id)

        # then
        assert most_recent_creation_date == datetime(MINYEAR, 1, 1)
    def test_update_beneficiary_id_piece_number_from_dms_data_with_existing_beneficiary_import(
            self, client):
        user = users_factories.UserFactory()
        fraud_check = fraud_factories.BeneficiaryFraudCheckFactory(
            user=user, type=fraud_models.FraudCheckType.DMS)
        fraud_factories.BeneficiaryFraudResultFactory(
            user=user, status=fraud_models.FraudStatus.SUSPICIOUS)
        dms_data = fraud_check.source_data()
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user,
            applicationId=dms_data.application_id,
            sourceId=dms_data.procedure_id,
            source=pcapi.models.BeneficiaryImportSources.demarches_simplifiees.
            value,
        )
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import)
        client.with_session_auth(self.jouve_admin.email)
        id_piece_number = "123123123123"
        response = client.post(
            f"/pc/back-office/support_beneficiary/update/beneficiary/id_piece_number/{user.id}",
            form={"id_piece_number": id_piece_number},
        )
        assert response.status_code == 302

        assert user.beneficiaryFraudResult.status == fraud_models.FraudStatus.OK
        assert fraud_check.resultContent["id_piece_number"] == id_piece_number
        assert user.idPieceNumber == id_piece_number
        assert user.has_beneficiary_role
        assert len(user.beneficiaryImports) == 1
        assert user.beneficiaryImports[
            0].currentStatus == pcapi.models.ImportStatus.CREATED
Ejemplo n.º 6
0
    def test_returns_created_at_date_of_most_recent_beneficiary_import_with_created_status_for_one_procedure(
            self, app):
        # given
        source_id = 1
        now = datetime.utcnow()
        yesterday = now - timedelta(days=1)
        two_days_ago = now - timedelta(days=2)
        three_days_ago = now - timedelta(days=3)

        users_factories.BeneficiaryGrant18Factory(dateCreated=yesterday,
                                                  email="*****@*****.**")
        user2 = users_factories.BeneficiaryGrant18Factory(
            dateCreated=two_days_ago, email="*****@*****.**")
        user3 = users_factories.BeneficiaryGrant18Factory(
            dateCreated=three_days_ago, email="*****@*****.**")
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user2,
            applicationId=1,
            sourceId=source_id,
            source=BeneficiaryImportSources.demarches_simplifiees.value,
        )
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import,
            status=ImportStatus.ERROR,
            date=two_days_ago)

        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user3,
            applicationId=3,
            sourceId=source_id,
            source=BeneficiaryImportSources.demarches_simplifiees.value,
        )
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import,
            status=ImportStatus.CREATED,
            date=three_days_ago)
        # when
        most_recent_creation_date = find_most_recent_beneficiary_creation_date_for_source(
            BeneficiaryImportSources.demarches_simplifiees, source_id)

        # then
        assert most_recent_creation_date == three_days_ago
Ejemplo n.º 7
0
    def test_user_already_have_jouve_applications(self, import_status):
        user = users_factories.UserFactory()
        users_factories.BeneficiaryImportFactory(
            beneficiary=user, source=BeneficiaryImportSources.jouve.value)

        subscription_api.attach_beneficiary_import_details(
            user, 42, 21, BeneficiaryImportSources.demarches_simplifiees,
            "random_details", import_status)

        beneficiary_import = BeneficiaryImport.query.all()
        assert len(beneficiary_import) == 2
def create_beneficiary_imports(
        beneficiary_user: users_models.User) -> list[BeneficiaryImport]:
    beneficiary_imports = []
    index_of_beneficiary_imports = 1
    for status in ImportStatus:
        user = beneficiary_user if status == ImportStatus.CREATED else None
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user, applicationId=index_of_beneficiary_imports)
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import, status=status)
        index_of_beneficiary_imports += 1

    repository.save(*beneficiary_imports)
    logger.info("created %i beneficiary imports and status",
                len(beneficiary_imports))

    return beneficiary_imports
    def test_archive_applications(self, dms_archive, dms_applications):
        application_id = 42
        user = users_factories.BeneficiaryGrant18Factory()
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            sourceId=self.PROCEDURE_ID,
            applicationId=application_id,
            beneficiary=user)
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import, status=ImportStatus.CREATED)
        dms_applications.return_value = [
            make_graphql_application(application_id,
                                     "closed",
                                     email=user.email)
        ]

        archive_dms_applications.archive_applications(self.PROCEDURE_ID,
                                                      dry_run=False)
        assert dms_archive.call_count == 1
Ejemplo n.º 10
0
    def test_all_steps_to_become_beneficiary_with_lock(self, app):
        """
        Test that the user's id check profile information are updated and that
        it becomes beneficiary (and therefore has a deposit)
        """
        user = users_factories.UserFactory(
            phoneValidationStatus=users_models.PhoneValidationStatusType.
            VALIDATED,
            hasCompletedIdCheck=False,
        )
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user)
        beneficiary_import.setStatus(ImportStatus.CREATED)

        new_address = f"{user.address}_test"
        new_city = f"{user.city}_test"
        # open a second connection on purpose and lock the user
        engine = sqlalchemy.create_engine(
            app.config["SQLALCHEMY_DATABASE_URI"])
        with engine.connect() as connection:
            connection.execute(text(
                """SELECT * FROM "user" WHERE "user".id = :user_id FOR UPDATE"""
            ),
                               user_id=user.id)

            with pytest.raises(sqlalchemy.exc.OperationalError):
                users_api.update_beneficiary_mandatory_information(
                    user=user,
                    address=new_address,
                    city=new_city,
                    postal_code="93000",
                    activity=user.activity,
                )
        user = users_models.User.query.get(user.id)

        assert not user.hasCompletedIdCheck
        assert not user.is_beneficiary
        assert not user.deposit
Ejemplo n.º 11
0
    def test_user_application_already_have_another_dms_application(
            self, import_status):
        user = users_factories.UserFactory()
        application_id = 42
        procedure_id = 21
        beneficiary_import = users_factories.BeneficiaryImportFactory(
            beneficiary=user,
            source=BeneficiaryImportSources.demarches_simplifiees.value,
            applicationId=143,
            sourceId=procedure_id,
        )
        users_factories.BeneficiaryImportStatusFactory(
            beneficiaryImport=beneficiary_import)

        subscription_api.attach_beneficiary_import_details(
            user,
            application_id,
            procedure_id,
            BeneficiaryImportSources.demarches_simplifiees,
            "random details",
            import_status,
        )
        assert BeneficiaryImport.query.count() == 2