fix: update exam test logic to handle CSRF token extraction and unanswered question counts
This commit is contained in:
+34
-16
@@ -327,14 +327,23 @@ class ExamTester:
|
||||
).text
|
||||
)
|
||||
|
||||
assert (
|
||||
len(
|
||||
# Different apps render unanswered markers differently:
|
||||
# - `sbas` uses <button class="unanswered"> nodes
|
||||
# - `physics` uses anchor tiles with a title attribute for unanswered
|
||||
if self.app_name == "sbas":
|
||||
count_unanswered = len(
|
||||
cid_take_overview_soup.find_all(
|
||||
"button", attrs={"class": "unanswered"}
|
||||
)
|
||||
)
|
||||
== total - answered
|
||||
)
|
||||
else:
|
||||
# Count overview tiles that include the "not answered" title
|
||||
overview_tiles = cid_take_overview_soup.find_all(
|
||||
class_="overview-question-btn"
|
||||
)
|
||||
count_unanswered = sum(1 for t in overview_tiles if t.has_attr("title"))
|
||||
|
||||
assert count_unanswered == total - answered
|
||||
|
||||
def check_cid_scores_page(self):
|
||||
if self.testing_cid_user:
|
||||
@@ -457,17 +466,20 @@ class ExamTester:
|
||||
alert = cid_exam_scores_soup.find("div", {"class": "alert"})
|
||||
assert "Results are not currently published." in str(alert)
|
||||
|
||||
# Find any element with the submitted-user-answer class (div or span)
|
||||
submitted_answers = cid_exam_scores_soup.find_all(
|
||||
"span", {"class": "submitted-user-answer"}
|
||||
class_="submitted-user-answer"
|
||||
)
|
||||
|
||||
# Check that we are showing enough questions / answers
|
||||
match self.app_name:
|
||||
case "physics":
|
||||
answer_lis = cid_exam_scores_soup.find_all(
|
||||
"li", {"class": "question-part"}
|
||||
)
|
||||
assert len(answer_lis) == 5 * len(self.generated_questions)
|
||||
# Physics renders per-part answers inside an ordered list
|
||||
# within each question block. Count li elements inside those
|
||||
# lists to get the total number of parts shown.
|
||||
ols = cid_exam_scores_soup.find_all("ol", class_="mb-0")
|
||||
answer_li_count = sum(len(ol.find_all("li")) for ol in ols)
|
||||
assert answer_li_count == 5 * len(self.generated_questions)
|
||||
assert len(submitted_answers) == 5 * len(self.generated_questions)
|
||||
for ans in submitted_answers:
|
||||
assert ans.text.strip() == "True"
|
||||
@@ -497,10 +509,9 @@ class ExamTester:
|
||||
)
|
||||
match self.app_name:
|
||||
case "physics":
|
||||
answer_lis = cid_exam_scores_soup.find_all(
|
||||
"li", {"class": "question-part"}
|
||||
)
|
||||
assert len(answer_lis) == 5 * len(self.generated_questions)
|
||||
ols = cid_exam_scores_soup.find_all("ol", class_="mb-0")
|
||||
answer_li_count = sum(len(ol.find_all("li")) for ol in ols)
|
||||
assert answer_li_count == 5 * len(self.generated_questions)
|
||||
assert len(submitted_answers) == 5 * len(self.generated_questions)
|
||||
|
||||
for ans in submitted_answers[:-5]:
|
||||
@@ -541,9 +552,16 @@ class ExamTester:
|
||||
) # Check our warning banner is gone
|
||||
|
||||
# Check that we are displaying the correct answers (correctly)
|
||||
correct_answers = cid_exam_scores_soup.find_all(
|
||||
"span", {"class": "correct-answer"}
|
||||
)
|
||||
# Different apps render correct answers differently. For physics the
|
||||
# template uses a div containing the text "Correct answer: ...".
|
||||
if self.app_name == "physics":
|
||||
correct_answers = [
|
||||
t for t in cid_exam_scores_soup.find_all(string=True) if "Correct answer:" in t
|
||||
]
|
||||
else:
|
||||
correct_answers = cid_exam_scores_soup.find_all(
|
||||
"span", {"class": "correct-answer"}
|
||||
)
|
||||
|
||||
assert len(correct_answers) == self.answers_per_question * len(
|
||||
self.generated_questions
|
||||
|
||||
Reference in New Issue
Block a user