Files
penracourses/anatomy/tests/test_exams.py
T
Ross 4c3b7d2e12 .
2022-08-10 22:30:06 +01:00

240 lines
7.1 KiB
Python

import json
import os
from re import A
from django.conf import settings
import pytest
import tempfile
# from django.contrib.auth.models import User
from django.urls import reverse
from rich.pretty import pprint
from bs4 import BeautifulSoup
from anatomy.views import GenericExamViews as AnatomyExamViews
from anatomy.models import Exam, AnatomyQuestion as Question, QuestionType, Structure
from generic.models import CidUser, CidUserGroup
APP_NAME = "anatomy"
def create_cid_user_and_groups(db):
group1 = CidUserGroup.objects.create(name="Group1")
group2 = CidUserGroup.objects.create(name="Group2")
cid_user_1000 = CidUser.objects.create(cid=1000, passcode="ABCD", group=group1)
cid_user_1001 = CidUser.objects.create(cid=1001, passcode="EFGH", group=group1)
cid_user_2001 = CidUser.objects.create(cid=2001, passcode="EFGH", group=group2)
assert cid_user_1000.cid == 1000
assert cid_user_1001.cid == 1001
def create_exam(db):
exam: Exam = AnatomyExamViews.Exam.objects.create(
name="Cid Exam", exam_mode=True, active=True
)
group1: CidUserGroup = CidUserGroup.objects.get(name="Group1")
exam.cid_user_groups.add(group1)
exam.valid_cid_users.add(*group1.ciduser_set.all())
assert exam in group1.anatomy_cid_user_groups.all()
assert exam
return exam
def create_structures(db):
structure = Structure.objects.create(structure="test structure")
structure.save()
structure = Structure.objects.create(structure="test structure 2")
structure.save()
def create_question_types(db):
question_type = QuestionType.objects.create(text="test question type")
question_type.save()
question_type = QuestionType.objects.create(text="test question type 2")
question_type.save()
def create_question(exam):
# Just assign random stuff
image = tempfile.NamedTemporaryFile(
dir=settings.MEDIA_ROOT, suffix=".jpg", delete=False
)
question: Question = Question.objects.create(
question_type=QuestionType.objects.first(),
structure=Structure.objects.first(),
image=image.name,
)
question.exams.set([exam])
return question
def test_exams(db, client):
create_cid_user_and_groups(db)
exam = create_exam(db)
create_structures(db)
create_question_types(db)
question1 = create_question(exam)
create_question(exam)
create_question(exam)
active_exams = client.get(reverse(f"{APP_NAME}:active_exams"))
assert active_exams.status_code == 200
assert len(json.loads(active_exams.content)["exams"]) == 0
cid_user_1001 = CidUser.objects.get(cid=1001)
for cid_user in [cid_user_1001]:
# Test active exams sections works as intended
active_exams_cid = client.get(
reverse(
f"active_exams_cid",
kwargs={"cid": cid_user.cid, "passcode": cid_user.passcode},
)
)
assert active_exams_cid.status_code == 200
assert len(json.loads(active_exams_cid.content)["exams"]) == 1
active_exams_cid = client.get(
reverse(f"active_exams_cid", kwargs={"cid": 1001, "passcode": "EFGH"})
)
assert active_exams_cid.status_code == 200
assert len(json.loads(active_exams_cid.content)["exams"]) == 1
no_active_exams_cid = client.get(
reverse(f"active_exams_cid", kwargs={"cid": 2001, "passcode": "EGFH"})
)
assert no_active_exams_cid.status_code == 401
assert json.loads(no_active_exams_cid.content)["status"] == "invalid"
invalid_passcode = client.get(
reverse(f"active_exams_cid", kwargs={"cid": 1001, "passcode": "ABCD"})
)
assert invalid_passcode.status_code == 401
assert json.loads(invalid_passcode.content)["status"] == "invalid"
exam_metadata = json.loads(active_exams_cid.content)["exams"][0]
assert exam_metadata["name"] == "Cid Exam"
assert exam_metadata["exam_active"] == True
assert exam_metadata["exam_mode"] == True
res = client.get(exam_metadata["url"])
assert res.status_code == 200
exam_json = json.loads(res.content)
assert (
question1.get_question_json(answers=False)
in exam_json["questions"].values()
)
assert len(exam_json["questions"]) == 3
exam.active = False
exam.save()
res = client.get(exam_metadata["url"])
assert res.status_code == 404
exam.active = True
exam.save()
post_json = {
"eid": f"anatomy/{exam.pk}",
"cid": cid_user_1001.cid,
"start_time": "1659618141.731",
"answers": [[]],
}
# Test submission
# Start with 0 answers
res = client.post(reverse("global_exam_answers_submit"), data=post_json)
json_res = json.loads(res.content)
assert json_res["success"] == True
assert json_res["question_count"] == 0
post_json = {
"eid": f"anatomy/{exam.pk+10}",
"cid": cid_user_1001.cid,
"start_time": "1659618141.731",
"answers": [[]],
}
res = client.post(reverse("global_exam_answers_submit"), data=post_json)
json_res = json.loads(res.content)
assert json_res["success"] == False
# Test invalid cid
post_json = {
"eid": f"anatomy/{exam.pk+10}",
"cid": 1,
"start_time": "1659618141.731",
"answers": [[]],
}
res = client.post(reverse("global_exam_answers_submit"), data=post_json)
json_res = json.loads(res.content)
assert json_res["success"] == False
assert json_res["error"] == "Invalid data"
valid_answers = []
for questions in exam_json["questions"]:
for qid in questions:
valid_answers.append(
{
"eid": exam_json["eid"],
"cid": cid_user_1001.cid,
"passcode": cid_user_1001.passcode,
"qid": qid,
"qidn": "1",
"ans": f"answer {qid}",
}
)
post_json = {
"eid": exam_json["eid"],
"cid": cid_user_1001.cid,
"start_time": "1659618141.731",
"answers": json.dumps(valid_answers),
}
# Test submission
# give three answers
print("post_json", post_json)
res = client.post(reverse("global_exam_answers_submit"), data=post_json)
json_res = json.loads(res.content)
print(json_res)
assert json_res["success"] == True
assert json_res["question_count"] == 3
# We can then check the answers have been submitted (and can be viewed by the user)
cid_scores_res = client.get(
reverse(f"cid_scores", kwargs={"cid": 1001, "passcode": "EFGH"})
)
cid_scores_soup = BeautifulSoup(cid_scores_res.content, "html.parser")
assigned_exams = cid_scores_soup.find(id="exam-assigned").find_all("li")
print(assigned_exams)