def setUp(self):
     super(EvalCommentsAPITests, self).setUp()
     self.data = JudgementCommentsTestData()
 def setUp(self):
     super(EvalCommentsAPITests, self).setUp()
     self.data = JudgementCommentsTestData()
class EvalCommentsAPITests(ACJAPITestCase):
    def setUp(self):
        super(EvalCommentsAPITests, self).setUp()
        self.data = JudgementCommentsTestData()

    # may need judgement comment data

    def _build_url(self, course_id, question_id, tail=""):
        url = \
            '/api/courses/' + str(course_id) + '/questions/' + str(question_id) + '/judgements/' + \
            'comments' + tail
        return url

    def test_get_eval_comments(self):
        url = self._build_url(self.data.get_course().id,
                              self.data.get_questions()[0].id)

        # test login required
        rv = self.client.get(url)
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_unauthorized_instructor().username):
            rv = self.client.get(url)
            self.assert403(rv)

        # test invalid course id
        with self.login(self.data.get_authorized_instructor().username):
            rv = self.client.get(
                self._build_url(999,
                                self.data.get_questions()[0].id))
            self.assert404(rv)

            # test invalid question id
            rv = self.client.get(
                self._build_url(self.data.get_course().id, 999))
            self.assert404(rv)

            # test no comments
            rv = self.client.get(
                self._build_url(self.data.get_course().id,
                                self.data.get_questions()[1].id))
            self.assert200(rv)
            expected = []
            self.assertEqual(expected, rv.json['comments'])

            # test success query
            rv = self.client.get(url)
            self.assert200(rv)
            expected = self.data.get_judge_comment()
            actual = rv.json['comments'][0]
            self.assertEqual(expected.judgements_id, actual['judgement']['id'])
            self.assertEqual(expected.comments_id,
                             actual['postsforcomments']['id'])
            self.assertEqual(expected.postsforcomments.post.content,
                             actual['postsforcomments']['post']['content'])

    def test_create_eval_comment(self):
        url = self._build_url(self.data.get_course().id,
                              self.data.get_questions()[1].id)
        content = {'judgements': []}
        judge = {
            'id': self.data.get_judge_2().id,
            'comment': "A is better than B because A used the correct formula."
        }
        content['judgements'].append(judge)

        # test login required
        rv = self.client.post(url,
                              data=json.dumps(content),
                              content_type='application/json')
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_authorized_instructor().username):
            rv = self.client.post(url,
                                  data=json.dumps(content),
                                  content_type='application/json')
            self.assert403(rv)

        with self.login(self.data.get_judging_student().username):
            # test invalid course id
            invalid_url = self._build_url(999, self.data.get_questions()[1].id)
            rv = self.client.post(invalid_url,
                                  data=json.dumps(content),
                                  content_type='application/json')
            self.assert404(rv)

            # test invalid question id
            invalid_url = self._build_url(self.data.get_course().id, 999)
            rv = self.client.post(invalid_url,
                                  data=json.dumps(content),
                                  content_type='application/json')
            self.assert404(rv)

            # test successful save
            rv = self.client.post(url,
                                  data=json.dumps(content),
                                  content_type='application/json')
            self.assert200(rv)
            actual = rv.json['objects'][0]
            self.assertEqual(judge['id'], actual['judgement']['id'])
            self.assertEqual(judge['comment'],
                             actual['postsforcomments']['post']['content'])

            # test invalid judgement id
            content['judgements'][0]['id'] = 999
            rv = self.client.post(url,
                                  data=json.dumps(content),
                                  content_type='application/json')
            self.assert404(rv)

    def test_eval_comment_view(self):
        url = self._build_url(self.data.get_course().id,
                              self.data.get_questions()[0].id, '/view')

        # test login required
        rv = self.client.get(url)
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_unauthorized_instructor().username):
            rv = self.client.get(url)
            self.assert403(rv)

        with self.login(self.data.get_authorized_instructor().username):
            # test invalid course id
            rv = self.client.get(
                self._build_url(999,
                                self.data.get_questions()[0].id, '/view'))
            self.assert404(rv)

            # test invalid question id
            rv = self.client.get(
                self._build_url(self.data.get_course().id, 999, '/view'))
            self.assert404(rv)

            # test successful query - instructor
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['objects'][0]
            expected = self.data.get_judge_comment()

            self.assertEqual(len(rv.json['objects']), 1)
            self.assertEqual(actual['name'],
                             self.data.get_judging_student().fullname)
            self.assertEqual(actual['avatar'],
                             self.data.get_judging_student().avatar)
            self.assertEqual(
                actual['criteria_judgements'][0]['criteriaandquestions_id'],
                self.data.get_criteria_by_question(
                    self.data.get_questions()[0]).id)
            self.assertEqual(actual['criteria_judgements'][0]['content'],
                             expected.postsforcomments.post.content)
            self.assertEqual(actual['criteria_judgements'][0]['winner'],
                             expected.judgement.answers_id_winner)
            self.assertEqual(len(actual['selfeval']), 0)
            self.assertEqual(
                parser.parse(actual['created']).replace(tzinfo=None),
                expected.judgement.created.replace(microsecond=0))
            self.assertEqual(actual['answer1']['id'],
                             expected.judgement.answerpairing.answers_id1)
            self.assertEqual(
                actual['answer1']['feedback'],
                self.data.get_judge_feedback()[actual['answer1']
                                               ['id']].content)
            self.assertEqual(actual['answer2']['id'],
                             expected.judgement.answerpairing.answers_id2)
            self.assertEqual(
                actual['answer2']['feedback'],
                self.data.get_judge_feedback()[actual['answer2']
                                               ['id']].content)

        # test successful query - TA
        with self.login(self.data.get_authorized_ta().username):
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['objects'][0]
            expected = self.data.get_judge_comment()

            self.assertEqual(len(rv.json['objects']), 1)
            self.assertEqual(actual['name'],
                             self.data.get_judging_student().fullname)
            self.assertEqual(actual['avatar'],
                             self.data.get_judging_student().avatar)
            self.assertEqual(
                actual['criteria_judgements'][0]['criteriaandquestions_id'],
                self.data.get_criteria_by_question(
                    self.data.get_questions()[0]).id)
            self.assertEqual(actual['criteria_judgements'][0]['content'],
                             expected.postsforcomments.post.content)
            self.assertEqual(actual['criteria_judgements'][0]['winner'],
                             expected.judgement.answers_id_winner)
            self.assertEqual(len(actual['selfeval']), 0)
            self.assertEqual(
                parser.parse(actual['created']).replace(tzinfo=None),
                expected.judgement.created.replace(microsecond=0))
            self.assertEqual(actual['answer1']['id'],
                             expected.judgement.answerpairing.answers_id1)
            self.assertEqual(
                actual['answer1']['feedback'],
                self.data.get_judge_feedback()[actual['answer1']
                                               ['id']].content)
            self.assertEqual(actual['answer2']['id'],
                             expected.judgement.answerpairing.answers_id2)
            self.assertEqual(
                actual['answer2']['feedback'],
                self.data.get_judge_feedback()[actual['answer2']
                                               ['id']].content)

        # test successful query - student
        with self.login(self.data.get_judging_student().username):
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['objects'][0]

            self.assertEqual(len(rv.json['objects']), 1)
            self.assertEqual(actual['name'],
                             self.data.get_judging_student().fullname)
            self.assertEqual(actual['avatar'],
                             self.data.get_judging_student().avatar)
            self.assertEqual(
                actual['criteria_judgements'][0]['criteriaandquestions_id'],
                self.data.get_criteria_by_question(
                    self.data.get_questions()[0]).id)
            self.assertEqual(actual['criteria_judgements'][0]['content'],
                             expected.postsforcomments.post.content)
            self.assertEqual(actual['criteria_judgements'][0]['winner'],
                             expected.judgement.answers_id_winner)
            self.assertEqual(len(actual['selfeval']), 0)
            # self.assertEqual(parser.parse(actual['created']).replace(tzinfo=None), expected.postsforcomments.post.created)
            self.assertEqual(actual['answer1']['id'],
                             expected.judgement.answerpairing.answers_id1)
            self.assertEqual(
                actual['answer1']['feedback'],
                self.data.get_judge_feedback()[actual['answer1']
                                               ['id']].content)
            self.assertEqual(actual['answer2']['id'],
                             expected.judgement.answerpairing.answers_id2)
            self.assertEqual(
                actual['answer2']['feedback'],
                self.data.get_judge_feedback()[actual['answer2']
                                               ['id']].content)
class EvalCommentsAPITests(ACJAPITestCase):
    def setUp(self):
        super(EvalCommentsAPITests, self).setUp()
        self.data = JudgementCommentsTestData()

    # may need judgement comment data

    def _build_url(self, course_id, question_id, tail=""):
        url = \
            '/api/courses/' + str(course_id) + '/questions/' + str(question_id) + '/judgements/' + \
            'comments' + tail
        return url

    def test_get_eval_comments(self):
        url = self._build_url(self.data.get_course().id, self.data.get_questions()[0].id)

        # test login required
        rv = self.client.get(url)
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_unauthorized_instructor().username):
            rv = self.client.get(url)
            self.assert403(rv)

        # test invalid course id
        with self.login(self.data.get_authorized_instructor().username):
            rv = self.client.get(self._build_url(999, self.data.get_questions()[0].id))
            self.assert404(rv)

            # test invalid question id
            rv = self.client.get(self._build_url(self.data.get_course().id, 999))
            self.assert404(rv)

            # test no comments
            rv = self.client.get(self._build_url(self.data.get_course().id, self.data.get_questions()[1].id))
            self.assert200(rv)
            expected = []
            self.assertEqual(expected, rv.json['comments'])

            # test success query
            rv = self.client.get(url)
            self.assert200(rv)
            expected = self.data.get_judge_comment()
            actual = rv.json['comments'][0]
            self.assertEqual(expected.judgements_id, actual['judgement']['id'])
            self.assertEqual(expected.comments_id, actual['postsforcomments']['id'])
            self.assertEqual(expected.postsforcomments.post.content, actual['postsforcomments']['post']['content'])

    def test_create_eval_comment(self):
        url = self._build_url(self.data.get_course().id, self.data.get_questions()[1].id)
        content = {'judgements': []}
        judge = {
            'id': self.data.get_judge_2().id,
            'comment': "A is better than B because A used the correct formula."
        }
        content['judgements'].append(judge)

        # test login required
        rv = self.client.post(url, data=json.dumps(content), content_type='application/json')
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_authorized_instructor().username):
            rv = self.client.post(url, data=json.dumps(content), content_type='application/json')
            self.assert403(rv)

        with self.login(self.data.get_judging_student().username):
            # test invalid course id
            invalid_url = self._build_url(999, self.data.get_questions()[1].id)
            rv = self.client.post(invalid_url, data=json.dumps(content), content_type='application/json')
            self.assert404(rv)

            # test invalid question id
            invalid_url = self._build_url(self.data.get_course().id, 999)
            rv = self.client.post(invalid_url, data=json.dumps(content), content_type='application/json')
            self.assert404(rv)

            # test successful save
            rv = self.client.post(url, data=json.dumps(content), content_type='application/json')
            self.assert200(rv)
            actual = rv.json['objects'][0]
            self.assertEqual(judge['id'], actual['judgement']['id'])
            self.assertEqual(judge['comment'], actual['postsforcomments']['post']['content'])

            # test invalid judgement id
            content['judgements'][0]['id'] = 999
            rv = self.client.post(url, data=json.dumps(content), content_type='application/json')
            self.assert404(rv)

    def test_eval_comment_view(self):
        url = self._build_url(self.data.get_course().id, self.data.get_questions()[0].id, '/view')

        # test login required
        rv = self.client.get(url)
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_unauthorized_instructor().username):
            rv = self.client.get(url)
            self.assert403(rv)

        with self.login(self.data.get_authorized_instructor().username):
            # test invalid course id
            rv = self.client.get(self._build_url(999, self.data.get_questions()[0].id, '/view'))
            self.assert404(rv)

            # test invalid question id
            rv = self.client.get(self._build_url(self.data.get_course().id, 999, '/view'))
            self.assert404(rv)

            # test successful query - instructor
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['objects'][0]
            expected = self.data.get_judge_comment()

            self.assertEqual(len(rv.json['objects']), 1)
            self.assertEqual(actual['name'], self.data.get_judging_student().fullname)
            self.assertEqual(actual['avatar'], self.data.get_judging_student().avatar)
            self.assertEqual(
                actual['criteria_judgements'][0]['criteriaandquestions_id'],
                self.data.get_criteria_by_question(self.data.get_questions()[0]).id)
            self.assertEqual(actual['criteria_judgements'][0]['content'], expected.postsforcomments.post.content)
            self.assertEqual(actual['criteria_judgements'][0]['winner'], expected.judgement.answers_id_winner)
            self.assertEqual(len(actual['selfeval']), 0)
            self.assertEqual(parser.parse(actual['created']).replace(tzinfo=None),
                             expected.judgement.created.replace(microsecond=0))
            self.assertEqual(actual['answer1']['id'], expected.judgement.answerpairing.answers_id1)
            self.assertEqual(
                actual['answer1']['feedback'],
                self.data.get_judge_feedback()[actual['answer1']['id']].content)
            self.assertEqual(actual['answer2']['id'], expected.judgement.answerpairing.answers_id2)
            self.assertEqual(
                actual['answer2']['feedback'],
                self.data.get_judge_feedback()[actual['answer2']['id']].content)

        # test successful query - TA
        with self.login(self.data.get_authorized_ta().username):
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['objects'][0]
            expected = self.data.get_judge_comment()

            self.assertEqual(len(rv.json['objects']), 1)
            self.assertEqual(actual['name'], self.data.get_judging_student().fullname)
            self.assertEqual(actual['avatar'], self.data.get_judging_student().avatar)
            self.assertEqual(
                actual['criteria_judgements'][0]['criteriaandquestions_id'],
                self.data.get_criteria_by_question(self.data.get_questions()[0]).id)
            self.assertEqual(actual['criteria_judgements'][0]['content'], expected.postsforcomments.post.content)
            self.assertEqual(actual['criteria_judgements'][0]['winner'], expected.judgement.answers_id_winner)
            self.assertEqual(len(actual['selfeval']), 0)
            self.assertEqual(parser.parse(actual['created']).replace(tzinfo=None),
                             expected.judgement.created.replace(microsecond=0))
            self.assertEqual(actual['answer1']['id'], expected.judgement.answerpairing.answers_id1)
            self.assertEqual(
                actual['answer1']['feedback'],
                self.data.get_judge_feedback()[actual['answer1']['id']].content)
            self.assertEqual(actual['answer2']['id'], expected.judgement.answerpairing.answers_id2)
            self.assertEqual(
                actual['answer2']['feedback'],
                self.data.get_judge_feedback()[actual['answer2']['id']].content)

        # test successful query - student
        with self.login(self.data.get_judging_student().username):
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['objects'][0]

            self.assertEqual(len(rv.json['objects']), 1)
            self.assertEqual(actual['name'], self.data.get_judging_student().fullname)
            self.assertEqual(actual['avatar'], self.data.get_judging_student().avatar)
            self.assertEqual(
                actual['criteria_judgements'][0]['criteriaandquestions_id'],
                self.data.get_criteria_by_question(self.data.get_questions()[0]).id)
            self.assertEqual(actual['criteria_judgements'][0]['content'], expected.postsforcomments.post.content)
            self.assertEqual(actual['criteria_judgements'][0]['winner'], expected.judgement.answers_id_winner)
            self.assertEqual(len(actual['selfeval']), 0)
            # self.assertEqual(parser.parse(actual['created']).replace(tzinfo=None), expected.postsforcomments.post.created)
            self.assertEqual(actual['answer1']['id'], expected.judgement.answerpairing.answers_id1)
            self.assertEqual(
                actual['answer1']['feedback'],
                self.data.get_judge_feedback()[actual['answer1']['id']].content)
            self.assertEqual(actual['answer2']['id'], expected.judgement.answerpairing.answers_id2)
            self.assertEqual(
                actual['answer2']['feedback'],
                self.data.get_judge_feedback()[actual['answer2']['id']].content)