def test_that_only_competent_people_get_returned(self):

        competent_project = RecruitProjectFactory(complete_time=timezone.now(),
                                                  flavours=[JAVASCRIPT])
        content_item = competent_project.content_item
        nyc_project = RecruitProjectFactory(complete_time=None,
                                            flavours=[JAVASCRIPT],
                                            content_item=content_item)
        wrong_flavour_project = RecruitProjectFactory(
            complete_time=timezone.now(),
            flavours=[TYPESCRIPT],
            content_item=content_item,
        )

        card = AgileCardFactory(
            recruit_project=RecruitProjectFactory(
                complete_time=None,
                flavours=[JAVASCRIPT],
                content_item=content_item,
            ),
            status=AgileCard.IN_PROGRESS,
        )

        assert card.flavours_match(
            card.recruit_project.flavour_names
        ), f"{card.flavour_names} != {card.recruit_project.flavour_names}"
        result = list(get_possible_competent_reviewers(card))
        self.assertEqual(result, [competent_project.recruit_users.first()])
예제 #2
0
    def test(self):
        user = UserFactory()
        content_item = ContentItemFactory(flavours=["js"])

        for i in range(CURRICULUM_TRACKING_TRUST_STREAK_LENGTH - 1):
            project = RecruitProjectFactory(content_item=content_item, flavours=["js"])
            RecruitProjectReviewFactory(
                recruit_project=project,
                reviewer_user=user,
                validated=RecruitProjectReview.CORRECT,
            )
            trust_count = ReviewTrust.objects.all().count()
            self.assertEqual(trust_count, 0)

        # add one more and the user should be trusted
        project = RecruitProjectFactory(content_item=content_item, flavours=["js"])
        RecruitProjectReviewFactory(
            recruit_project=project,
            reviewer_user=user,
            validated=RecruitProjectReview.CORRECT,
        )
        trust_count = ReviewTrust.objects.all().count()
        self.assertEqual(trust_count, 1)

        trust = ReviewTrust.objects.first()
        self.assertEqual(trust.content_item, content_item)
        self.assertEqual(trust.user, user)
        self.assertTrue(trust.flavours_match(["js"]))
예제 #3
0
    def test_all(self):

        time_1 = timezone.now() - datetime.timedelta(days=1)
        time_2 = time_1 + datetime.timedelta(hours=1)
        time_3 = time_1 + datetime.timedelta(hours=2)
        time_4 = time_1 + datetime.timedelta(hours=3)

        project = RecruitProjectFactory()
        project.review_request_time = time_2
        review_1 = RecruitProjectReviewFactory(recruit_project=project,
                                               timestamp=time_1)
        review_1.timestamp = time_1
        review_1.save()
        review_2 = RecruitProjectReviewFactory(recruit_project=project,
                                               timestamp=time_3)
        review_2.timestamp = time_3
        review_2.save()
        review_3 = RecruitProjectReviewFactory(recruit_project=project,
                                               timestamp=time_4)
        review_3.timestamp = time_4
        review_3.save()

        # assert review_1.timestamp == time_1, review_1.timestamp
        # assert project.review_request_time == time_2
        # assert review_2.timestamp == time_3
        # assert review_3.timestamp == time_4
        # assert time_1 < time_2
        # assert time_2 < time_3
        # assert time_3 < time_4

        self.assertFalse(review_1.is_first_review_after_request())
        self.assertTrue(review_2.is_first_review_after_request())
        self.assertFalse(review_3.is_first_review_after_request())
예제 #4
0
    def test_updates_only_fist_one(self):
        time_1 = timezone.now() - datetime.timedelta(days=1)
        time_2 = time_1 + datetime.timedelta(hours=1)
        time_3 = time_1 + datetime.timedelta(hours=2)
        time_4 = time_1 + datetime.timedelta(hours=3)

        project = RecruitProjectFactory()
        project.review_request_time = time_1

        review_1 = RecruitProjectReviewFactory(
            recruit_project=project, timestamp=time_1, status=COMPETENT
        )
        review_1.timestamp = time_2
        review_1.save()
        review_2 = RecruitProjectReviewFactory(
            recruit_project=project, timestamp=time_3, status=COMPETENT
        )
        review_2.timestamp = time_3
        review_2.save()
        review_3 = RecruitProjectReviewFactory(
            recruit_project=project, timestamp=time_4, status=COMPETENT
        )
        review_3.timestamp = time_4
        review_3.trusted = True
        review_3.save()

        review_3.update_recent_validation_flags_for_project()

        review_1.refresh_from_db()
        review_2.refresh_from_db()
        review_3.refresh_from_db()

        self.assertEqual(review_1.validated, RecruitProjectReview.CORRECT)
        self.assertEqual(review_2.validated, None)
        self.assertEqual(review_3.validated, None)
예제 #5
0
    def setUp(self):
        self.card = AgileCardFactory()
        self.card.recruit_project.set_flavours(MATCHING_FLAVOURS)
        self.card.set_flavours(MATCHING_FLAVOURS)

        self.project = RecruitProjectFactory(
            content_item=self.card.content_item)
        self.user = self.project.recruit_users.first()
예제 #6
0
    def test_bulk_set_due_date_happened_for_every_card_with_the_same_content_item_for_the_team(
        self, ):
        """
        Three cards, two with the same content_item and one with a different content_item.  The one with the
        different content_item should not have it's due_time updated, it should be left as it is.
        """
        project = RecruitProjectFactory(due_time=None)
        card_1 = AgileCardFactory(recruit_project=project,
                                  flavours=["JAVASCRIPT"])
        card_1.assignees.add(self.user_one_red)
        card_2 = AgileCardFactory(
            recruit_project=RecruitProjectFactory(due_time=None),
            content_item=card_1.content_item,
            flavours=["JAVASCRIPT"],
        )
        card_2.assignees.add(self.user_two_red)
        card_3 = AgileCardFactory(
            recruit_project=RecruitProjectFactory(due_time=None),
            flavours=["JAVASCRIPT"],
        )
        card_3.assignees.add(self.user_two_red)
        self.assertEqual(card_1.content_item, card_2.content_item)
        self.assertNotEqual(card_1.content_item, card_3.content_item)

        self.login(self.super_user)
        url = f"{self.get_instance_url(pk=self.red_team.id)}bulk_set_due_dates/"
        due_date = "2021-12-03T14:17"
        response = self.client.post(
            path=url,
            format="json",
            data={
                "due_time": due_date,
                "content_item": card_1.content_item.id,
                "team": str(self.red_team.id),
                "flavours": [card_1.flavours.first().id],
            },
        )
        self.assertEqual(response.status_code, 200)

        team_cards = get_team_cards(self.red_team, card_1.content_item)
        self.assertIn(card_1, team_cards)
        self.assertIn(card_2, team_cards)
        self.assertNotIn(card_3, team_cards)

        for card in team_cards:
            card.refresh_from_db()
            date_expected = parse_datetime(due_date).replace(
                tzinfo=timezone.utc)
            self.assertTrue(card.due_time, date_expected)

        self.assertIsNone(card_3.due_time)
예제 #7
0
    def test_super_user_can_bulk_set_due_dates_for_a_team(self):

        project = RecruitProjectFactory(due_time=None)
        card = AgileCardFactory(recruit_project=project,
                                flavours=["JAVASCRIPT", "PYTHON"])
        card.reviewers.add(self.user_one_blue)
        card.assignees.add(self.user_two_blue)
        self.assertIsNone(card.due_time)
        self.login(self.super_user)
        url = f"{self.get_instance_url(pk=self.blue_team.id)}bulk_set_due_dates/"
        due_date = "2021-12-03T14:17"
        response = self.client.post(
            path=url,
            format="json",
            data={
                "due_time": due_date,
                "content_item": card.content_item.id,
                "team": str(self.blue_team.id),
                "flavours":
                [card.flavours.first().id,
                 card.flavours.last().id],
            },
        )

        self.assertEqual(response.status_code, 200)
        card.refresh_from_db()
        date_expected = parse_datetime(due_date).replace(tzinfo=timezone.utc)
        self.assertEqual(card.due_time, date_expected)
    def test_that_it_works_with_flavourless_projects(self):
        competent_project = RecruitProjectFactory(complete_time=timezone.now(),
                                                  flavours=[])
        content_item = competent_project.content_item
        nyc_project = RecruitProjectFactory(complete_time=None,
                                            flavours=[],
                                            content_item=content_item)
        wrong_flavour_project = RecruitProjectFactory(
            complete_time=timezone.now(),
            flavours=[TYPESCRIPT],
            content_item=content_item,
        )

        card = AgileCardFactory(recruit_project=RecruitProjectFactory(
            complete_time=None, flavours=[], content_item=content_item))
        result = list(get_possible_competent_reviewers(card))
        self.assertEqual(result, [competent_project.recruit_users.first()])
예제 #9
0
    def test_multiple_projects_submitted(self):
        team = TeamFactory()
        project1 = RecruitProjectFactory(link_submission='https://i_am_a_link')
        link1 = project1.link_submission
        user1 = project1.recruit_users.first()
        team.users.add(user1)

        project2 = RecruitProjectFactory(
            link_submission='https://i_am_another_link',
            content_item=project1.content_item)
        link2 = project2.link_submission
        user2 = project2.recruit_users.first()
        team.users.add(user2)

        results = get_user_and_projectlink(team, project1.content_item)
        self.assertEqual(results[0], [user1.email, link1])
        self.assertEqual(results[1], [user2.email, link2])
예제 #10
0
    def setUp(self):
        content_item = ContentItemFactory()

        self.project_js_1 = RecruitProjectFactory(
            flavours=["js"], content_item=content_item
        )

        self.project_js_2 = RecruitProjectFactory(
            flavours=["js"], content_item=content_item
        )

        self.project_js_3 = RecruitProjectFactory(
            flavours=["js"], content_item=content_item
        )

        self.project_js_4 = RecruitProjectFactory(
            flavours=["js"], content_item=content_item
        )

        self.project_ts_1 = RecruitProjectFactory(
            flavours=["ts"], content_item=content_item
        )

        self.project_ts_2 = RecruitProjectFactory(
            flavours=["ts"], content_item=content_item
        )

        self.project_ts_3 = RecruitProjectFactory(
            flavours=["ts"], content_item=content_item
        )

        self.user_1 = UserFactory()
        self.user_2 = UserFactory()
예제 #11
0
    def test_project_submitted(self):
        team = TeamFactory()
        project = RecruitProjectFactory(link_submission='https://i_am_a_link')
        link = project.link_submission
        user = project.recruit_users.first()
        team.users.add(user)

        result = get_user_and_projectlink(team, project.content_item)
        self.assertEqual(result[0], [user.email, link])
예제 #12
0
    def test_due_date_not_set_if_flavour_name_differs_to_request(self):
        """
        Three cards (1 'js' flavour & 2 'python' flavoured); the request is for team_cards with a 'js' flavour to have
        their due dates set and all other flavoured cards to not have their due dates altered.
        """
        project = RecruitProjectFactory(due_time=None)
        card_1 = AgileCardFactory(recruit_project=project,
                                  flavours=["JAVASCRIPT"])
        card_1.assignees.add(self.user_one_red)
        card_2 = AgileCardFactory(
            recruit_project=RecruitProjectFactory(due_time=None),
            content_item=card_1.content_item,
            flavours=["PYTHON"],
        )
        card_2.assignees.add(self.user_two_red)
        card_3 = AgileCardFactory(
            recruit_project=RecruitProjectFactory(due_time=None),
            content_item=card_1.content_item,
            flavours=["PYTHON"],
        )
        card_3.assignees.add(self.user_two_red)
        self.assertEqual(card_1.content_item, card_2.content_item)
        self.assertEqual(card_1.content_item, card_3.content_item)
        self.login(self.super_user)
        url = f"{self.get_instance_url(pk=self.red_team.id)}bulk_set_due_dates/"
        due_date = "2022-01-20T12:17"
        response = self.client.post(
            path=url,
            format="json",
            data={
                "due_time": due_date,
                "content_item": card_1.content_item.id,
                "flavours": [card_1.flavours.first().id],
            },
        )
        self.assertEqual(response.status_code, 200)

        card_1.refresh_from_db()
        card_2.refresh_from_db()
        card_3.refresh_from_db()
        date_expected = parse_datetime(due_date).replace(tzinfo=timezone.utc)
        self.assertEqual(card_1.due_time, date_expected)
        self.assertIsNone(card_2.due_time)
        self.assertIsNone(card_3.due_time)
    def test_that_only_competent_people_get_returned(self):
        config = NameSpace.get_config(CONFIGURATION_NAMESPACE)
        competent_project = RecruitProjectFactory(complete_time=timezone.now(),
                                                  flavours=[JAVASCRIPT])

        content_item = competent_project.content_item

        card = AgileCardFactory(
            recruit_project=RecruitProjectFactory(
                complete_time=None,
                flavours=[JAVASCRIPT],
                content_item=content_item,
            ),
            status=AgileCard.IN_PROGRESS,
        )

        team = TeamFactory(
            name=config.EXCLUDE_TEAMS_FROM_COMPETENT_REVIEW_STEP[0])
        team.user_set.add(competent_project.recruit_users.first())
        result = list(get_possible_competent_reviewers(card))
        self.assertEqual(result, [])
예제 #14
0
 def test_team_members_cannot_bulk_set_due_dates_for_the_team_they_belong_to(
         self):
     project = RecruitProjectFactory(due_time=None)
     card = AgileCardFactory(recruit_project=project)
     card.reviewers.add(self.user_one_red)
     card.assignees.add(self.user_two_red)
     self.login(self.user_two_red)
     url = f"{self.get_instance_url(pk=self.red_team.id)}bulk_set_due_dates/"
     response = self.client.post(
         path=url,
         format="json",
         data={
             "due_time": "2021-12-03T14:17",
             "content_item": card.content_item.id,
             "flavours": [1, 2, 3],
         },
     )
     self.assertEqual(response.status_code, 404)
예제 #15
0
class user_is_competent_for_card_project_Test(TestCase):
    def setUp(self):
        self.card = AgileCardFactory()
        self.card.recruit_project.set_flavours(MATCHING_FLAVOURS)
        self.card.set_flavours(MATCHING_FLAVOURS)

        self.project = RecruitProjectFactory(
            content_item=self.card.content_item)
        self.user = self.project.recruit_users.first()

    def test_is_competent_with_flavours(self):

        self.project.set_flavours(MATCHING_FLAVOURS)
        self.project.complete_time = timezone.now()
        self.project.save()

        self.assertTrue(
            user_is_competent_for_card_project(card=self.card, user=self.user))

    def test_is_competent_with_no_flavours(self):

        self.project.set_flavours([])
        self.card.recruit_project.set_flavours([])
        self.card.set_flavours([])
        self.project.complete_time = timezone.now()
        self.project.save()
        self.assertTrue(
            user_is_competent_for_card_project(card=self.card, user=self.user))

    def test_is_not_competent_because_not_complete(self):

        self.project.set_flavours(MATCHING_FLAVOURS)
        self.project.complete_time = None
        self.project.save()

        self.assertFalse(
            user_is_competent_for_card_project(card=self.card, user=self.user))

    def test_is_not_competent_because_flavour_mismatch(self):

        self.project.set_flavours([])
        self.project.complete_time = timezone.now()
        self.project.save()

        self.assertFalse(
            user_is_competent_for_card_project(card=self.card, user=self.user))

    def test_that_users_with_no_project_not_competent(self):
        self.assertFalse(
            user_is_competent_for_card_project(card=self.card,
                                               user=UserFactory()))
    def test_that_reviewers_returned_in_order(self):
        content_item = ContentItemFactory()
        competent_projects = [
            RecruitProjectFactory(complete_time=timezone.now(),
                                  flavours=[],
                                  content_item=content_item) for i in range(3)
        ]

        for n, project in enumerate(competent_projects):
            reviews_to_add = 5 - n
            for i in range(reviews_to_add):
                nyc_card = AgileCardFactory(
                    status=AgileCard.IN_PROGRESS,
                    recruit_project=RecruitProjectFactory(
                        complete_time=None,
                        flavours=[],
                        content_item=content_item),
                )
                project_user = project.recruit_users.first()
                nyc_card.reviewers.add(project_user)
                nyc_card.recruit_project.reviewer_users.add(project_user)

        card = AgileCardFactory(
            status=AgileCard.IN_PROGRESS,
            recruit_project=RecruitProjectFactory(complete_time=None,
                                                  flavours=[],
                                                  content_item=content_item),
        )
        expected_result = [
            project.recruit_users.first()
            for project in competent_projects[::-1]
        ]
        assert expected_result
        result = list(get_possible_competent_reviewers(card))
        self.assertEqual(
            result,
            expected_result,
        )

        # add some more duties to first person and make sure order is still correct
        project_user = expected_result[0]
        for i in range(5):

            nyc_card = AgileCardFactory(
                status=AgileCard.IN_PROGRESS,
                recruit_project=RecruitProjectFactory(
                    complete_time=None, flavours=[],
                    content_item=content_item),
            )
            nyc_card.reviewers.add(project_user)
            nyc_card.recruit_project.reviewer_users.add(project_user)

        expected_result = expected_result[1:] + [expected_result[0]]
        result = list(get_possible_competent_reviewers(card))
        self.assertEqual(
            result,
            expected_result,
        )

        # test_that_if_a_user_is_already_a_reviewer_they_are_skipped(self)

        card.reviewers.add(expected_result[0])
        card.recruit_project.reviewer_users.add(expected_result[0])
        card.reviewers.add(expected_result[-1])
        card.recruit_project.reviewer_users.add(expected_result[-1])
        result = list(get_possible_competent_reviewers(card))
        self.assertEqual(
            result,
            expected_result[1:-1],
        )