240 lines
7.1 KiB
Python
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)
|
|
|