Exemplo n.º 1
0
def test_find_next(add_test_data, get_first_feedback, get_second_feedback):
    student = Student(first_name='', last_name='')
    student2 = Student(first_name='bob', last_name='alice')

    grader = Grader(name='Zesje', oauth_id='Zesje')

    sub = Submission(id=25, student=student, exam_id=42)
    sub2 = Submission(id=26, student=student2, exam_id=42)

    sol = Solution(problem_id=20,
                   submission=sub,
                   graded_by=grader,
                   graded_at=datetime.now())
    db.session.add(sol)
    sol2 = Solution(problem_id=20,
                    submission=sub2,
                    graded_by=grader,
                    graded_at=datetime.now())
    db.session.add(sol2)

    sol.feedback = get_first_feedback
    sol2.feedback = get_second_feedback

    result = _find_submission(sub, Problem.query.get(20), 1, 'next', False,
                              set([3]), set([2]), None)
    assert result == sub2
Exemplo n.º 2
0
def add_test_submissions(app):
    student = Student(first_name='Harry', last_name='Lewis')
    student2 = Student(first_name='bob', last_name='alice')
    student3 = Student(first_name='Charlie', last_name='Bob')

    grader = Grader(id=1, name='Zesje', oauth_id='Zesje')
    grader2 = Grader(id=2, name='Alice', oauth_id='Smith')

    sub = Submission(id=25, student=student, exam_id=42)
    sub2 = Submission(id=26, student=student2, exam_id=42)
    sub3 = Submission(id=27, student=student3, exam_id=42)

    sol = Solution(problem_id=20,
                   submission=sub,
                   graded_by=grader,
                   graded_at=datetime.now())
    db.session.add(sol)
    sol2 = Solution(problem_id=20,
                    submission=sub2,
                    graded_by=grader2,
                    graded_at=datetime.now())
    db.session.add(sol2)
    sol3 = Solution(problem_id=20,
                    submission=sub3,
                    graded_by=grader2,
                    graded_at=datetime.now())
    db.session.add(sol3)
    yield app
Exemplo n.º 3
0
def test_find_length(add_test_data, get_first_feedback, get_second_feedback):
    student = Student(first_name='Harry', last_name='Lewis')
    student2 = Student(first_name='bob', last_name='alice')
    student3 = Student(first_name='Charlie', last_name='Bob')

    grader = Grader(id=1, name='Zesje', oauth_id='Zesje')
    grader2 = Grader(id=2, name='Alice', oauth_id='Smith')

    sub = Submission(id=25, student=student, exam_id=42)
    sub2 = Submission(id=26, student=student2, exam_id=42)
    sub3 = Submission(id=27, student=student3, exam_id=42)

    sol = Solution(problem_id=20,
                   submission=sub,
                   graded_by=grader,
                   graded_at=datetime.now())
    db.session.add(sol)
    sol2 = Solution(problem_id=20,
                    submission=sub2,
                    graded_by=grader2,
                    graded_at=datetime.now())
    db.session.add(sol2)
    sol3 = Solution(problem_id=20,
                    submission=sub3,
                    graded_by=grader2,
                    graded_at=datetime.now())
    db.session.add(sol3)

    sol.feedback = get_first_feedback
    sol2.feedback = get_second_feedback
    sol3.feedback = get_first_feedback

    result = find_number_of_matches(Problem.query.get(20), False, [1], [], 2)
    assert result == 1
Exemplo n.º 4
0
def app_with_data(app):
    exam = Exam(name='')
    students = [Student(id=i+1, first_name='', last_name='') for i in range(2)]
    db.session.add(exam)
    for student in students:
        db.session.add(student)
    db.session.commit()
    yield app, exam, students
Exemplo n.º 5
0
def test_guess_image_info(file_info, info):
    students = [Student(id=1000001, first_name='First', last_name='Last')]
    try:
        ext_info = guess_page_info(file_info, students)
    except Exception:
        ext_info = None

    assert ext_info == info
Exemplo n.º 6
0
def add_test_data(app):
    """Adds test data to the db.

    The feedback tree for problem 1 is (+: non-exlcusive; -: exclusive):
    + root(id=0)
        + A(id=1)
            + A1(id=11)
            + A2(id=12)
        + B(id=2)
            - B1(id=21)
            - B2(id=22)
    """
    exam = Exam(id=1, name='exam', finalized=True, layout="unstructured")
    db.session.add(exam)

    problem = Problem(id=1, name='Problem', exam=exam)
    db.session.add(problem)

    student = Student(id=1, first_name='Harry', last_name='Lewis')
    db.session.add(student)

    grader = Grader(id=1, name='Zesje', oauth_id='Zesje')
    db.session.add(grader)

    sub = Submission(id=1, student=student, exam=exam)
    db.session.add(sub)

    sol = Solution(id=1, submission=sub, problem=problem)
    db.session.add(sol)
    db.session.commit()

    root = problem.root_feedback

    for i in range(2):
        fo_parent = FeedbackOption(id=i + 1,
                                   problem=problem,
                                   text=chr(i + 65),
                                   description='',
                                   score=i,
                                   parent=root,
                                   mut_excl_children=i == 1)
        db.session.add(fo_parent)
        db.session.commit()
        for j in range(1, 3):
            fo = FeedbackOption(id=(i + 1) * 10 + j,
                                problem=problem,
                                text=chr(i + 65) + chr(j + 65),
                                description='',
                                score=-1 * i * j,
                                parent_id=i + 1)
            db.session.add(fo)

    db.session.commit()

    yield app
Exemplo n.º 7
0
def test_has_all_required(get_first_feedback):
    student = Student(first_name='', last_name='')
    grader = Grader(name='Zesje', oauth_id='Zesje')
    sub = Submission(student=student, exam_id=42)
    sol = Solution(problem_id=20,
                   submission=sub,
                   graded_by=grader,
                   graded_at=datetime.now())
    sol.feedback = get_first_feedback

    assert has_all_required_feedback(sol, set([1, 2]), set([3]))
Exemplo n.º 8
0
def app_with_data(app):
    exam = Exam(name='', layout=ExamLayout.unstructured)
    problem = Problem(exam=exam, name='Problem')
    widget = ProblemWidget(problem=problem, x=0, y=0, width=0, height=0)
    students = [
        Student(id=i + 1000000, first_name='', last_name='') for i in range(2)
    ]
    db.session.add(exam)
    db.session.add(problem)
    db.session.add(widget)
    for student in students:
        db.session.add(student)
    db.session.commit()
    yield app, exam, students
Exemplo n.º 9
0
def test_find_next_graded_by(add_test_data):
    student = Student(first_name='', last_name='')
    student2 = Student(first_name='bob', last_name='alice')

    grader = Grader(id=1, name='Zesje', oauth_id='Zesje')
    grader2 = Grader(id=2, name='Alice', oauth_id='Smith')

    sub = Submission(id=25, student=student, exam_id=42)
    sub2 = Submission(id=26, student=student2, exam_id=42)

    sol = Solution(problem_id=20,
                   submission=sub,
                   graded_by=grader,
                   graded_at=datetime.now())
    db.session.add(sol)
    sol2 = Solution(problem_id=20,
                    submission=sub2,
                    graded_by=grader2,
                    graded_at=datetime.now())
    db.session.add(sol2)

    result = _find_submission(sub, Problem.query.get(20), 1, 'next', False,
                              set(), set(), 2)
    assert result == sub2
Exemplo n.º 10
0
def test_solution_pdf(app, datadir, layout, anonymous):
    exam = Exam(name='Email', layout=layout, finalized=True)
    student = Student(id=1234323,
                      first_name='Jamy',
                      last_name='Macgiver',
                      email='*****@*****.**')
    db.session.add(exam)
    db.session.add(student)
    db.session.commit()

    if layout == ExamLayout.templated:
        db.session.add(
            ExamWidget(
                name='student_id_widget',
                x=50,
                y=50,
                exam=exam,
            ))
        db.session.commit()

    sub = Submission(exam=exam, student=student, validated=True)
    db.session.add(sub)

    copy = Copy(submission=sub, number=1)
    db.session.add(copy)

    for index, filepath in enumerate(
        ['studentnumbers/1234323.jpg', 'studentnumbers/4300947.jpg']):
        page = Page(number=index, path=os.path.join(datadir, filepath))
        db.session.add(page)
        copy.pages.append(page)
    db.session.commit()

    with Pdf.open(solution_pdf(exam.id, student.id,
                               anonymous=anonymous)) as pdf:
        pagecount = len(pdf.pages)
        assert pagecount == 2

        if anonymous and layout == ExamLayout.templated:
            image = extract_image_pikepdf(pdf.pages[0])
            _, coords = exam_student_id_widget(exam.id)
            widget_area = get_box(np.array(image),
                                  np.array(coords, dtype=float) / 72,
                                  padding=-.3)
            w, h, *_ = widget_area.shape

            assert 145 < (np.mean(widget_area[:w // 2]) +
                          np.mean(widget_area[:, :h // 2])) / 2 < 155
Exemplo n.º 11
0
def test_delete_problem_graded(test_client, add_test_data, exam_id,
                               problem_id):
    student = Student(first_name='', last_name='')
    db.session.add(student)
    grader = Grader(name='Zesje', oauth_id='zesje')
    db.session.add(grader)
    db.session.commit()
    sub = Submission(student=student, exam_id=exam_id)
    db.session.add(sub)
    db.session.commit()
    sol = Solution(problem_id=problem_id,
                   submission=sub,
                   graded_by=grader,
                   graded_at=datetime.now())
    db.session.add(sol)
    db.session.commit()

    result = test_client.delete(f'/api/problems/{problem_id}')

    assert result.status_code == 403
    assert Problem.query.get(problem_id) is not None
Exemplo n.º 12
0
def add_test_data(app):
    exam = Exam(name='exam 1', finalized=True)
    db.session.add(exam)

    problem1 = Problem(name='Problem 1', exam=exam)
    problem2 = Problem(name='Problem 2', exam=exam)
    db.session.add(problem1)
    db.session.add(problem2)

    feedback_option = FeedbackOption(problem=problem1,
                                     text='text',
                                     description='desc',
                                     score=5)
    db.session.add(feedback_option)

    student = Student(id=1000001, first_name='', last_name='')
    db.session.add(student)

    sub = Submission(exam=exam, student=student, copies=[], validated=True)
    db.session.add(sub)
    db.session.commit()

    yield app, exam