Ejemplo n.º 1
0
    def setUp(self):
        super(BaseApiTest, self).setUp()

        self.admin = Administrator()
        self.admin.from_dict({
            'name': 'admin',
            'username': '******',
            'password': '******'
        })
        db.session.add(self.admin)

        self.teacher = Teacher()
        self.teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(self.teacher)

        self.student = Student()
        self.student.from_dict({
            'name': 'student',
            'username': '******',
            'password': '******'
        })
        db.session.add(self.student)

        db.session.commit()
Ejemplo n.º 2
0
    def test_remove_teacher(self):
        # create a teacher
        teacher = Teacher()
        teacher.from_dict({'username': '******', 'name': 'n', 'password': '******'})
        db.session.add(teacher)
        db.session.commit()

        number_of_teachers_before = len(Teacher.query.all())

        # try to access with basic authentication
        rv = self.client.delete(f'/api/v1/admin/teacher/{teacher.id}',
                                headers=self.basic_auth_header(
                                    'admin', 'admin'))
        self.assertEquals(rv.status_code, 401)

        # get token
        rv = self.client.post('/api/v1/auth/token',
                              headers=self.basic_auth_header('admin', 'admin'))
        self.assertEquals(rv.status_code, 200)
        token = json.loads(rv.data.decode())['token']

        # access with token
        rv = self.client.delete(f'/api/v1/admin/teacher/{teacher.id}',
                                headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 200)

        number_of_teachers_after = len(Teacher.query.all())
        self.assertEquals(number_of_teachers_before - number_of_teachers_after,
                          1)

        # try to remove a nonexistent teacher
        rv = self.client.delete(f'/api/v1/admin/teacher/{teacher.id}',
                                headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 410)
Ejemplo n.º 3
0
def create_teacher():
    data = request.get_json() or {}
    if not all(field in data for field in ['name', 'username', 'password']):
        return '', 400
    teacher = Teacher()
    teacher.from_dict(data)
    db.session.add(teacher)
    db.session.commit()
    return '', 200
Ejemplo n.º 4
0
    def test_course(self):
        # create invalid course
        course = Course()
        db.session.add(course)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # try to create course without a teacher
        course.from_dict({'name': 'course', 'description': 'course'})
        db.session.add(course)

        self.assertIsNone(course.teacher_id)

        # create a teacher
        teacher = Teacher()
        teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(teacher)
        db.session.commit()

        # add teacher to course
        course.teacher_id = teacher.id
        db.session.add(course)
        db.session.commit()

        # check data
        self.assertEquals(len(Course.query.all()), 1)
        self.assertIsNotNone(course.id)
        self.assertEquals(course.teacher_id, teacher.id)
        d = course.to_dict()
        self.assertIsNotNone(d['id'])
        self.assertEquals(d['name'], 'course')
        self.assertEquals(d['description'], 'course')
        self.assertEquals(d['teacher'], 'teacher')

        # try to create course with the same name
        course2 = Course()
        course2.from_dict({'name': 'course', 'description': 'course2'})
        course2.teacher_id = teacher.id
        db.session.add(course2)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()
Ejemplo n.º 5
0
    def test_teacher(self):
        # create invalid teacher
        teacher = Teacher()
        db.session.add(teacher)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # create valid teacher
        teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(teacher)
        db.session.commit()

        # check data
        self.assertEquals(len(Teacher.query.all()), 1)
        self.assertIsNotNone(teacher.id)
        self.assertNotEquals(teacher.password_hash, 'teacher')
        self.assertEquals(teacher.type, 'teachers')
        d = teacher.to_dict()
        self.assertIsNotNone(d['id'])
        self.assertEquals(d['username'], 'teacher')
        self.assertEquals(d['name'], 'teacher')

        # try to create teacher with the same username
        teacher2 = Teacher()
        teacher2.from_dict({
            'name': 'teacher2',
            'username': '******',
            'password': '******'
        })
        db.session.add(teacher2)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()
Ejemplo n.º 6
0
    from homework_server import db

    db.drop_all()
    db.create_all()

    from homework_server.models import Administrator

    admin_user = Administrator()
    admin_user.name = 'admin'
    admin_user.username = '******'
    admin_user.set_password('admin')
    db.session.add(admin_user)
    db.session.commit()

    from homework_server.models import Teacher
    t = Teacher()
    t.name = 't'
    t.username = '******'
    t.set_password('t')
    db.session.add(t)
    db.session.commit()

    from homework_server.models import Student
    s = Student()
    s.name = 's'
    s.username = '******'
    s.set_password('s')
    db.session.add(s)
    db.session.commit()

    from homework_server.models import Course
Ejemplo n.º 7
0
    def test_student(self):
        # create invalid student
        student = Student()
        db.session.add(student)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # create valid student
        student.from_dict({
            'name': 'student',
            'username': '******',
            'password': '******'
        })
        db.session.add(student)
        db.session.commit()

        # check data
        self.assertEquals(len(Student.query.all()), 1)
        self.assertIsNotNone(student.id)
        self.assertNotEquals(student.password_hash, 'student')
        self.assertEquals(student.type, 'students')
        d = student.to_dict()
        self.assertIsNotNone(d['id'])
        self.assertEquals(d['username'], 'student')
        self.assertEquals(d['name'], 'student')

        # try to create student with the same username
        student2 = Student()
        student2.from_dict({
            'name': 'student2',
            'username': '******',
            'password': '******'
        })
        db.session.add(student2)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # create a teacher
        teacher = Teacher()
        teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(teacher)
        db.session.commit()

        # create a course and add student to it
        course = Course()
        course.from_dict({'name': 'course', 'description': 'course'})
        course.teacher_id = teacher.id
        course.students.append(student)
        db.session.add(course)
        db.session.commit()

        # check if student has one course
        self.assertEquals(len(student.courses), 1)

        # create a homework and add student to it
        homework = Homework()
        homework.from_dict({
            'name': 'homework',
            'description': 'homework',
            'deadline': datetime.utcnow(),
            'headcount': 2,
            'self_assignable': True
        })
        homework.course_id = course.id
        homework.students.append(student)
        db.session.add(homework)
        db.session.commit()

        # check if student has one homework
        self.assertEquals(len(student.homeworks), 1)
Ejemplo n.º 8
0
    def test_solution(self):
        # create invalid solution
        solution = Solution()
        db.session.add(solution)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # try to create solution without file_path
        solution.from_dict({'status': 'status'})
        db.session.add(solution)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # try to create solution without a homework
        solution.file_path = 'file_path'
        db.session.add(solution)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # create a teacher
        teacher = Teacher()
        teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(teacher)
        db.session.commit()

        # create a course
        course = Course()
        course.from_dict({'name': 'course', 'description': 'course'})
        course.teacher_id = teacher.id
        db.session.add(course)
        db.session.commit()

        # create a homework
        homework = Homework()
        homework.from_dict({
            'name': 'homework',
            'description': 'homework',
            'deadline': '2018-10-30 10:20:32',
            'headcount': 2,
            'self_assignable': True
        })
        homework.course_id = course.id
        db.session.add(homework)
        db.session.commit()

        # add homework to solution
        solution.homework_id = homework.id
        db.session.add(solution)
        db.session.commit()

        # check data
        submitted_at = datetime.utcnow()
        self.assertEquals(len(Solution.query.all()), 1)
        self.assertIsNotNone(solution.id)
        self.assertEquals(solution.homework_id, homework.id)
        d = solution.to_dict()
        self.assertIsNotNone(d['id'])
        self.assertEquals(sorted(d.keys()), ['id', 'status', 'submitted_at'])
        self.assertEquals(d['status'], 'status')
        self.assertTrue(
            abs((submitted_at -
                 datetime.strptime(d['submitted_at'], '%Y-%m-%d %H:%M:%S')
                 ).seconds) < 1)
Ejemplo n.º 9
0
    def test_homework(self):
        # create invalid homework
        homework = Homework()
        db.session.add(homework)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # try to create homework without a course
        homework.from_dict({
            'name': 'homework',
            'description': 'homework',
            'deadline': '2018-10-30 10:20:32',
            'headcount': 2,
            'self_assignable': True
        })
        db.session.add(homework)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()

        # create a teacher
        teacher = Teacher()
        teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(teacher)
        db.session.commit()

        # create a course
        course = Course()
        course.from_dict({'name': 'course', 'description': 'course'})
        course.teacher_id = teacher.id
        db.session.add(course)
        db.session.commit()

        # add course to homework
        homework.course_id = course.id
        db.session.add(homework)
        db.session.commit()

        # check data
        self.assertEquals(len(Homework.query.all()), 1)
        self.assertIsNotNone(homework.id)
        self.assertEquals(homework.course_id, course.id)
        d = homework.to_dict()
        self.assertIsNotNone(d['id'])
        self.assertEquals(d['name'], 'homework')
        self.assertEquals(d['description'], 'homework')
        self.assertEquals(d['deadline'], '2018-10-30 10:20:32')
        self.assertEquals(d['headcount'], 2)
        self.assertTrue(d['self_assignable'])
        self.assertEquals(d['course'], 'course')

        # try to create homework with the same name
        homework2 = Homework()
        homework2.from_dict({
            'name': 'homework',
            'description': 'homework2',
            'deadline': datetime.utcnow(),
            'headcount': 3,
            'self_assignable': False
        })
        homework2.course_id = course.id
        db.session.add(homework2)
        self.assertRaises(IntegrityError, db.session.commit)
        db.session.rollback()
Ejemplo n.º 10
0
class BaseApiTest(BaseTest):
    def setUp(self):
        super(BaseApiTest, self).setUp()

        self.admin = Administrator()
        self.admin.from_dict({
            'name': 'admin',
            'username': '******',
            'password': '******'
        })
        db.session.add(self.admin)

        self.teacher = Teacher()
        self.teacher.from_dict({
            'name': 'teacher',
            'username': '******',
            'password': '******'
        })
        db.session.add(self.teacher)

        self.student = Student()
        self.student.from_dict({
            'name': 'student',
            'username': '******',
            'password': '******'
        })
        db.session.add(self.student)

        db.session.commit()

    def basic_auth_header(self, username, password):
        headers = {
            'Accept': 'application/json',
            'Content-type': 'application/json'
        }
        credentials = base64.b64encode(f'{username}:{password}'.encode()).decode('utf-8')
        headers['Authorization'] = f'Basic {credentials}'
        return headers

    def token_auth_header(self, token):
        headers = {
            'Accept': 'application/json',
            'Content-type': 'application/json'
        }
        headers['Authorization'] = f'Bearer {token}'
        return headers

    def insufficient_datas(self, data):
        fields = list(data.keys())

        combinations = []
        for i in range(1, len(fields)):
            combinations.append(list(itertools.combinations(fields, i)))

        request_datas = []
        for l1 in combinations:
            for l2 in l1:
                d = {}
                for f in l2:
                    d[f] = data[f]
                request_datas.append(d)

        return request_datas
Ejemplo n.º 11
0
    def test_pagination(self):
        # remove default teacher
        db.session.delete(self.teacher)

        # create 55 teachers
        for i in range(55):
            t = Teacher()
            t.name = f't{i:02}'
            t.username = f't{i:02}'
            t.set_password(f't{i:02}')
            db.session.add(t)

        db.session.commit()

        # get token
        rv = self.client.post('/api/v1/auth/token',
                              headers=self.basic_auth_header('admin', 'admin'))
        self.assertEquals(rv.status_code, 200)
        token = json.loads(rv.data.decode())['token']

        # access with token (items 0-24)
        rv = self.client.get('/api/v1/admin/teachers',
                             headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 200)

        # check returned data
        data = json.loads(rv.data.decode())
        self.assertEquals(len(data['teachers']), 25)
        for i in range(0, 25):
            self.assertEquals(data['teachers'][i]['name'], f't{i:02}')
        self.assertIsNotNone(data['next'])
        self.assertIsNone(data['prev'])

        # get next page (items 25-49)
        rv = self.client.get(data['next'],
                             headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 200)

        # check returned data
        data = json.loads(rv.data.decode())
        self.assertEquals(len(data['teachers']), 25)
        for i in range(25, 50):
            self.assertEquals(data['teachers'][i - 25]['name'], f't{i:02}')
        self.assertIsNotNone(data['next'])
        self.assertIsNotNone(data['prev'])

        # get next page (items 49-54)
        rv = self.client.get(data['next'],
                             headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 200)

        # check returned data
        data = json.loads(rv.data.decode())
        self.assertEquals(len(data['teachers']), 5)
        for i in range(50, 55):
            self.assertEquals(data['teachers'][i - 50]['name'], f't{i:02}')
        self.assertIsNone(data['next'])
        self.assertIsNotNone(data['prev'])

        # get previous page (items 25-49)
        rv = self.client.get(data['prev'],
                             headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 200)

        # check returned data
        data = json.loads(rv.data.decode())
        self.assertEquals(len(data['teachers']), 25)
        for i in range(25, 50):
            self.assertEquals(data['teachers'][i - 25]['name'], f't{i:02}')
        self.assertIsNotNone(data['next'])
        self.assertIsNotNone(data['prev'])

        # get previous page (items 0-24)
        rv = self.client.get(data['prev'],
                             headers=self.token_auth_header(token))
        self.assertEquals(rv.status_code, 200)

        # check returned data
        data = json.loads(rv.data.decode())
        self.assertEquals(len(data['teachers']), 25)
        for i in range(0, 25):
            self.assertEquals(data['teachers'][i]['name'], f't{i:02}')
        self.assertIsNotNone(data['next'])
        self.assertIsNone(data['prev'])