def test_import_data_into_itou(self): developer = UserFactory( email=settings.AI_EMPLOYEES_STOCK_DEVELOPER_EMAIL) CommuneFactory(code=getattr(CleanedAiCsvFileMock, CITY_INSEE_COL)) command = self.command base_data = CleanedAiCsvFileMock() siae = SiaeFactory(siret=getattr(base_data, SIRET_COL), kind=Siae.KIND_AI) # User, approval and job application creation. input_df = pandas.DataFrame([base_data]) output_df = command.import_data_into_itou(df=input_df, to_be_imported_df=input_df) self.assertEqual(User.objects.count(), 2) self.assertEqual(Approval.objects.count(), 1) self.assertEqual(JobApplication.objects.count(), 1) job_seeker = User.objects.filter(is_job_seeker=True).get() self.assertEqual(job_seeker.job_applications.count(), 1) self.assertEqual(job_seeker.approvals.count(), 1) job_seeker.delete() # User, approval and job application retrieval. job_seeker = JobSeekerFactory(nir=getattr(base_data, NIR_COL)) ApprovalFactory(user=job_seeker) JobApplicationFactory( sender_kind=JobApplication.SENDER_KIND_SIAE_STAFF, sender_siae=siae, to_siae=siae, created_at=settings.AI_EMPLOYEES_STOCK_IMPORT_DATE, approval_manually_delivered_by=developer, approval_delivery_mode=JobApplication. APPROVAL_DELIVERY_MODE_MANUAL, job_seeker=job_seeker, hiring_start_at=getattr(base_data, CONTRACT_STARTDATE_COL), ) input_df = pandas.DataFrame([CleanedAiCsvFileMock()]) output_df = command.import_data_into_itou(df=input_df, to_be_imported_df=input_df) self.assertEqual(User.objects.filter(is_job_seeker=True).count(), 1) self.assertEqual(Approval.objects.count(), 1) self.assertEqual(JobApplication.objects.count(), 1) job_seeker.delete() # Only values to be imported are imported but the whole input data frame # is updated for logging purposes. input_df = pandas.DataFrame([ CleanedAiCsvFileMock(**{CONTRACT_ENDDATE_COL: "2020-05-11" }), # Ended contracts are ignored. CleanedAiCsvFileMock( **{SIRET_COL: "598742121322354"}), # Not existing SIAE. CleanedAiCsvFileMock( **{ NIR_COL: "141062a78200555", EMAIL_COL: "*****@*****.**", BIRTHDATE_COL: datetime.date(1997, 3, 12), }), # Different contract start date. CleanedAiCsvFileMock( **{CONTRACT_STARTDATE_COL: datetime.date(2020, 4, 12)}), CleanedAiCsvFileMock(), ]) input_df = command.add_columns_for_asp(input_df) input_df, to_be_imported_df = command.remove_ignored_rows(input_df) output_df = command.import_data_into_itou( df=input_df, to_be_imported_df=to_be_imported_df) self.assertEqual(User.objects.count(), 3) self.assertEqual(Approval.objects.count(), 2) self.assertEqual(JobApplication.objects.count(), 3) job_seeker = User.objects.get(email=getattr(base_data, EMAIL_COL)) self.assertEqual(job_seeker.job_applications.count(), 2) self.assertEqual(job_seeker.approvals.count(), 1) # Different contract start date. job_seeker = User.objects.get(email="*****@*****.**") self.assertEqual(job_seeker.job_applications.count(), 1) self.assertEqual(job_seeker.approvals.count(), 1) # Ignored rows. for _, row in output_df[:2].iterrows(): self.assertTrue(row[COMMENTS_COL]) self.assertFalse(row[PASS_IAE_NUMBER_COL]) self.assertFalse(row[USER_PK_COL]) for _, row in output_df[2:].iterrows(): job_seeker = User.objects.get(nir=row[NIR_COL]) approval = job_seeker.approvals.first() self.assertEqual(row[PASS_IAE_NUMBER_COL], approval.number) self.assertEqual(row[PASS_IAE_START_DATE_COL], approval.start_at.strftime(DATE_FORMAT)) self.assertEqual(row[PASS_IAE_END_DATE_COL], approval.end_at.strftime(DATE_FORMAT)) self.assertEqual(row[USER_PK_COL], job_seeker.jobseeker_hash_id) self.assertEqual(row[USER_ITOU_EMAIL_COL], job_seeker.email) # Clean job_seeker = User.objects.get(nir=getattr(base_data, NIR_COL)) job_seeker.delete() job_seeker = User.objects.get(email="*****@*****.**") job_seeker.delete() # If transaction: raise and pass. job_seeker = JobSeekerFactory( nir=getattr(CleanedAiCsvFileMock(), NIR_COL)) future_date = datetime.date.today() + relativedelta(months=2) ApprovalFactory(user=job_seeker, start_at=future_date) input_df = pandas.DataFrame([ base_data, CleanedAiCsvFileMock( **{ NIR_COL: "141062a78200555", EMAIL_COL: "*****@*****.**", BIRTHDATE_COL: datetime.date(1997, 3, 12), }), ]) output_df = None output_df = command.import_data_into_itou(df=input_df, to_be_imported_df=input_df) self.assertEqual(len(output_df), 2)
def test_find_or_create_approval__create(self): developer = UserFactory( email=settings.AI_EMPLOYEES_STOCK_DEVELOPER_EMAIL) command = self.command # No PASS IAE. job_seeker = JobSeekerFactory( nir=getattr(CleanedAiCsvFileMock(), NIR_COL)) created, approval, _ = command.find_or_create_approval( job_seeker=job_seeker, created_by=developer) self.assertTrue(created) self.assertTrue(approval.is_valid) # Check attributes self.assertEqual(approval.user.pk, job_seeker.pk) self.assertEqual(approval.start_at, datetime.date(2021, 12, 1)) self.assertEqual(approval.end_at, datetime.date(2023, 11, 30)) self.assertEqual(approval.created_by.pk, developer.pk) self.assertEqual(approval.created_at, settings.AI_EMPLOYEES_STOCK_IMPORT_DATE) self.assertTrue(approval.is_from_ai_stock) # Clean job_seeker.delete() # Expired PASS IAE. approval_start_at = datetime.date.today() - relativedelta( years=Approval.DEFAULT_APPROVAL_YEARS, days=2) expired_approval = ApprovalFactory(user__nir=getattr( CleanedAiCsvFileMock(), NIR_COL), start_at=approval_start_at) job_seeker = expired_approval.user created, approval, _ = command.find_or_create_approval( job_seeker=job_seeker, created_by=developer) self.assertTrue(created) self.assertEqual(approval.user.pk, job_seeker.pk) self.assertTrue(approval.is_valid) self.assertEqual(job_seeker.approvals.count(), 2) # Clean job_seeker.delete() # PASS created after November 30th with a job application: # the employer tried to get a PASS IAE quicker. siae = SiaeWithMembershipFactory() previous_approval = ApprovalFactory( user__nir=getattr(CleanedAiCsvFileMock(), NIR_COL)) job_seeker = previous_approval.user job_application = JobApplicationSentBySiaeFactory( job_seeker=job_seeker, to_siae=siae, state=JobApplicationWorkflow.STATE_ACCEPTED, approval=previous_approval, approval_delivery_mode=JobApplication. APPROVAL_DELIVERY_MODE_AUTOMATIC, ) created, _, redelivered_approval = command.find_or_create_approval( job_seeker=job_seeker, created_by=developer) # assert previous approval does not exist anymore. self.assertFalse( Approval.objects.filter(pk=previous_approval.pk).exists()) # assert previous job application does not exist anymore. self.assertFalse( JobApplication.objects.filter(pk=job_application.pk).exists()) # assert a new PASS IAE has been delivered. self.assertTrue(created) self.assertTrue(redelivered_approval) # Clean job_seeker.delete() # PASS created after November 30th with a job application but not sent by this employer. siae = SiaeWithMembershipFactory() previous_approval = ApprovalFactory( user__nir=getattr(CleanedAiCsvFileMock(), NIR_COL)) job_seeker = previous_approval.user job_application = JobApplicationSentBySiaeFactory( job_seeker=job_seeker, state=JobApplicationWorkflow.STATE_ACCEPTED, approval=previous_approval, approval_delivery_mode=JobApplication. APPROVAL_DELIVERY_MODE_AUTOMATIC, ) created, _, redelivered_approval = command.find_or_create_approval( job_seeker=job_seeker, created_by=developer) # assert previous approval does not exist anymore. self.assertFalse( Approval.objects.filter(pk=previous_approval.pk).exists()) # assert previous job application does not exist anymore. self.assertFalse( JobApplication.objects.filter(pk=job_application.pk).exists()) # assert a new PASS IAE has been delivered. self.assertTrue(created) self.assertTrue(redelivered_approval) # Clean job_seeker.delete() # Multiple accepted job applications linked to this approval. Raise an error if dry run is not set. siae = SiaeWithMembershipFactory() previous_approval = ApprovalFactory( user__nir=getattr(CleanedAiCsvFileMock(), NIR_COL)) job_seeker = previous_approval.user job_application = JobApplicationSentBySiaeFactory( job_seeker=job_seeker, to_siae=siae, state=JobApplicationWorkflow.STATE_ACCEPTED, approval=previous_approval, approval_delivery_mode=JobApplication. APPROVAL_DELIVERY_MODE_AUTOMATIC, ) JobApplicationSentBySiaeFactory( job_seeker=job_seeker, state=JobApplicationWorkflow.STATE_ACCEPTED, approval=previous_approval, approval_delivery_mode=JobApplication. APPROVAL_DELIVERY_MODE_AUTOMATIC, ) created, approval, redelivered_approval = command.find_or_create_approval( job_seeker=job_seeker, created_by=developer) self.assertFalse(created) self.assertFalse(redelivered_approval) self.assertTrue(previous_approval.pk, approval.pk) job_seeker.delete()