def test_overall_rating(self): role_class = self.view.get_reviewer_roles() c = ReviewerCollection() self.assertIsNone(self.view.calculate_overall_rating(c)) def make_review(id, role, rating, expertise): return null_tuple(Reviewer)._replace( id=101, role=role, review_rating=rating, review_state=ReviewState.DONE, review_extra=null_tuple(JCMTReview)._replace( expertise=expertise)) # Add reviews without ratings included in the calculation. c[101] = make_review(101, role_class.TECH, None, None) c[102] = make_review(102, role_class.EXTERNAL, 100, None) self.assertIsNone(self.view.calculate_overall_rating(c)) (r, s) = self.view.calculate_overall_rating(c, with_std_dev=True) self.assertIsNone(r) self.assertIsNone(s) # Add some equally-weighted reviews. c[201] = make_review( 201, role_class.CTTEE_OTHER, 20, JCMTReviewerExpertise.NON_EXPERT) c[202] = make_review( 202, role_class.CTTEE_OTHER, 40, JCMTReviewerExpertise.NON_EXPERT) self.assertAlmostEqual(self.view.calculate_overall_rating(c), 30) (r, s) = self.view.calculate_overall_rating(c, with_std_dev=True) self.assertAlmostEqual(r, 30) self.assertIsNotNone(s) # Add a higher-weighted review. c[301] = make_review( 301, role_class.CTTEE_PRIMARY, 70, JCMTReviewerExpertise.EXPERT) self.assertAlmostEqual(self.view.calculate_overall_rating(c), 50) (r, s) = self.view.calculate_overall_rating(c, with_std_dev=True) self.assertAlmostEqual(r, 50) self.assertIsNotNone(s)
def test_overall_rating(self): role_class = self.view.get_reviewer_roles() c = ReviewerCollection() self.assertIsNone(self.view.calculate_overall_rating(c)) def make_review(id, role, rating, weight): return null_tuple(Reviewer)._replace(id=101, role=role, review_rating=rating, review_weight=weight, review_state=ReviewState.DONE) # Add reviews without ratings. c[101] = make_review(101, role_class.TECH, None, None) c[102] = make_review(102, role_class.TECH, None, None) self.assertIsNone(self.view.calculate_overall_rating(c)) (r, s) = self.view.calculate_overall_rating(c, with_std_dev=True) self.assertIsNone(r) self.assertIsNone(s) # Add some equally-weighted reviews. c[201] = make_review(201, role_class.CTTEE_OTHER, 40, 50) c[202] = make_review(202, role_class.CTTEE_OTHER, 60, 50) self.assertAlmostEqual(self.view.calculate_overall_rating(c), 50) (r, s) = self.view.calculate_overall_rating(c, with_std_dev=True) self.assertAlmostEqual(r, 50) self.assertIsNotNone(s) # Add a higher-weighted review. c[301] = make_review(301, role_class.CTTEE_PRIMARY, 90, 100) self.assertAlmostEqual(self.view.calculate_overall_rating(c), 70) (r, s) = self.view.calculate_overall_rating(c, with_std_dev=True) self.assertAlmostEqual(r, 70) self.assertIsNotNone(s)
def test_reviewer_collection_rating(self): c = ReviewerCollection() rr = BaseReviewerRole def rwf_inc_unweighted(reviewer): if reviewer.review_weight is None: if rr.get_info(reviewer.role).weight: return (None, None) return (reviewer.review_rating, 1.0) return (reviewer.review_rating, reviewer.review_weight / 100.0) def rwf_exc_unweighted(reviewer): if reviewer.review_weight is None: return (None, None) return (reviewer.review_rating, reviewer.review_weight / 100.0) rating = c.get_overall_rating(rwf_inc_unweighted, with_std_dev=False) self.assertIsNone(rating) rating = c.get_overall_rating(rwf_inc_unweighted, with_std_dev=True) self.assertIsInstance(rating, tuple) self.assertEqual(len(rating), 2) self.assertIsNone(rating[0]) self.assertIsNone(rating[1]) # Add some simple review ratings. rs = [ dict(role=rr.TECH), dict(role=rr.EXTERNAL), dict(role=rr.EXTERNAL, review_rating=20), dict(role=rr.CTTEE_PRIMARY), dict(role=rr.CTTEE_PRIMARY, review_rating=10), dict(role=rr.CTTEE_PRIMARY, review_rating=80, review_weight=100), ] for (r, n) in zip(rs, itertools.count(100)): c[n] = null_tuple(Reviewer)._replace(review_state=ReviewState.DONE, **r) self.assertEqual( c.get_overall_rating(rwf_inc_unweighted, with_std_dev=False), 50) self.assertEqual( c.get_overall_rating(rwf_exc_unweighted, with_std_dev=False), 80) # Repeat test above, including calculation of standard deviation. rating = c.get_overall_rating(rwf_exc_unweighted, with_std_dev=True) self.assertIsInstance(rating, tuple) self.assertEqual(len(rating), 2) self.assertEqual(rating[0], 80.0) self.assertEqual(rating[1], 0.0) (rating, std_dev) = c.get_overall_rating(rwf_inc_unweighted, with_std_dev=True) self.assertEqual(rating, 50.0) self.assertEqual(std_dev, 30.0) # Add some more reviews with non-100% weights. rs = [ dict(role=rr.CTTEE_SECONDARY, review_rating=20, review_weight=50), dict(role=rr.CTTEE_SECONDARY, review_rating=40, review_weight=50), ] for (r, n) in zip(rs, itertools.count(200)): c[n] = null_tuple(Reviewer)._replace(review_state=ReviewState.DONE, **r) self.assertEqual( c.get_overall_rating(rwf_exc_unweighted, with_std_dev=False), 55) (rating, std_dev) = c.get_overall_rating(rwf_exc_unweighted, with_std_dev=True) self.assertEqual(rating, 55.0) self.assertAlmostEqual(std_dev, 25.981, places=3)
def test_reviewer_collection(self): c = ReviewerCollection() c[201] = null_tuple(Reviewer)._replace(id=201, person_id=2001, role=BaseReviewerRole.TECH) c[202] = null_tuple(Reviewer)._replace(id=202, person_id=2002, role=BaseReviewerRole.EXTERNAL) self.assertFalse(c.has_person(9999)) self.assertTrue(c.has_person(2001)) self.assertFalse(c.has_person(2001, roles=[BaseReviewerRole.EXTERNAL])) self.assertTrue(c.has_person(2001, roles=[BaseReviewerRole.TECH])) self.assertEqual(c.person_id_by_role(BaseReviewerRole.EXTERNAL), [2002]) self.assertFalse(c.has_role(BaseReviewerRole.FEEDBACK)) self.assertTrue(c.has_role(BaseReviewerRole.EXTERNAL)) self.assertEqual(c.role_by_person_id(2001), [BaseReviewerRole.TECH]) self.assertEqual(c.role_by_person_id(2002), [BaseReviewerRole.EXTERNAL]) reviewers = c.values_by_role(BaseReviewerRole.EXTERNAL) self.assertIsInstance(reviewers, list) self.assertEqual(len(reviewers), 1) self.assertIsInstance(reviewers[0], Reviewer) self.assertEqual(reviewers[0].id, 202)