72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
import urllib.request
|
|
import urllib.parse
|
|
import http.cookiejar
|
|
import json
|
|
|
|
BASE_URL = "http://127.0.0.1:8001"
|
|
|
|
def test_mc():
|
|
print("--- 1. Submit Multiple Choice Suggestion ---")
|
|
sugg_payload = json.dumps({
|
|
"frage": "Welches Tier ist das Wappentier von Ravenclaw?",
|
|
"antwort": "Adler",
|
|
"tipp": "Viele Muggel denken fälschlicherweise an einen Raben.",
|
|
"name": "Luna Lovegood",
|
|
"question_type": "multiple_choice",
|
|
"falsche_antworten": ["Rabe", "Dachs", "Schlange"]
|
|
}).encode("utf-8")
|
|
|
|
req = urllib.request.Request(f"{BASE_URL}/api/suggestions", data=sugg_payload, headers={"Content-Type": "application/json"})
|
|
res = urllib.request.urlopen(req)
|
|
res_data = json.loads(res.read().decode())
|
|
print("Suggestion result:", res_data)
|
|
assert res_data["success"] is True
|
|
|
|
print("\n--- 2. Admin Login & Approve Question ---")
|
|
cj = http.cookiejar.CookieJar()
|
|
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
|
|
|
|
login_data = urllib.parse.urlencode({"username": "admin", "password": "Alohomora2026!"}).encode()
|
|
opener.open(f"{BASE_URL}/admin/login", data=login_data)
|
|
|
|
admin_page = opener.open(f"{BASE_URL}/admin").read().decode()
|
|
assert "Wappentier von Ravenclaw" in admin_page
|
|
assert "Multiple-Choice" in admin_page
|
|
print("Admin dashboard shows new Multiple-Choice question.")
|
|
|
|
# Find the question ID from DB
|
|
from app.database import SessionLocal
|
|
from app.models import Question
|
|
db = SessionLocal()
|
|
q = db.query(Question).filter(Question.question.like("%Wappentier von Ravenclaw%")).first()
|
|
qid = q.id
|
|
print(f"Found Question ID #{qid}, status={q.status}, type={q.question_type}, options={q.options}")
|
|
assert q.question_type == "multiple_choice"
|
|
parsed_opts = json.loads(q.options)
|
|
assert "Adler" in parsed_opts
|
|
assert "Rabe" in parsed_opts
|
|
db.close()
|
|
|
|
# Approve question
|
|
approve_res = opener.open(f"{BASE_URL}/admin/questions/{qid}/approve", data=b"")
|
|
app_data = json.loads(approve_res.read().decode())
|
|
print("Approve result:", app_data)
|
|
assert app_data["success"] is True
|
|
|
|
print("\n--- 3. Verify Question Served to Client with Shuffled Options ---")
|
|
from app.main import format_question_for_client
|
|
db = SessionLocal()
|
|
q_updated = db.query(Question).filter(Question.id == qid).first()
|
|
client_q = format_question_for_client(q_updated, 16, 16)
|
|
print("Client Question formatted:", client_q)
|
|
assert client_q["question_type"] == "multiple_choice"
|
|
assert len(client_q["options"]) == 4
|
|
assert "Adler" in client_q["options"]
|
|
assert "canonical_answer" not in client_q
|
|
db.close()
|
|
|
|
print("\n✅ Multiple Choice & Free Text integration tests successfully passed!")
|
|
|
|
if __name__ == "__main__":
|
|
test_mc()
|