def test_sme_resume_chooser(): create_dummy_job(job_id=1) # create new SME sme = SME(guid='whatever', job_id=1) sme.save() # fetch resume to show this SME resume = choose_random_unreviewed_resume_for_sme(sme) # since we did not create any resumes in the mock database, # resume should be None assert resume is None # now, create a profile for a job that is not the SME's job create_dummy_job(job_id=2) create_dummy_profile(1, job_id=2) create_dummy_resume(1, profile_id=1) # there is still no resume for the SME resume = choose_random_unreviewed_resume_for_sme(sme) assert resume is None # now, create a profile for the sme's job create_dummy_profile(2, job_id=1) create_dummy_resume(2, profile_id=2) # try again to fetch a resume resume = choose_random_unreviewed_resume_for_sme(sme) # this time, we should have a non-null value, since there is a profile that # matches the SME's job_id assert resume is not None assert resume.id == 2 assert resume.profile_id == 2
def test_sme_is_not_shown_same_resume_twice(): create_dummy_job(1) sme = SME(guid='whatever', job_id=1) sme.save() create_dummy_profile(1, job_id=1) create_dummy_profile(2, job_id=1) create_dummy_resume(5, profile_id=1) create_dummy_resume(6, profile_id=2) # ensure that the random choice eventually gives us all the resumes ids_seen = set() for i in range(100): resume = choose_random_unreviewed_resume_for_sme(sme) assert resume is not None ids_seen.add(resume.id) assert ids_seen == {5, 6} # simulate the SME reviewing resume #5 SMEFeedback(sme=sme, profile_resume_id=5, should_interview=True).save() for i in range(100): resume = choose_random_unreviewed_resume_for_sme(sme) assert resume is not None assert resume.id == 5 or resume.id == 6
def test_limits_on_reviews_per_resume_per_sme(): job = Job(id=1) job.save() sme = SME(job=job) sme.save() profile = Profile(job=job) profile.save() resume = ProfileResume(profile=profile) resume.save() assert choose_random_unreviewed_resume_for_sme(sme).id == resume.id SMEFeedback(sme=sme, profile_resume=resume, should_interview=True).save() SMEFeedback(sme=sme, profile_resume=resume, should_interview=True).save() SMEFeedback(sme=sme, profile_resume=resume, should_interview=True).save() new_resume = ProfileResume(profile=profile) new_resume.save() SMEFeedback(sme=sme, profile_resume=new_resume, should_interview=False).save() SMEFeedback(sme=sme, profile_resume=new_resume, should_interview=False).save() assert choose_random_unreviewed_resume_for_sme(sme) is None
def test_loading_sme_feedback_page(): job = Job() job.save() sme = SME(guid="first", job=job) sme.save() client = Client() url = "/sme_feedback/" # load SME page with no token page = client.get(url) assert "error:" in contents_of_page(page).lower() # load SME page with bad token page = client.get(url + "?token=bad") assert "error:" in contents_of_page(page).lower() # load SME page with correct token page = client.get(url + "?token=first") assert "error:" not in contents_of_page(page).lower() # there are no resumes yet, so the page should say "try again later" assert "try again later" in contents_of_page(page).lower() # let's add a resume and check that that message is gone profile = Profile(job=job) profile.save() ProfileResume(profile=profile).save() page = client.get(url + "?token=first") assert "try again later" not in contents_of_page(page).lower() assert "see description" in contents_of_page(page).lower()
def test_sme_review_limit(): create_dummy_job(1) limited_sme = SME(guid="first", job_id=1, review_limit=5) unlimited_sme = SME(guid="second", job_id=1, review_limit=None) limited_sme.save() unlimited_sme.save() for i in range(5): assert has_sme_reached_their_review_limit(limited_sme) is False assert has_sme_reached_their_review_limit(unlimited_sme) is False # Add a new resume, and pretend that each SME reviews it. new_profile_id = new_resume_id = i + 1 create_dummy_profile(new_profile_id, job_id=1) create_dummy_resume(new_resume_id, profile_id=new_profile_id) for sme in (limited_sme, unlimited_sme): SMEFeedback(sme=sme, profile_resume_id=new_resume_id, should_interview=False).save() # At this point, each SME has reviewed 5 resumes. assert has_sme_reached_their_review_limit(limited_sme) is True assert has_sme_reached_their_review_limit(unlimited_sme) is False
def test_sme_post(): job = Job(id=1) job.save() sme = SME(id=4, guid="four", job=job) sme.save() Profile(id=2, job_id=1).save() ProfileResume(id=4, profile_id=2).save() url = reverse("resumes:sme_feedback") client = Client() params = { "token": "four", "comment": "comment", "should_interview": "1", "resume_id": 4, "feedback_guid": "1234", "bscore_value": "501", } assert SMEFeedback.objects.count() == 0 client.post(url, params) assert SMEFeedback.objects.count() == 1 client.post(url, params) assert SMEFeedback.objects.count() == 1 feedback = SMEFeedback.objects.first() assert feedback.bscore_value == 501 assert feedback.comment == "comment" assert feedback.wrong_language is False params['feedback_guid'] = "5678" params['column_wrong_language'] = True client.post(url, params) assert SMEFeedback.objects.count() == 2 assert SMEFeedback.objects.filter(wrong_language=True).count() == 1 params['feedback_guid'] = "9abc" params['token'] = "wrong" with pytest.raises(Exception): client.post(url, params) assert SMEFeedback.objects.count() == 2
def test_resume_regions(): add_cities() PA, NJ, CA = [ LookupState.objects.get(state_code=state_code) for state_code in ["PA", "NJ", "CA"] ] pa_region = LookupRegion(city="Philadelphia", state=PA) pa_region.save() ca_region = LookupRegion(city="San Francisco", state=CA) ca_region.save() job = Job() job.save() create_resumes_for_location(job, 3, "Philadelphia", PA) create_resumes_for_location(job, 5, "Haddonfield", NJ) create_resumes_for_location(job, 6, "San Francisco", CA) all_resumes = ProfileResume.objects.filter(profile__job=job) assert filter_resumes_by_region(all_resumes, None).count() == 14 assert filter_resumes_by_region(all_resumes, pa_region).count() == 8 assert filter_resumes_by_region(all_resumes, ca_region).count() == 6 pa_sme = SME(job=job, region=pa_region, guid="pa") pa_sme.save() ca_sme = SME(job=job, region=ca_region, guid="ca") ca_sme.save() for _ in range(20): resume = choose_random_unreviewed_resume_for_sme(pa_sme) assert resume.profile.state.state_code in ("PA", "NJ") resume = choose_random_unreviewed_resume_for_sme(ca_sme) assert resume.profile.state.state_code == "CA" # test region radius assert filter_resumes_by_region(all_resumes, pa_region).count() == 8 pa_region.radius = 100 pa_region.save() assert filter_resumes_by_region(all_resumes, pa_region).count() == 8 pa_region.radius = 5 pa_region.save() assert filter_resumes_by_region(all_resumes, pa_region).count() == 3
def test_choosing_resume_with_bias_toward_already_reviewed(): create_dummy_job(1) sme1 = SME(guid="first", job_id=1) sme1.save() sme2 = SME(guid="second", job_id=1) sme2.save() create_dummy_profile(1, job_id=1) create_dummy_profile(2, job_id=1) create_dummy_resume(6, profile_id=1) create_dummy_resume(8, profile_id=2) # Pretend that sme1 reviews resume #8. SMEFeedback(sme=sme1, profile_resume_id=8, should_interview=False).save() assert all_resumes_to_show_to_sme(sme1) == {6} assert all_resumes_to_show_to_sme(sme2) == {6, 8} # Let us now choose a resume for SME2, but with the probability of choosing # an already-reviewed resume set to 1. Each choice should give us # resume #8, since that is the only resume that has a review. for i in range(20): choice = choose_random_unreviewed_resume_for_sme(sme2, 1.0) assert choice and choice.id == 8
def test_rereview_probability_for_job(): job = Job(id=1) job.save() assert rereview_probability_for_job(job) == 0.01 guids = list(str(n) for n in range(5000)) for _ in range(600): resume = create_resume_for_job(job) resume.save() sme = SME(job=job, guid=guids.pop(0)) sme.save() SMEFeedback(sme=sme, profile_resume=resume, should_interview=False).save() assert rereview_probability_for_job(job) == 0.60 # review each resume three more times for resume in ProfileResume.objects.all(): for _ in range(3): sme = SME(job=job, guid=guids.pop(0)) sme.save() SMEFeedback(sme=sme, profile_resume=resume, should_interview=False).save() assert rereview_probability_for_job(job) == 0.01 # bring number of reviewed resumes up to 1400 for _ in range(800): resume = create_resume_for_job(job) resume.save() sme = SME(job=job, guid=guids.pop(0)) sme.save() SMEFeedback(sme=sme, profile_resume=resume, should_interview=False).save() assert rereview_probability_for_job(job) == 0.5
def test_resume_choices_with_two_smes(): create_dummy_job(1) sme1 = SME(guid="first", job_id=1) sme1.save() sme2 = SME(guid="second", job_id=1) sme2.save() create_dummy_profile(1, job_id=1) create_dummy_profile(2, job_id=1) create_dummy_resume(7, profile_id=1) create_dummy_resume(9, profile_id=2) assert all_resumes_to_show_to_sme(sme1) == {7, 9} assert all_resumes_to_show_to_sme(sme2) == {7, 9} # now let's suppose sme1 reviews resume #9 SMEFeedback(sme=sme1, profile_resume_id=9, should_interview=False).save() assert all_resumes_to_show_to_sme(sme1) == {7} assert all_resumes_to_show_to_sme(sme2) == {7, 9} # Now let's suppose that sme2 marks resume #7 as wrong_job... # neither sme should see resume #7 from now on. SMEFeedback(sme=sme2, profile_resume_id=7, should_interview=False, wrong_job=True).save() assert all_resumes_to_show_to_sme(sme1) == set() assert all_resumes_to_show_to_sme(sme2) == {9} # Now suppose that resume #9 is marked as wrong_language. SMEFeedback(sme=sme2, profile_resume_id=9, should_interview=False, wrong_language=True).save() # At this point, both resumes were disqualified. # A new SME should not see any resumes, nor should any of the others. sme3 = SME(guid="third", job_id=1) sme3.save() assert all_resumes_to_show_to_sme(sme1) == set() assert all_resumes_to_show_to_sme(sme2) == set() assert all_resumes_to_show_to_sme(sme3) == set()