def setUp(self):
     super(TestLtiGrader, self).setUp()
     self._setsuperuser_login()
     self.post_params = {
         'command': 'fake_command',
         'key1': 'value1',
         'key2': 'value2',
         'kwflags': ['kwflag1', 'kwflag2'],
         'args': ['arg1', 'arg2'],
     }
     self.data = SimpleUploadedFile(
         'file.csv',
         'ID,Anonymized User ID,email,grade, max_grade, comments,'
         '\n1,abcdabcd,[email protected],5,10,not bad'
         '\n2,cdefcdef,[email protected],6,10,great'
     )
     self.grader = LTIGrader('course_id', 'url_base', 'lti_key', 'lti_secret')
class TestLtiGrader(SysadminBaseTestCase):
    """Tests all code paths in Sysadmin Mgmt Commands"""

    def setUp(self):
        super(TestLtiGrader, self).setUp()
        self._setsuperuser_login()
        self.post_params = {
            'command': 'fake_command',
            'key1': 'value1',
            'key2': 'value2',
            'kwflags': ['kwflag1', 'kwflag2'],
            'args': ['arg1', 'arg2'],
        }
        self.data = SimpleUploadedFile(
            'file.csv',
            'ID,Anonymized User ID,email,grade, max_grade, comments,'
            '\n1,abcdabcd,[email protected],5,10,not bad'
            '\n2,cdefcdef,[email protected],6,10,great'
        )
        self.grader = LTIGrader('course_id', 'url_base', 'lti_key', 'lti_secret')

    def test_lti_grader_properly_initialized(self):
        self.assertEquals('course_id', self.grader.course_id)
        self.assertEquals('url_base', self.grader.url_base)
        self.assertEquals('lti_key', self.grader.key)
        self.assertEquals('lti_secret', self.grader.secret)

    def test_get_first_anon_id(self):
        first_anon_id = self.grader._get_first_anon_id(self.data)  # pylint: disable=protected-access
        self.assertEquals(first_anon_id, 'abcdabcd')

    def test_generate_valid_grading_rows(self):
        valid_rows = self.grader._generate_valid_grading_rows(self.data)  # pylint: disable=protected-access
        self.assertEquals((1, u'abcdabcd', u'*****@*****.**', 5.0, 10.0, u'not bad'), valid_rows.next())
        self.assertEquals((2, u'cdefcdef', u'*****@*****.**', 6.0, 10.0, u'great'), valid_rows.next())

    def test_update_grades_passport_failure(self):
        def validate_passport_side_effect(key, secret, test_url):  # pylint: disable=unused-argument
            """
            Side effect designed to replace validate_lti_passport in lti_connection.py, mocking validation failure
            """
            return False
        with patch('instructor.lti_grader.lti_connection') as mock_lti_connection:
            mock_lti_connection.validate_lti_passport.side_effect = validate_passport_side_effect
            actual_output = self.grader.update_grades(self.data)['error']
            expected_output = ['LTI passport sanity check failed. Your lti_key (lti_key) or lti_secret (lti_secret) are probably incorrect.']
            self.assertEquals(expected_output, actual_output)

    def test_update_grades_success(self):
        def validate_passport_side_effect(key, secret, test_url):  # pylint: disable=unused-argument
            """
            Side effect designed to replace validate_lti_passport in lti_connection.py, mocking validation success
            """
            return True

        def post_success_side_effect(url_base, key, secret, grade_row):  # pylint: disable=unused-argument
            """
            Side effect designed to replace post_grade in lti_connection.py, mocking successful grade post
            """
            return (True, grade_row[0], grade_row[2])
        with patch('instructor.lti_grader.lti_connection') as mock_lti_connection:
            mock_lti_connection.validate_lti_passport.side_effect = validate_passport_side_effect
            mock_lti_connection.post_grade.side_effect = post_success_side_effect
            actual_output = self.grader.update_grades(self.data)['success']
            expected_output = ['Grade post successful: user id 1 (email: [email protected]).', 'Grade post successful: user id 2 (email: [email protected]).']
            self.assertEquals(expected_output, actual_output)

    def test_update_grades_failure(self):
        def validate_passport_side_effect(key, secret, test_url):  # pylint: disable=unused-argument
            """
            Side effect designed to replace validate_lti_passport in lti_connection.py, mocking validation success
            """
            return True

        def post_failure_side_effect(url_base, key, secret, grade_row):  # pylint: disable=unused-argument
            """
            Side effect designed to replace post_grade in lti_connection.py, mocking unsuccessful grade post
            """
            return (False, grade_row[0], grade_row[2])
        with patch('instructor.lti_grader.lti_connection') as mock_lti_connection:
            mock_lti_connection.validate_lti_passport.side_effect = validate_passport_side_effect
            mock_lti_connection.post_grade.side_effect = post_failure_side_effect
            actual_output = self.grader.update_grades(self.data)['error']
            expected_output = ['Grade post failed: user id 1 (email: [email protected]).', 'Grade post failed: user id 2 (email: [email protected]).']
            self.assertEquals(expected_output, actual_output)