diff --git a/physics/tests/test_physics_exams.py b/physics/tests/test_physics_exams.py index 6f5b3898..9b5921ab 100644 --- a/physics/tests/test_physics_exams.py +++ b/physics/tests/test_physics_exams.py @@ -18,9 +18,10 @@ from physics.views import GenericExamViews as PhysicsExamViews from physics.models import Category, CidUserAnswer, Exam, Question -from generic.models import CidUser, CidUserGroup +from generic.models import CidUser, CidUserGroup, UserUserGroup from rad.test_helpers import AssertNotFound +from django.contrib.auth.models import User APP_NAME = "physics" @@ -39,6 +40,13 @@ def create_cid_user_and_groups(db): assert cid_user_1000.cid == 1000 assert cid_user_1001.cid == 1001 + # Create UserUsers + user1 = User.objects.create_user(username="user1", email="test@email.com", password="test1234") + + usergroup1 = UserUserGroup.objects.create(name="Group1") + usergroup1.users.add(user1) + usergroup2 = UserUserGroup.objects.create(name="Group2") + def create_exam(db): exam: Exam = PhysicsExamViews.Exam.objects.create( @@ -46,11 +54,15 @@ def create_exam(db): ) group1: CidUserGroup = CidUserGroup.objects.get(name="Group1") + usergroup1: UserUserGroup = UserUserGroup.objects.get(name="Group1") exam.cid_user_groups.add(group1) exam.valid_cid_users.add(*group1.ciduser_set.all()) + #exam.valid_user_users.add(user1) + exam.valid_user_users.add(*usergroup1.users.all()) + assert exam in group1.physics_cid_user_groups.all() assert exam @@ -118,8 +130,23 @@ def test_exams(db, client): cid_user_1001 = CidUser.objects.get(cid=1001) cid_user_1000 = CidUser.objects.get(cid=1000) + cid_user_2001 = CidUser.objects.get(cid=2001) + + user1 = User.objects.get(username="user1") + + + users_tested = 1 + + for cid_user in [cid_user_1001, cid_user_1000, user1]: + + if isinstance(cid_user, CidUser): + testing_cid_user = True + else: + testing_cid_user = False + current_user = cid_user + client.force_login(cid_user) + - for cid_user in [cid_user_1001, cid_user_1000]: exam.active = True exam.publish_results = False exam.save() @@ -127,12 +154,16 @@ def test_exams(db, client): start_page_res = client.get( reverse(f"physics:exam_start", kwargs={"pk": exam.pk}) ) + start_page_soup = BeautifulSoup(start_page_res.content, "html.parser") - assert "Enter your CID and passcode" in str(start_page_soup) + if testing_cid_user: + assert "Enter your CID and passcode" in str(start_page_soup) + else: + assert "Start Exam" in str(start_page_soup) for n, question in enumerate(questions): - cid_take_res = client.get( - reverse( + if testing_cid_user: + take_url = reverse( f"physics:exam_take", kwargs={ "pk": exam.pk, @@ -141,12 +172,28 @@ def test_exams(db, client): "passcode": cid_user.passcode, }, ) + else: + take_url = reverse( + f"physics:exam_take_user", + kwargs={ + "pk": exam.pk, + "sk": n, + }, + ) + + + cid_take_res = client.get( + take_url ) cid_take_soup = BeautifulSoup(cid_take_res.content, "html.parser") # Check correct user is displayed + if testing_cid_user: + display_user = str(cid_user.cid) + else: + display_user = current_user.username assert ( - str(cid_user.cid) + display_user in cid_take_soup.find("span", {"id": "user-id"}).string ) @@ -188,8 +235,8 @@ def test_exams(db, client): ) - cid_take_overview_res = client.get( - reverse( + if testing_cid_user: + take_overview_url = reverse( f"physics:exam_take_overview", kwargs={ "pk": exam.pk, @@ -197,6 +244,18 @@ def test_exams(db, client): "passcode": cid_user.passcode, }, ) + else: + take_overview_url = reverse( + f"physics:exam_take_overview_user", + kwargs={ + "pk": exam.pk, + }, + ) + + + + cid_take_overview_res = client.get( + take_overview_url ) cid_take_overview_soup = BeautifulSoup( cid_take_overview_res.content, "html.parser" @@ -219,15 +278,25 @@ def test_exams(db, client): # All physics questions have 5 parts (and require a csrf token) questions_len = len(questions) - 1 for n, question in enumerate(questions): - question_url = reverse( - f"physics:exam_take", - kwargs={ - "pk": exam.pk, - "sk": n, - "cid": cid_user.cid, - "passcode": cid_user.passcode, - }, - ) + if testing_cid_user: + question_url = reverse( + f"physics:exam_take", + kwargs={ + "pk": exam.pk, + "sk": n, + "cid": cid_user.cid, + "passcode": cid_user.passcode, + }, + ) + else: + question_url = reverse( + f"physics:exam_take_user", + kwargs={ + "pk": exam.pk, + "sk": n, + }, + ) + cid_take_res = client.get(question_url) cid_take_soup = BeautifulSoup(cid_take_res.content, "html.parser") @@ -271,16 +340,19 @@ def test_exams(db, client): # Filter answer to the question we just submitted to cid_user_answers = question.cid_user_answers.all() - assert len(cid_user_answers) in (1, 2) + assert len(cid_user_answers) == users_tested - cid_user_answer = cid_user_answers.filter(cid=cid_user.cid)[0] + if testing_cid_user: + cid_user_answer = cid_user_answers.filter(cid=cid_user.cid)[0] + else: + cid_user_answer = cid_user_answers.filter(user=current_user)[0] assert all(cid_user_answer.get_answers()) # Recheck the overview page (now that we have submitted answers) - cid_take_overview_res = client.get( - reverse( + if testing_cid_user: + take_overview_url = reverse( f"physics:exam_take_overview", kwargs={ "pk": exam.pk, @@ -288,6 +360,16 @@ def test_exams(db, client): "passcode": cid_user.passcode, }, ) + else: + take_overview_url = reverse( + f"physics:exam_take_overview_user", + kwargs={ + "pk": exam.pk, + }, + ) + + cid_take_overview_res = client.get( + take_overview_url ) cid_take_overview_soup = BeautifulSoup( cid_take_overview_res.content, "html.parser" @@ -307,20 +389,25 @@ def test_exams(db, client): ) # Get overview scores page (invalid passcode) - AssertNotFound(client, - reverse(f"cid_scores", kwargs={"cid": cid_user.cid, "passcode": "AAAA"}) - ) + if testing_cid_user: + AssertNotFound(client, + reverse(f"cid_scores", kwargs={"cid": cid_user.cid, "passcode": "AAAA"}) + ) + + cid_scores_url = reverse(f"cid_scores", kwargs={"cid": cid_user.cid, "passcode": cid_user.passcode}) + else: + cid_scores_url = reverse(f"user_scores") # Get overview scores page cid_scores_res = client.get( - reverse(f"cid_scores", kwargs={"cid": cid_user.cid, "passcode": cid_user.passcode}) + cid_scores_url ) cid_scores_soup = BeautifulSoup(cid_scores_res.content, "html.parser") search_exam = ( cid_scores_soup.find("div", {"id": "exam-assigned"}) - .find("ul", {"class": exam.app_name}) + .find("ul", {"class": exam.app_name.lower()}) .find_all("li", attrs={"data-exam-id": exam.pk}) ) assert search_exam @@ -347,19 +434,31 @@ def test_exams(db, client): ) # It should not be published yet - AssertNotFound(client, - reverse( - f"{exam.app_name}:exam_scores_cid_user", - kwargs={"pk": exam.pk, "cid": cid_user.cid, "passcode": "AAAA"}, + if testing_cid_user: + AssertNotFound(client, + reverse( + f"{exam.app_name}:exam_scores_cid_user", + kwargs={"pk": exam.pk, "cid": cid_user.cid, "passcode": "AAAA"}, + ) + ) + AssertNotFound(client, + reverse(f"{exam.app_name}:exam_scores_cid_user", kwargs={"pk": exam.pk, "cid": cid_user_2001.cid, "passcode": cid_user_2001.passcode}) ) - ) - # Load the exam results page - cid_exam_scores_res = client.get( - reverse( + exam_scores_url = reverse( f"{exam.app_name}:exam_scores_cid_user", kwargs={"pk": exam.pk, "cid": cid_user.cid, "passcode": cid_user.passcode}, ) + else: + exam_scores_url = reverse( + f"{exam.app_name}:exam_scores_user", + kwargs={"pk": exam.pk}, + ) + + + # Load the exam results page + cid_exam_scores_res = client.get( + exam_scores_url ) cid_exam_scores_soup = BeautifulSoup(cid_exam_scores_res.content, "html.parser") @@ -388,10 +487,7 @@ def test_exams(db, client): # Load the exam results page (again) cid_exam_scores_res = client.get( - reverse( - f"{exam.app_name}:exam_scores_cid_user", - kwargs={"pk": exam.pk, "cid": cid_user.cid, "passcode": cid_user.passcode}, - ) + exam_scores_url ) cid_exam_scores_soup = BeautifulSoup(cid_exam_scores_res.content, "html.parser") @@ -416,10 +512,7 @@ def test_exams(db, client): # Load the exam results page (again) cid_exam_scores_res = client.get( - reverse( - f"{exam.app_name}:exam_scores_cid_user", - kwargs={"pk": exam.pk, "cid": cid_user.cid, "passcode": cid_user.passcode}, - ) + exam_scores_url ) cid_exam_scores_soup = BeautifulSoup(cid_exam_scores_res.content, "html.parser") @@ -465,14 +558,14 @@ def test_exams(db, client): ) # answer the final question - cid_user_answer = CidUserAnswer(question=extra_question, a=True, b=False, c=True, d=False, e=True, cid=cid_user.cid, exam=exam) + if testing_cid_user: + cid_user_answer = CidUserAnswer(question=extra_question, a=True, b=False, c=True, d=False, e=True, cid=cid_user.cid, exam=exam) + else: + cid_user_answer = CidUserAnswer(question=extra_question, a=True, b=False, c=True, d=False, e=True, user=current_user, exam=exam) cid_user_answer.save() cid_exam_scores_res = client.get( - reverse( - f"{exam.app_name}:exam_scores_cid_user", - kwargs={"pk": exam.pk, "cid": cid_user.cid, "passcode": cid_user.passcode}, - ) + exam_scores_url ) cid_exam_scores_soup = BeautifulSoup(cid_exam_scores_res.content, "html.parser") @@ -496,8 +589,8 @@ def test_exams(db, client): assert "Exam is currently inactive" in start_page_soup.text - cid_take_res = client.get( - reverse( + if testing_cid_user: + cid_take_url = reverse( f"physics:exam_take", kwargs={ "pk": exam.pk, @@ -506,8 +599,19 @@ def test_exams(db, client): "passcode": cid_user.passcode, }, ) + else: + cid_take_url = reverse( + f"physics:exam_take_user", + kwargs={ + "pk": exam.pk, + "sk": 0, + }, + ) + cid_take_res = client.get( + cid_take_url ) cid_take_soup = BeautifulSoup(cid_take_res.content, "html.parser") assert "Exam is currently inactive" in cid_take_soup.text - questions.pop(-1).delete() \ No newline at end of file + questions.pop(-1).delete() + users_tested = users_tested + 1 \ No newline at end of file diff --git a/templates/cid_scores.html b/templates/cid_scores.html index 23984ba9..781973c5 100644 --- a/templates/cid_scores.html +++ b/templates/cid_scores.html @@ -8,7 +8,7 @@ The following exams will be available to take when active. {% for exam_type, exams in available_exams %}
The following exams will be available to take when active. +