Example #1
0
 def setUp(self):
     super(GroupsAPITests, self).setUp()
     self.data = GroupsTestData()
Example #2
0
 def setUp(self):
     super(GroupsAPITests, self).setUp()
     self.data = GroupsTestData()
Example #3
0
class GroupsAPITests(ACJAPITestCase):
    def setUp(self):
        super(GroupsAPITests, self).setUp()
        self.data = GroupsTestData()

    def test_get_active_groups(self):
        url = '/api/courses/'+str(self.data.get_course().id)+'/groups'

        # 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):
            invalid_url = '/api/courses/999/groups'
            rv = self.client.get(invalid_url)
            self.assert404(rv)

            # test successful query
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['groups']
            self.assertEqual(len(actual), 1)
            self.assertEqual(actual[0]['id'], self.data.get_active_group().id)
            self.assertEqual(actual[0]['name'], self.data.get_active_group().name)

        # test TA
        with self.login(self.data.get_authorized_ta().username):
            self.assert200(rv)
            actual = rv.json['groups']
            self.assertEqual(len(actual), 1)
            self.assertEqual(actual[0]['id'], self.data.get_active_group().id)
            self.assertEqual(actual[0]['name'], self.data.get_active_group().name)

    def test_get_group_members(self):
        course_id = self.data.get_course().id
        group_id = self.data.get_active_group().id
        url = '/api/courses/'+str(course_id)+'/groups/'+str(group_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('/api/courses/999/groups/'+str(group_id))
            self.assert404(rv)

            # test invalid group id
            rv = self.client.get('/api/courses/'+str(course_id)+'/groups/999')
            self.assert404(rv)

            # test authorized instructor
            rv = self.client.get(url)
            self.assert200(rv)
            self.assertEqual(1, len(rv.json['students']))
            self.assertEqual(self.data.get_active_member().users_id, rv.json['students'][0]['user']['id'])

        # test authorized teaching assistant
        with self.login(self.data.get_authorized_ta().username):
            rv = self.client.get(url)
            self.assert200(rv)
            self.assertEqual(1, len(rv.json['students']))
            self.assertEqual(self.data.get_active_member().users_id, rv.json['students'][0]['user']['id'])

    def test_group_enrolment(self):
        # frequently used objects
        course = self.data.get_course()
        group = self.data.get_active_group()

        # test login required
        url = self._create_group_user_url(course, self.data.get_authorized_student(), group)
        rv = self.client.post(url, data={}, content_type='application/json')
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_unauthorized_instructor().username):
            url = self._create_group_user_url(course, self.data.get_authorized_student(), group)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert403(rv)

        with self.login(self.data.get_authorized_instructor().username):
            # test user that is already in group
            url = self._create_group_user_url(course, self.data.get_authorized_student(), group)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert200(rv)
            self.assertEqual(rv.json['groups_name'], group.name)

            # test user that has never been in the group
            url = self._create_group_user_url(course, self.data.get_authorized_instructor(), group)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert200(rv)
            self.assertEqual(rv.json['groups_name'], group.name)

            # test user that has left the group
            url = self._create_group_user_url(course, self.data.get_authorized_ta(), group)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert200(rv)
            self.assertEqual(rv.json['groups_name'], group.name)

            # test user that is not enroled in the course anymore - eg. DROPPED
            url = self._create_group_user_url(course, self.data.get_dropped_instructor(), group)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

            # test user that has never been in the course
            url = self._create_group_user_url(course, self.data.get_unauthorized_student(), group)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

            # test inactive group
            url = self._create_group_user_url(course, self.data.get_authorized_student(), self.data.get_inactive_group())
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

            # test group that is in another course
            url = self._create_group_user_url(course, self.data.get_authorized_student(), self.data.get_unauthorized_group())
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

            # test invalid course id
            url = '/api/courses/999/users/'+str(self.data.get_authorized_student().id)+'/groups/'+str(group.id)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

            # test invalid user id
            url = '/api/courses/'+str(course.id)+'/users/999/groups/'+str(group.id)
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

            # test invalid group id
            url = '/api/courses/'+str(course.id)+'/users/'+str(self.data.get_authorized_student().id)+'/groups/999'
            rv = self.client.post(url, data={}, content_type='application/json')
            self.assert404(rv)

    def test_group_unenrolment(self):
        course = self.data.get_course()

        # test login required
        url = self._create_group_user_url(course, self.data.get_authorized_student())
        rv = self.client.delete(url)
        self.assert401(rv)

        # test unauthorzied user
        with self.login(self.data.get_unauthorized_instructor().username):
            url = self._create_group_user_url(course, self.data.get_authorized_student())
            rv = self.client.delete(url)
            self.assert403(rv)

        with self.login(self.data.get_authorized_instructor().username):
            # test user in course
            url = self._create_group_user_url(course, self.data.get_authorized_student())
            rv = self.client.delete(url)
            self.assert200(rv)
            self.assertEqual(rv.json['user_id'], self.data.get_authorized_student().id)
            self.assertEqual(rv.json['course_id'], course.id)

            # test user not in course
            url = self._create_group_user_url(course, self.data.get_unauthorized_student())
            rv = self.client.delete(url)
            self.assert404(rv)

            # test invalid course id
            url = '/api/courses/999/users/'+str(self.data.get_authorized_student().id)+'/groups'
            rv = self.client.delete(url)
            self.assert404(rv)

            # test invalid user id
            url = '/api/courses/'+str(course.id)+'/users/999/groups'
            rv = self.client.delete(url)
            self.assert404(rv)

    def test_import_groups(self):
        url = '/api/courses/' + str(self.data.get_course().id) + '/groups'

        content = self.data.get_authorized_student().username + "," + self.data.get_active_group().name
        encoded_content = content.encode()
        filename = "groups.csv"

        # test login required
        uploaded_file = io.BytesIO(encoded_content)
        rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
        self.assert401(rv)
        uploaded_file.close()

        # test unauthorized user
        uploaded_file = io.BytesIO(encoded_content)
        with self.login(self.data.get_authorized_student().username):
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert403(rv)
            uploaded_file.close()

        uploaded_file = io.BytesIO(encoded_content)
        with self.login(self.data.get_authorized_ta().username):
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert403(rv)
            uploaded_file.close()

        uploaded_file = io.BytesIO(encoded_content)
        with self.login(self.data.get_unauthorized_instructor().username):
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert403(rv)
            uploaded_file.close()

        with self.login(self.data.get_authorized_instructor().username):
            # test invalid course id
            invalid_url = '/api/courses/999/groups'
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(invalid_url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert404(rv)
            uploaded_file.close()

            # test invalid file type
            invalid_file = "groups.png"
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, invalid_file)))
            self.assert400(rv)
            uploaded_file.close()

            # test invalid user identifier
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(url, data=dict(userIdentifier="lastname", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(0, rv.json['success'])
            self.assertEqual({}, rv.json['invalids'][0]['member'])
            self.assertEqual("A valid user identifier is not given.", rv.json['invalids'][0]['message'])
            uploaded_file.close()

            # test missing user identifier
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(url, data=dict(file=(uploaded_file, filename)))
            self.assert400(rv)
            uploaded_file.close()

            # test duplicate users in file
            duplicate = "".join([content, "\n", content])
            uploaded_file = io.BytesIO(duplicate.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = [
                '["', self.data.get_authorized_student().username, '", "',
                self.data.get_active_group().name, '"]']
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("This user already exists in the file.", invalid['message'])
            uploaded_file.close()

            # test missing username
            missing_username = "******" + self.data.get_active_group().name
            uploaded_file = io.BytesIO(missing_username.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = ['["", "', self.data.get_active_group().name, '"]']
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("No user with this username exists.", invalid['message'])
            uploaded_file.close()

            # test missing group name
            missing_group = self.data.get_authorized_student().username + ","
            uploaded_file = io.BytesIO(missing_group.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(0, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = ['["', self.data.get_authorized_student().username, '", ""]']
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("The group name is invalid.", invalid['message'])
            uploaded_file.close()

            # test invalid user
            invalid_user = "******" + self.data.get_active_group().name
            uploaded_file = io.BytesIO(invalid_user.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = ['["username9999", "', self.data.get_active_group().name, '"]']
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("No user with this username exists.", invalid['message'])
            uploaded_file.close()

            # test successful import with username
            with_username = self.data.get_authorized_student().username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(with_username.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test successful import with student number
            with_studentno = self.data.get_authorized_student().student_no + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(with_studentno.encode())
            rv = self.client.post(url, data=dict(userIdentifier="student_no", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test import user not in course
            unauthorized_student = self.data.get_unauthorized_student().username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(unauthorized_student.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = [
                '["', self.data.get_unauthorized_student().username, '", "',
                self.data.get_active_group().name, '"]']
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("The user is not enroled in the course", invalid['message'])
            uploaded_file.close()

            # test adding to inactive group
            inactive_group = self.data.get_authorized_student().username + "," + self.data.get_inactive_group().name
            uploaded_file = io.BytesIO(inactive_group.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test adding inactive group member
            inactive_member = self.data.get_inactive_member().user.username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(inactive_member.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test placing instructor in group
            add_instructor = self.data.get_authorized_instructor().username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(add_instructor.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test placing TA in group
            add_ta = self.data.get_authorized_ta().username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(add_ta.encode())
            rv = self.client.post(url, data=dict(userIdentifier="username", file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

    def _create_group_user_url(self, course, user, group=None):
        url = '/api/courses/'+str(course.id)+'/users/'+str(user.id)+'/groups'
        if group:
            url = url+'/'+str(group.id)
        return url
Example #4
0
class GroupsAPITests(ACJAPITestCase):
    def setUp(self):
        super(GroupsAPITests, self).setUp()
        self.data = GroupsTestData()

    def test_get_active_groups(self):
        url = '/api/courses/' + str(self.data.get_course().id) + '/groups'

        # 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):
            invalid_url = '/api/courses/999/groups'
            rv = self.client.get(invalid_url)
            self.assert404(rv)

            # test successful query
            rv = self.client.get(url)
            self.assert200(rv)
            actual = rv.json['groups']
            self.assertEqual(len(actual), 1)
            self.assertEqual(actual[0]['id'], self.data.get_active_group().id)
            self.assertEqual(actual[0]['name'],
                             self.data.get_active_group().name)

        # test TA
        with self.login(self.data.get_authorized_ta().username):
            self.assert200(rv)
            actual = rv.json['groups']
            self.assertEqual(len(actual), 1)
            self.assertEqual(actual[0]['id'], self.data.get_active_group().id)
            self.assertEqual(actual[0]['name'],
                             self.data.get_active_group().name)

    def test_get_group_members(self):
        course_id = self.data.get_course().id
        group_id = self.data.get_active_group().id
        url = '/api/courses/' + str(course_id) + '/groups/' + str(group_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('/api/courses/999/groups/' + str(group_id))
            self.assert404(rv)

            # test invalid group id
            rv = self.client.get('/api/courses/' + str(course_id) +
                                 '/groups/999')
            self.assert404(rv)

            # test authorized instructor
            rv = self.client.get(url)
            self.assert200(rv)
            self.assertEqual(1, len(rv.json['students']))
            self.assertEqual(self.data.get_active_member().users_id,
                             rv.json['students'][0]['user']['id'])

        # test authorized teaching assistant
        with self.login(self.data.get_authorized_ta().username):
            rv = self.client.get(url)
            self.assert200(rv)
            self.assertEqual(1, len(rv.json['students']))
            self.assertEqual(self.data.get_active_member().users_id,
                             rv.json['students'][0]['user']['id'])

    def test_group_enrolment(self):
        # frequently used objects
        course = self.data.get_course()
        group = self.data.get_active_group()

        # test login required
        url = self._create_group_user_url(course,
                                          self.data.get_authorized_student(),
                                          group)
        rv = self.client.post(url, data={}, content_type='application/json')
        self.assert401(rv)

        # test unauthorized user
        with self.login(self.data.get_unauthorized_instructor().username):
            url = self._create_group_user_url(
                course, self.data.get_authorized_student(), group)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert403(rv)

        with self.login(self.data.get_authorized_instructor().username):
            # test user that is already in group
            url = self._create_group_user_url(
                course, self.data.get_authorized_student(), group)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert200(rv)
            self.assertEqual(rv.json['groups_name'], group.name)

            # test user that has never been in the group
            url = self._create_group_user_url(
                course, self.data.get_authorized_instructor(), group)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert200(rv)
            self.assertEqual(rv.json['groups_name'], group.name)

            # test user that has left the group
            url = self._create_group_user_url(course,
                                              self.data.get_authorized_ta(),
                                              group)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert200(rv)
            self.assertEqual(rv.json['groups_name'], group.name)

            # test user that is not enroled in the course anymore - eg. DROPPED
            url = self._create_group_user_url(
                course, self.data.get_dropped_instructor(), group)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

            # test user that has never been in the course
            url = self._create_group_user_url(
                course, self.data.get_unauthorized_student(), group)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

            # test inactive group
            url = self._create_group_user_url(
                course, self.data.get_authorized_student(),
                self.data.get_inactive_group())
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

            # test group that is in another course
            url = self._create_group_user_url(
                course, self.data.get_authorized_student(),
                self.data.get_unauthorized_group())
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

            # test invalid course id
            url = '/api/courses/999/users/' + str(
                self.data.get_authorized_student().id) + '/groups/' + str(
                    group.id)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

            # test invalid user id
            url = '/api/courses/' + str(
                course.id) + '/users/999/groups/' + str(group.id)
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

            # test invalid group id
            url = '/api/courses/' + str(course.id) + '/users/' + str(
                self.data.get_authorized_student().id) + '/groups/999'
            rv = self.client.post(url,
                                  data={},
                                  content_type='application/json')
            self.assert404(rv)

    def test_group_unenrolment(self):
        course = self.data.get_course()

        # test login required
        url = self._create_group_user_url(course,
                                          self.data.get_authorized_student())
        rv = self.client.delete(url)
        self.assert401(rv)

        # test unauthorzied user
        with self.login(self.data.get_unauthorized_instructor().username):
            url = self._create_group_user_url(
                course, self.data.get_authorized_student())
            rv = self.client.delete(url)
            self.assert403(rv)

        with self.login(self.data.get_authorized_instructor().username):
            # test user in course
            url = self._create_group_user_url(
                course, self.data.get_authorized_student())
            rv = self.client.delete(url)
            self.assert200(rv)
            self.assertEqual(rv.json['user_id'],
                             self.data.get_authorized_student().id)
            self.assertEqual(rv.json['course_id'], course.id)

            # test user not in course
            url = self._create_group_user_url(
                course, self.data.get_unauthorized_student())
            rv = self.client.delete(url)
            self.assert404(rv)

            # test invalid course id
            url = '/api/courses/999/users/' + str(
                self.data.get_authorized_student().id) + '/groups'
            rv = self.client.delete(url)
            self.assert404(rv)

            # test invalid user id
            url = '/api/courses/' + str(course.id) + '/users/999/groups'
            rv = self.client.delete(url)
            self.assert404(rv)

    def test_import_groups(self):
        url = '/api/courses/' + str(self.data.get_course().id) + '/groups'

        content = self.data.get_authorized_student(
        ).username + "," + self.data.get_active_group().name
        encoded_content = content.encode()
        filename = "groups.csv"

        # test login required
        uploaded_file = io.BytesIO(encoded_content)
        rv = self.client.post(url,
                              data=dict(userIdentifier="username",
                                        file=(uploaded_file, filename)))
        self.assert401(rv)
        uploaded_file.close()

        # test unauthorized user
        uploaded_file = io.BytesIO(encoded_content)
        with self.login(self.data.get_authorized_student().username):
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert403(rv)
            uploaded_file.close()

        uploaded_file = io.BytesIO(encoded_content)
        with self.login(self.data.get_authorized_ta().username):
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert403(rv)
            uploaded_file.close()

        uploaded_file = io.BytesIO(encoded_content)
        with self.login(self.data.get_unauthorized_instructor().username):
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert403(rv)
            uploaded_file.close()

        with self.login(self.data.get_authorized_instructor().username):
            # test invalid course id
            invalid_url = '/api/courses/999/groups'
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(invalid_url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert404(rv)
            uploaded_file.close()

            # test invalid file type
            invalid_file = "groups.png"
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file,
                                                  invalid_file)))
            self.assert400(rv)
            uploaded_file.close()

            # test invalid user identifier
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(url,
                                  data=dict(userIdentifier="lastname",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(0, rv.json['success'])
            self.assertEqual({}, rv.json['invalids'][0]['member'])
            self.assertEqual("A valid user identifier is not given.",
                             rv.json['invalids'][0]['message'])
            uploaded_file.close()

            # test missing user identifier
            uploaded_file = io.BytesIO(encoded_content)
            rv = self.client.post(url,
                                  data=dict(file=(uploaded_file, filename)))
            self.assert400(rv)
            uploaded_file.close()

            # test duplicate users in file
            duplicate = "".join([content, "\n", content])
            uploaded_file = io.BytesIO(duplicate.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = [
                '["',
                self.data.get_authorized_student().username, '", "',
                self.data.get_active_group().name, '"]'
            ]
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("This user already exists in the file.",
                             invalid['message'])
            uploaded_file.close()

            # test missing username
            missing_username = "******" + self.data.get_active_group().name
            uploaded_file = io.BytesIO(missing_username.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = ['["", "', self.data.get_active_group().name, '"]']
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("No user with this username exists.",
                             invalid['message'])
            uploaded_file.close()

            # test missing group name
            missing_group = self.data.get_authorized_student().username + ","
            uploaded_file = io.BytesIO(missing_group.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(0, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = [
                '["',
                self.data.get_authorized_student().username, '", ""]'
            ]
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("The group name is invalid.", invalid['message'])
            uploaded_file.close()

            # test invalid user
            invalid_user = "******" + self.data.get_active_group().name
            uploaded_file = io.BytesIO(invalid_user.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = [
                '["username9999", "',
                self.data.get_active_group().name, '"]'
            ]
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("No user with this username exists.",
                             invalid['message'])
            uploaded_file.close()

            # test successful import with username
            with_username = self.data.get_authorized_student(
            ).username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(with_username.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test successful import with student number
            with_studentno = self.data.get_authorized_student(
            ).student_no + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(with_studentno.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="student_no",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test import user not in course
            unauthorized_student = self.data.get_unauthorized_student(
            ).username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(unauthorized_student.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(1, len(rv.json['invalids']))
            invalid = rv.json['invalids'][0]
            member = [
                '["',
                self.data.get_unauthorized_student().username, '", "',
                self.data.get_active_group().name, '"]'
            ]
            self.assertEqual("".join(member), invalid['member'])
            self.assertEqual("The user is not enroled in the course",
                             invalid['message'])
            uploaded_file.close()

            # test adding to inactive group
            inactive_group = self.data.get_authorized_student(
            ).username + "," + self.data.get_inactive_group().name
            uploaded_file = io.BytesIO(inactive_group.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test adding inactive group member
            inactive_member = self.data.get_inactive_member(
            ).user.username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(inactive_member.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test placing instructor in group
            add_instructor = self.data.get_authorized_instructor(
            ).username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(add_instructor.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

            # test placing TA in group
            add_ta = self.data.get_authorized_ta(
            ).username + "," + self.data.get_active_group().name
            uploaded_file = io.BytesIO(add_ta.encode())
            rv = self.client.post(url,
                                  data=dict(userIdentifier="username",
                                            file=(uploaded_file, filename)))
            self.assert200(rv)
            self.assertEqual(1, rv.json['success'])
            self.assertEqual(0, len(rv.json['invalids']))
            uploaded_file.close()

    def _create_group_user_url(self, course, user, group=None):
        url = '/api/courses/' + str(course.id) + '/users/' + str(
            user.id) + '/groups'
        if group:
            url = url + '/' + str(group.id)
        return url