Exemplo n.º 1
0
def test_reputation__student(client, student):
    data = {"reputation_type": "student"}
    login_student(client, student)

    with mock.patch(
        "reputation.views.reputation.student_reputation",
        return_value=HttpResponse(""),
    ):
        resp = client.post(
            reverse("reputation:reputation"),
            json.dumps(data),
            content_type="application/json",
        )
        assert resp.status_code == 200
Exemplo n.º 2
0
def test_index_student_logged_in(client, student):
    assert login_student(client, student)

    resp = client.get(reverse("student-page"))
    assert resp.status_code == 200
    assert any(t.name == "peerinst/student/index.html" for t in resp.templates)
    assert student.student.email in resp.content
Exemplo n.º 3
0
def test_update_student_id__wrong_data(client, student, group):
    assert login_student(client, student)
    add_to_group(student, group)

    data = {"group_name": group.name}

    resp = client.post(
        reverse("student-change-id"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 400
    assert any(t.name == "400.html" for t in resp.templates)

    data = {"student_id": "1234567"}

    resp = client.post(
        reverse("student-change-id"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 400
    assert any(t.name == "400.html" for t in resp.templates)

    data = {}

    resp = client.post(
        reverse("student-change-id"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 400
    assert any(t.name == "400.html" for t in resp.templates)
Exemplo n.º 4
0
def test_update_student_id__no_data(client, student, group):
    assert login_student(client, student)
    add_to_group(student, group)

    resp = client.post(reverse("student-change-id"))
    assert resp.status_code == 400
    assert any(t.name == "400.html" for t in resp.templates)
Exemplo n.º 5
0
def test_discipline_list(client, disciplines, student, teacher):
    """
    Requirements:
    1. Must be authenticated
    2. Must not be a student to GET
    3. Must be admin for anything else
    """

    # 1. Must be authenticated
    url = reverse("REST:discipline-list")

    response = client.get(url)
    assert response.status_code == status.HTTP_403_FORBIDDEN

    # 2. Must not be a student to GET
    assert login_student(client, student)

    response = client.get(url)
    assert response.status_code == status.HTTP_403_FORBIDDEN

    assert login_teacher(client, teacher)

    response = client.get(url)
    assert response.status_code == status.HTTP_200_OK
    retrieved_disciplines = json.loads(response.content)
    for d in disciplines:
        assert d.pk in [d["pk"] for d in retrieved_disciplines]

    # 3. Must be admin for anything else
    response = client.post(url, {"title": "New discipline"})

    assert response.status_code == status.HTTP_403_FORBIDDEN
Exemplo n.º 6
0
def test_index_student_logged_in_token_same_user(client, student):
    assert login_student(client, student)

    token = create_student_token(student.student.username,
                                 student.student.email)

    resp = client.get(reverse("student-page") + "?token={}".format(token))
    assert resp.status_code == 200
    assert any(t.name == "peerinst/student/index.html" for t in resp.templates)
    assert student.student.email in resp.content
Exemplo n.º 7
0
def test_leave_group_is_not_member_of_group(client, student, group):
    assert login_student(client, student)
    data = {"username": student.student.username, "group_name": group.name}
    resp = client.post(
        reverse("student-leave-group"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 200
    assert group not in student.groups.all()
Exemplo n.º 8
0
def test_leave_group_wrong_data(client, student, group):
    assert login_student(client, student)
    data = {}
    resp = client.post(
        reverse("student-leave-group"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 400
    assert any(t.name == "400.html" for t in resp.templates)
    assert "There are missing parameters." in resp.content
Exemplo n.º 9
0
def test_update_student_id(client, student, group):
    assert login_student(client, student)
    add_to_group(student, group)

    data = {"student_id": "1234567", "group_name": group.name}

    resp = client.post(
        reverse("student-change-id"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 200
    assert (StudentGroupMembership.objects.get(
        student=student, group=group).student_school_id == data["student_id"])
Exemplo n.º 10
0
def test_is_not_student_permission_in_view(
    client, student, student_group_assignment
):

    assert login_student(client, student)

    url = reverse(
        "REST:student-group-assigment-answers",
        args=[
            student_group_assignment.pk,
            student_group_assignment.assignment.questions.first().pk,
        ],
    )

    response = client.get(url)

    assert response.status_code == status.HTTP_403_FORBIDDEN
Exemplo n.º 11
0
def test_leave_group_is_member_of_group(client, student, group):
    student.groups.add(group)
    assert login_student(client, student)
    StudentGroupMembership.objects.create(student=student, group=group)

    assert group in student.groups.all()
    assert group in student.student_groups.all()
    assert StudentGroupMembership.objects.get(student=student,
                                              group=group).current_member
    data = {"username": student.student.username, "group_name": group.name}
    resp = client.post(
        reverse("student-leave-group"),
        json.dumps(data),
        content_type="application/json",
    )
    assert resp.status_code == 200
    assert group in student.groups.all()
    assert not StudentGroupMembership.objects.get(student=student,
                                                  group=group).current_member
Exemplo n.º 12
0
def test_leave_group_no_data(client, student):
    assert login_student(client, student)
    resp = client.post(reverse("student-leave-group"))
    assert resp.status_code == 400
    assert any(t.name == "400.html" for t in resp.templates)
    assert "Wrong data type was sent." in resp.content
Exemplo n.º 13
0
def test_assignmentquestions_detail(client, assignments, student, teachers):
    """
    See also:
    - peerinst/tests/views/test_nonLTI_views.py test_assignment_update_post

    Requirements:
    1. Must be authenticated
    2. Students cannot GET
    3. Only return owned assignments
    4. Must be owner of related assignment to create or delete
    5. Cannot create or delete if assignment.editable is false
    """

    # Setup
    assignments[0].owner.add(teachers[0].user)
    assignments[1].owner.add(teachers[1].user)

    # 1. Must be authenticated
    url = reverse("REST:assignment_question-list")

    response = client.get(url)
    assert response.status_code == status.HTTP_403_FORBIDDEN

    # 2. Students cannot GET
    assert login_student(client, student)

    response = client.get(url)
    assert response.status_code == status.HTTP_403_FORBIDDEN

    # 3. Only return owned assignments
    assert login_teacher(client, teachers[0])

    response = client.get(url)
    assert response.status_code == status.HTTP_200_OK
    for aq in json.loads(response.content):
        assert aq["pk"] in AssignmentQuestions.objects.filter(
            assignment=assignments[0]
        ).values_list("pk", flat=True)
        assert aq["pk"] not in AssignmentQuestions.objects.exclude(
            pk__in=assignments[0].questions.all()
        )

    # 4. Must be owner of related assignment to create or delete
    question_to_remove = AssignmentQuestions.objects.filter(
        assignment=assignments[0]
    ).first()
    question_to_add = question_to_remove.question
    url = reverse(
        "REST:assignment_question-detail", args=[question_to_remove.pk]
    )

    response = client.delete(url)
    assert response.status_code == status.HTTP_204_NO_CONTENT

    assignments[0].refresh_from_db()
    assert question_to_remove.question not in assignments[0].questions.all()

    url = reverse("REST:assignment_question-list")

    response = client.post(
        url,
        {"assignment": assignments[0].pk, "question_pk": question_to_add.pk},
        content_type="application/json",
    )
    assert response.status_code == status.HTTP_201_CREATED

    assignments[0].refresh_from_db()
    assert question_to_add in assignments[0].questions.all()

    assert login_teacher(client, teachers[1])
    question_to_remove = AssignmentQuestions.objects.filter(
        assignment=assignments[0]
    ).first()
    url = reverse(
        "REST:assignment_question-detail", args=[question_to_remove.pk]
    )

    response = client.delete(url)
    assert response.status_code == status.HTTP_404_NOT_FOUND

    assignments[0].refresh_from_db()
    assert question_to_remove.question in assignments[0].questions.all()

    url = reverse("REST:assignment_question-list")

    question_to_add = Question.objects.create(
        title="question_to_add", text="text"
    )
    response = client.post(
        url,
        {"assignment": assignments[0].pk, "question_pk": question_to_add.pk},
        content_type="application/json",
    )
    assert response.status_code == status.HTTP_403_FORBIDDEN

    assignments[0].refresh_from_db()
    assert question_to_add not in assignments[0].questions.all()

    # 5. Cannot create or delete if assignment.editable is false
    assert login_teacher(client, teachers[0])
    with mock.patch(
        "peerinst.models.Assignment.editable", new_callable=mock.PropertyMock
    ) as mock_editable:
        mock_editable.return_value = False

        question_to_remove = AssignmentQuestions.objects.filter(
            assignment=assignments[0]
        ).first()
        url = reverse(
            "REST:assignment_question-detail", args=[question_to_remove.pk]
        )

        response = client.delete(url)
        assert response.status_code == status.HTTP_403_FORBIDDEN

        url = reverse("REST:assignment_question-list")
        response = client.post(
            url,
            {
                "assignment": assignments[0].pk,
                "question_pk": Question.objects.last().pk,
            },
            content_type="application/json",
        )
        assert response.status_code == status.HTTP_403_FORBIDDEN