def setUp(self): # User must be super user for UI first part (tmp) self.siae = SiaeWithMembershipAndJobsFactory( name="Evil Corp.", membership__user__first_name="Elliot", membership__user__is_superuser=True ) self.siae_without_perms = SiaeWithMembershipAndJobsFactory( kind="EITI", name="A-Team", membership__user__first_name="Hannibal" ) self.user = self.siae.members.get(first_name="Elliot") self.user_without_perms = self.siae_without_perms.members.get(first_name="Hannibal") self.job_application = JobApplicationWithApprovalNotCancellableFactory( to_siae=self.siae, ) self.job_seeker = self.job_application.job_seeker self.url = reverse("employee_record_views:list")
def test_apply_as_jobseeker_to_siae_with_approval_in_waiting_period(self): """ Apply as jobseeker to a SIAE (not a GEIQ) with an approval in waiting period. Waiting period cannot be bypassed. """ # Avoid COVID lockdown specific cases now_date = PoleEmploiApproval.LOCKDOWN_START_AT - relativedelta(months=1) now = timezone.datetime(year=now_date.year, month=now_date.month, day=now_date.day, tzinfo=timezone.utc) with mock.patch("django.utils.timezone.now", side_effect=lambda: now): siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = JobSeekerFactory() end_at = now_date - relativedelta(days=30) start_at = end_at - relativedelta(years=2) PoleEmploiApprovalFactory( pole_emploi_id=user.pole_emploi_id, birthdate=user.birthdate, start_at=start_at, end_at=end_at ) self.client.login(username=user.email, password=DEFAULT_PASSWORD) url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) # Follow all redirections… response = self.client.get(url, follow=True) # …until the expected 403. self.assertEqual(response.status_code, 403) self.assertEqual(response.context["exception"], ApprovalsWrapper.ERROR_CANNOT_OBTAIN_NEW_FOR_USER) last_url = response.redirect_chain[-1][0] self.assertEqual(last_url, reverse("apply:step_check_job_seeker_info", kwargs={"siae_pk": siae.pk}))
def test_apply_as_prescriber_for_approval_in_waiting_period(self): """Apply as prescriber for a job seeker with an approval in waiting period.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) job_seeker = JobSeekerFactory() # Create an approval in waiting period. end_at = datetime.date.today() - relativedelta(days=30) start_at = end_at - relativedelta(years=2) ApprovalFactory(user=job_seeker, start_at=start_at, end_at=end_at) user = PrescriberFactory() self.client.login(username=user.email, password=DEFAULT_PASSWORD) url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) # Follow all redirections… response = self.client.get(url, follow=True) # …until a job seeker has to be determined… self.assertEqual(response.status_code, 200) last_url = response.redirect_chain[-1][0] self.assertEqual(last_url, reverse("apply:step_check_job_seeker_nir", kwargs={"siae_pk": siae.pk})) # …choose one, then follow all redirections… post_data = {"nir": job_seeker.nir, "confirm": 1} response = self.client.post(last_url, data=post_data, follow=True) # …until the expected 403. self.assertEqual(response.status_code, 403) self.assertEqual(response.context["exception"], ApprovalsWrapper.ERROR_CANNOT_OBTAIN_NEW_FOR_PROXY) last_url = response.redirect_chain[-1][0] self.assertEqual(last_url, reverse("apply:step_check_job_seeker_info", kwargs={"siae_pk": siae.pk}))
def create_test_data(self): siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) # Only authorized prescribers can add a NIR. # See User.can_add_nir prescriber_organization = PrescriberOrganizationWithMembershipFactory(is_authorized=True) user = prescriber_organization.members.first() return siae, user
def test_apply_as_jobseeker_with_approval_in_waiting_period(self): """Apply as jobseeker with an approval in waiting period.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = JobSeekerFactory() end_at = datetime.date.today() - relativedelta(days=30) start_at = end_at - relativedelta(years=2) PoleEmploiApprovalFactory( pole_emploi_id=user.pole_emploi_id, birthdate=user.birthdate, start_at=start_at, end_at=end_at, ) self.client.login(username=user.email, password=DEFAULT_PASSWORD) url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) # Follow all redirections… response = self.client.get(url, follow=True) # …until the expected 403. self.assertEqual(response.status_code, 403) self.assertEqual( response.context["exception"], ApprovalsWrapper.ERROR_CANNOT_OBTAIN_NEW_FOR_USER, ) last_url = response.redirect_chain[-1][0] self.assertEqual( last_url, reverse("apply:step_check_job_seeker_info", kwargs={"siae_pk": siae.pk}), )
def test_employer_opt_out_siae_with_job_descriptions(self): siae = SiaeWithMembershipAndJobsFactory() user = siae.members.first() job_descriptions_pks = list( siae.job_description_through.values_list("pk", flat=True)) recipient = user.siaemembership_set.get(siae=siae) form_name = "new_job_app_notification_form" self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Recipient's notifications are empty for the moment. self.assertFalse(recipient.notifications) url = reverse("dashboard:edit_user_preferences") response = self.client.get(url) self.assertEqual(response.status_code, 200) # Recipients are subscribed to qualified notifications by default, # the form should reflect that. self.assertEqual( response.context[form_name].fields["qualified"].initial, job_descriptions_pks) # The recipient opted out from every notification. data = {"spontaneous": False} response = self.client.post(url, data=data) self.assertEqual(response.status_code, 302) recipient.refresh_from_db() self.assertTrue(recipient.notifications) for i, pk in enumerate(job_descriptions_pks): self.assertFalse( NewQualifiedJobAppEmployersNotification.is_subscribed( recipient=recipient, subscribed_pk=pk))
def setUp(self): self.siae = SiaeWithMembershipAndJobsFactory(name="Evil Corp.", membership__user__first_name="Elliot") self.siae_without_perms = SiaeWithMembershipAndJobsFactory( kind="EI", name="A-Team", membership__user__first_name="Hannibal" ) self.siae_bad_kind = SiaeWithMembershipAndJobsFactory( kind="EITI", name="A-Team", membership__user__first_name="Barracus" ) self.user = self.siae.members.get(first_name="Elliot") self.user_without_perms = self.siae_without_perms.members.get(first_name="Hannibal") self.user_siae_bad_kind = self.siae_bad_kind.members.get(first_name="Barracus") self.job_application = JobApplicationWithApprovalNotCancellableFactory( to_siae=self.siae, ) self.job_seeker = self.job_application.job_seeker
def test_apply_as_job_seeker_temporary_nir(self): """ Full path is tested above. See test_apply_as_job_seeker. """ siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = JobSeekerFactory(nir="") self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200) next_url = reverse("apply:step_check_job_seeker_nir", kwargs={"siae_pk": siae.pk}) # Follow all redirections until NIR. # ---------------------------------------------------------------------- nir = "123456789KLOIU" post_data = {"nir": nir} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 200) self.assertFalse(response.context["form"].is_valid()) # Temporary number should be skipped. post_data = {"nir": nir, "skip": 1} response = self.client.post(next_url, data=post_data, follow=True) last_url = response.redirect_chain[-1][0] expected_url = reverse("apply:step_application", kwargs={"siae_pk": siae.pk}) self.assertEqual(last_url, expected_url) self.assertEqual(response.status_code, 200) # Step application. # ---------------------------------------------------------------------- response = self.client.get(last_url) self.assertEqual(response.status_code, 200) post_data = { "selected_jobs": [siae.job_description_through.first().pk], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "resume_link": "https://server.com/rocky-balboa.pdf", } response = self.client.post(last_url, data=post_data, follow=True) self.assertEqual(response.status_code, 200) last_url = response.redirect_chain[-1][0] next_url = reverse("apply:step_application_sent", kwargs={"siae_pk": siae.pk}) self.assertEqual(last_url, next_url) user.refresh_from_db() self.assertFalse(user.nir)
def test_job_description_card(self): siae = SiaeWithMembershipAndJobsFactory() job_description = siae.job_description_through.first() job_description.description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." job_description.save() url = reverse("siaes_views:job_description_card", kwargs={"job_description_id": job_description.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.context["job"], job_description) self.assertEqual(response.context["siae"], siae) self.assertContains(response, job_description.description) self.assertContains(response, escape(job_description.display_name)) self.assertContains(response, escape(siae.display_name))
def test_block_direct_job_application(self): """ Check if user is trying to get to job application directly via URL """ siae = SiaeWithMembershipAndJobsFactory(block_job_applications=True) user = JobSeekerFactory() self.client.login(username=user.email, password=DEFAULT_PASSWORD) url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 404) # Check for member of the SIAE: should pass user = siae.members.first() self.client.login(username=user.email, password=DEFAULT_PASSWORD) url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302)
def test_apply_as_authorized_prescriber_for_approval_in_waiting_period( self): """Apply as authorized prescriber for a job seeker with an approval in waiting period.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) job_seeker = JobSeekerFactory() # Create an approval in waiting period. end_at = datetime.date.today() - relativedelta(days=30) start_at = end_at - relativedelta(years=2) ApprovalFactory(user=job_seeker, start_at=start_at, end_at=end_at) prescriber_organization = PrescriberOrganizationWithMembershipFactory( is_authorized=True) user = prescriber_organization.members.first() self.client.login(username=user.email, password=DEFAULT_PASSWORD) url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) # Follow all redirections… response = self.client.get(url, follow=True) # …until a job seeker has to be determined… self.assertEqual(response.status_code, 200) last_url = response.redirect_chain[-1][0] self.assertEqual( last_url, reverse("apply:step_job_seeker", kwargs={"siae_pk": siae.pk})) # …choose one, then follow all redirections… post_data = {"email": job_seeker.email} response = self.client.post(last_url, data=post_data, follow=True) # …until the eligibility step which should trigger a 200 OK. self.assertEqual(response.status_code, 200) last_url = response.redirect_chain[-1][0] self.assertEqual( last_url, reverse("apply:step_eligibility", kwargs={"siae_pk": siae.pk}))
def setUp(self): """ Create three organizations with two members each: - pole_emploi: job seekers agency. - l_envol: an emergency center for homeless people. - hit_pit: a boxing gym looking for boxers. Pole Emploi prescribers: - Thibault - laurie L'envol prescribers: - Audrey - Manu Hit Pit staff: - Eddie """ # Pole Emploi pole_emploi = AuthorizedPrescriberOrganizationWithMembershipFactory( name="Pôle emploi", membership__user__first_name="Thibault" ) PrescriberMembershipFactory(organization=pole_emploi, user__first_name="Laurie") thibault_pe = pole_emploi.members.get(first_name="Thibault") laurie_pe = pole_emploi.members.get(first_name="Laurie") # L'Envol l_envol = PrescriberOrganizationWithMembershipFactory(name="L'Envol", membership__user__first_name="Manu") PrescriberMembershipFactory(organization=l_envol, user__first_name="Audrey") audrey_envol = l_envol.members.get(first_name="Audrey") # Hit Pit hit_pit = SiaeWithMembershipAndJobsFactory(name="Hit Pit", membership__user__first_name="Eddie") eddie_hit_pit = hit_pit.members.get(first_name="Eddie") # Now send applications for i, state in enumerate(JobApplicationWorkflow.states): creation_date = timezone.now() - timezone.timedelta(days=i) job_application = JobApplicationSentByPrescriberFactory( to_siae=hit_pit, state=state, created_at=creation_date, sender=thibault_pe, sender_prescriber_organization=pole_emploi, ) maggie = job_application.job_seeker maggie.save(update_fields={"first_name": "Maggie"}) JobApplicationSentByPrescriberFactory( to_siae=hit_pit, sender=laurie_pe, sender_prescriber_organization=pole_emploi, job_seeker=maggie ) self.prescriber_base_url = reverse("apply:list_for_prescriber") self.job_seeker_base_url = reverse("apply:list_for_job_seeker") self.siae_base_url = reverse("apply:list_for_siae") self.prescriber_exports_url = reverse("apply:list_for_prescriber_exports") self.siae_exports_url = reverse("apply:list_for_siae_exports") # Variables available for unit tests self.pole_emploi = pole_emploi self.hit_pit = hit_pit self.l_envol = l_envol self.thibault_pe = thibault_pe self.laurie_pe = laurie_pe self.eddie_hit_pit = eddie_hit_pit self.audrey_envol = audrey_envol self.maggie = maggie
def test_apply_as_authorized_prescriber(self): """Apply as authorized prescriber.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) prescriber_organization = PrescriberOrganizationWithMembershipFactory( is_authorized=True) user = prescriber_organization.members.first() self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": None, "to_siae_pk": siae.pk, "sender_pk": None, "sender_kind": None, "sender_siae_pk": None, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_sender", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the sender. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": None, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_PRESCRIBER, "sender_siae_pk": None, "sender_prescriber_organization_pk": prescriber_organization.pk, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_job_seeker", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = {"email": "*****@*****.**"} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_create_job_seeker", kwargs={"siae_pk": siae.pk}) args = urlencode({"email": post_data["email"]}) self.assertEqual(response.url, f"{next_url}?{args}") # Step create a job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "email": "*****@*****.**", "first_name": "John", "last_name": "Doe", "birthdate": "20/12/1978", "phone": "0610200305", "pole_emploi_id": "12345678", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) new_job_seeker = get_user_model().objects.get(email=post_data["email"]) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": new_job_seeker.pk, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_PRESCRIBER, "sender_siae_pk": None, "sender_prescriber_organization_pk": prescriber_organization.pk, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_eligibility", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step eligibility. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) self.assertFalse(new_job_seeker.has_valid_eligibility_diagnosis) response = self.client.post(next_url) self.assertEqual(response.status_code, 302) # In order to avoid calling the database too often, `has_eligibility_diagnoses` # is a cached property. # Delete the attribute to refresh it. # See https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.functional.cached_property delattr(new_job_seeker, "has_eligibility_diagnoses") self.assertTrue(new_job_seeker.has_valid_eligibility_diagnosis) next_url = reverse("apply:step_application", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step application. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "selected_jobs": [ siae.job_description_through.first().pk, siae.job_description_through.last().pk ], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:list_for_prescriber") self.assertEqual(response.url, next_url) job_application = JobApplication.objects.get(job_seeker=new_job_seeker, sender=user, to_siae=siae) self.assertEqual(job_application.sender_kind, JobApplication.SENDER_KIND_PRESCRIBER) self.assertEqual(job_application.sender_siae, None) self.assertEqual(job_application.sender_prescriber_organization, prescriber_organization) self.assertEqual(job_application.state, job_application.state.workflow.STATE_NEW) self.assertEqual(job_application.message, post_data["message"]) self.assertEqual(job_application.answer, "") self.assertEqual(job_application.selected_jobs.count(), 2) self.assertEqual(job_application.selected_jobs.first().pk, post_data["selected_jobs"][0]) self.assertEqual(job_application.selected_jobs.last().pk, post_data["selected_jobs"][1])
def test_siae_with_membership_and_jobs_factory(self): siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) self.assertEqual(siae.jobs.count(), 4)
def test_apply_as_siae(self): """Apply as SIAE.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = siae.members.first() self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "to_siae_pk": siae.pk, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_sender", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the sender. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_SIAE_STAFF, "sender_siae_pk": siae.pk, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_check_job_seeker_nir", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the job seeker with a NIR. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) nir = "141068078200557" post_data = {"nir": nir, "confirm": 1} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "nir": nir, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_SIAE_STAFF, "sender_siae_pk": siae.pk, } next_url = reverse("apply:step_job_seeker", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step get job seeker e-mail. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = {"email": "*****@*****.**", "save": "1"} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_create_job_seeker", kwargs={"siae_pk": siae.pk}) args = urlencode({"email": post_data["email"]}) self.assertEqual(response.url, f"{next_url}?{args}") # Step create a job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "email": "*****@*****.**", "first_name": "John", "last_name": "Doe", "birthdate": "20/12/1978", "phone": "0610200305", "pole_emploi_id": "12345678", "address_line_1": "36, rue du 6 Mai 1956", "post_code": self.city.post_codes[0], "city": self.city.name, "city_slug": self.city.slug, } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) new_job_seeker = User.objects.get(email=post_data["email"]) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "job_seeker_pk": new_job_seeker.pk, "nir": new_job_seeker.nir, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_SIAE_STAFF, "sender_siae_pk": siae.pk, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_eligibility", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step eligibility. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step application. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "selected_jobs": [siae.job_description_through.first().pk, siae.job_description_through.last().pk], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "resume_link": "https://server.com/rockie-balboa.pdf", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application_sent", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) job_application = JobApplication.objects.get(job_seeker=new_job_seeker, sender=user, to_siae=siae) self.assertEqual(job_application.sender_kind, JobApplication.SENDER_KIND_SIAE_STAFF) self.assertEqual(job_application.sender_siae, siae) self.assertEqual(job_application.sender_prescriber_organization, None) self.assertEqual(job_application.state, job_application.state.workflow.STATE_NEW) self.assertEqual(job_application.message, post_data["message"]) self.assertEqual(job_application.answer, "") self.assertEqual(job_application.selected_jobs.count(), 2) self.assertEqual(job_application.selected_jobs.first().pk, post_data["selected_jobs"][0]) self.assertEqual(job_application.selected_jobs.last().pk, post_data["selected_jobs"][1]) self.assertEqual(job_application.resume_link, post_data["resume_link"])
def test_apply_as_jobseeker(self): """Apply as jobseeker.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = JobSeekerFactory(birthdate=None) self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": None, "to_siae_pk": siae.pk, "sender_pk": None, "sender_kind": None, "sender_siae_pk": None, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_sender", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the sender. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": None, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_JOB_SEEKER, "sender_siae_pk": None, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_job_seeker", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": user.pk, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_JOB_SEEKER, "sender_siae_pk": None, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_check_job_seeker_info", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step check job seeker info. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "birthdate": "20/12/1978", "phone": "0610203040", "pole_emploi_id": "1234567A", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) user = get_user_model().objects.get(pk=user.pk) self.assertEqual(user.birthdate.strftime("%d/%m/%Y"), post_data["birthdate"]) self.assertEqual(user.phone, post_data["phone"]) self.assertEqual(user.pole_emploi_id, post_data["pole_emploi_id"]) next_url = reverse("apply:step_check_prev_applications", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step check previous job applications. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_eligibility", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step eligibility. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step application. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "selected_jobs": [siae.job_description_through.first().pk], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:list_for_job_seeker") self.assertEqual(response.url, next_url) job_application = JobApplication.objects.get(job_seeker=user, sender=user, to_siae=siae) self.assertEqual(job_application.sender_kind, JobApplication.SENDER_KIND_JOB_SEEKER) self.assertEqual(job_application.sender_siae, None) self.assertEqual(job_application.sender_prescriber_organization, None) self.assertEqual(job_application.state, job_application.state.workflow.STATE_NEW) self.assertEqual(job_application.message, post_data["message"]) self.assertEqual(job_application.answer, "") self.assertEqual(job_application.selected_jobs.count(), 1) self.assertEqual(job_application.selected_jobs.first().pk, post_data["selected_jobs"][0])
def test_apply_to_a_geiq_as_authorized_prescriber(self): """Apply to a GEIQ as authorized prescriber.""" siae = SiaeWithMembershipAndJobsFactory(kind=Siae.KIND_GEIQ, romes=("N1101", "N1105")) prescriber_organization = PrescriberOrganizationWithMembershipFactory(is_authorized=True) user = prescriber_organization.members.first() self.client.login(username=user.email, password=DEFAULT_PASSWORD) job_seeker = JobSeekerFactory() # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "to_siae_pk": siae.pk, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_sender", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the sender. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_PRESCRIBER, "sender_prescriber_organization_pk": prescriber_organization.pk, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_check_job_seeker_nir", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = {"nir": job_seeker.nir, "confirm": 1} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_check_job_seeker_info", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step eligibility (not required when applying to a GEIQ). # ---------------------------------------------------------------------- # Follow all redirections… response = self.client.post(next_url, follow=True) self.assertEqual(response.status_code, 200) self.assertFalse(EligibilityDiagnosis.objects.has_considered_valid(job_seeker, for_siae=siae)) # …until it hits the job application page. last_url = response.redirect_chain[-1][0] self.assertEqual(last_url, reverse("apply:step_application", kwargs={"siae_pk": siae.pk})) # Step application. # ---------------------------------------------------------------------- response = self.client.get(last_url) self.assertEqual(response.status_code, 200) post_data = { "selected_jobs": [siae.job_description_through.first().pk, siae.job_description_through.last().pk], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "resume_link": "https://server.com/rockie-balboa.pdf", } response = self.client.post(last_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application_sent", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) job_application = JobApplication.objects.get(job_seeker=job_seeker, sender=user, to_siae=siae) self.assertEqual(job_application.sender_kind, JobApplication.SENDER_KIND_PRESCRIBER) self.assertEqual(job_application.sender_siae, None) self.assertEqual(job_application.sender_prescriber_organization, prescriber_organization) self.assertEqual(job_application.state, job_application.state.workflow.STATE_NEW) self.assertEqual(job_application.message, post_data["message"]) self.assertEqual(job_application.answer, "") self.assertEqual(job_application.selected_jobs.count(), 2) self.assertEqual(job_application.selected_jobs.first().pk, post_data["selected_jobs"][0]) self.assertEqual(job_application.selected_jobs.last().pk, post_data["selected_jobs"][1]) self.assertEqual(job_application.resume_link, post_data["resume_link"])
def test_apply_as_jobseeker(self): """Apply as jobseeker.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = JobSeekerFactory(birthdate=None, nir="") self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "to_siae_pk": siae.pk, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_sender", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the sender. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_JOB_SEEKER, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_check_job_seeker_nir", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step check job seeker NIR. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) nir = "141068078200557" post_data = {"nir": nir, "confirm": 1} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) user = User.objects.get(pk=user.pk) self.assertEqual(user.nir, nir) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = self.default_session_data | { "job_seeker_pk": user.pk, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_JOB_SEEKER, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_check_job_seeker_info", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step check job seeker info. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = {"birthdate": "20/12/1978", "phone": "0610203040", "pole_emploi_id": "1234567A"} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) user = User.objects.get(pk=user.pk) self.assertEqual(user.birthdate.strftime("%d/%m/%Y"), post_data["birthdate"]) self.assertEqual(user.phone, post_data["phone"]) self.assertEqual(user.pole_emploi_id, post_data["pole_emploi_id"]) next_url = reverse("apply:step_check_prev_applications", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step check previous job applications. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_eligibility", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step eligibility. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step application. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) # Test fields mandatory to upload to S3 s3_upload = S3Upload(kind="resume") resume_config = s3_upload.config s3_form_endpoint = s3_upload.form_values["url"] # Don't test S3 form fields as it led to flaky tests and # it's already done by the Boto library. self.assertContains(response, s3_form_endpoint) # Config variables resume_config.pop("upload_expiration") for _, value in resume_config.items(): self.assertContains(response, value) post_data = { "selected_jobs": [siae.job_description_through.first().pk], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "resume_link": "https://server.com/rocky-balboa.pdf", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application_sent", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) job_application = JobApplication.objects.get(job_seeker=user, sender=user, to_siae=siae) self.assertEqual(job_application.sender_kind, JobApplication.SENDER_KIND_JOB_SEEKER) self.assertEqual(job_application.sender_siae, None) self.assertEqual(job_application.sender_prescriber_organization, None) self.assertEqual(job_application.state, job_application.state.workflow.STATE_NEW) self.assertEqual(job_application.message, post_data["message"]) self.assertEqual(job_application.answer, "") self.assertEqual(job_application.selected_jobs.count(), 1) self.assertEqual(job_application.selected_jobs.first().pk, post_data["selected_jobs"][0]) self.assertEqual(job_application.resume_link, post_data["resume_link"])
def test_apply_as_siae(self): """Apply as SIAE.""" siae = SiaeWithMembershipAndJobsFactory(romes=("N1101", "N1105")) user = siae.members.first() self.client.login(username=user.email, password=DEFAULT_PASSWORD) # Entry point. # ---------------------------------------------------------------------- url = reverse("apply:start", kwargs={"siae_pk": siae.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": None, "to_siae_pk": siae.pk, "sender_pk": None, "sender_kind": None, "sender_siae_pk": None, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_sender", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the sender. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": None, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_SIAE_STAFF, "sender_siae_pk": siae.pk, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_job_seeker", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step determine the job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = {"email": "*****@*****.**"} response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_create_job_seeker", kwargs={"siae_pk": siae.pk}) args = urlencode({"email": post_data["email"]}) self.assertEqual(response.url, f"{next_url}?{args}") # Step create a job seeker. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "email": "*****@*****.**", "first_name": "John", "last_name": "Doe", "birthdate": "20/12/1978", "phone": "0610200305", "pole_emploi_id": "12345678", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) new_job_seeker = get_user_model().objects.get(email=post_data["email"]) session = self.client.session session_data = session[settings.ITOU_SESSION_JOB_APPLICATION_KEY] expected_session_data = { "job_seeker_pk": new_job_seeker.pk, "to_siae_pk": siae.pk, "sender_pk": user.pk, "sender_kind": JobApplication.SENDER_KIND_SIAE_STAFF, "sender_siae_pk": siae.pk, "sender_prescriber_organization_pk": None, "job_description_id": None, } self.assertDictEqual(session_data, expected_session_data) next_url = reverse("apply:step_eligibility", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step eligibility. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 302) next_url = reverse("apply:step_application", kwargs={"siae_pk": siae.pk}) self.assertEqual(response.url, next_url) # Step application. # ---------------------------------------------------------------------- response = self.client.get(next_url) self.assertEqual(response.status_code, 200) post_data = { "selected_jobs": [ siae.job_description_through.first().pk, siae.job_description_through.last().pk, ], "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", } response = self.client.post(next_url, data=post_data) self.assertEqual(response.status_code, 302) next_url = reverse("apply:list_for_siae") self.assertEqual(response.url, next_url) job_application = JobApplication.objects.get(job_seeker=new_job_seeker, sender=user, to_siae=siae) self.assertEqual(job_application.sender_kind, JobApplication.SENDER_KIND_SIAE_STAFF) self.assertEqual(job_application.sender_siae, siae) self.assertEqual(job_application.sender_prescriber_organization, None) self.assertEqual(job_application.state, job_application.state.workflow.STATE_NEW) self.assertEqual(job_application.message, post_data["message"]) self.assertEqual(job_application.answer, "") self.assertEqual(job_application.selected_jobs.count(), 2) self.assertEqual(job_application.selected_jobs.first().pk, post_data["selected_jobs"][0]) self.assertEqual(job_application.selected_jobs.last().pk, post_data["selected_jobs"][1])