import urllib.request import json API = "http://127.0.0.1:8010" def post(path, body, token=None): headers = {"Content-Type": "application/json"} if token: headers["Authorization"] = f"Bearer {token}" data = json.dumps(body).encode() req = urllib.request.Request(f"{API}{path}", data=data, headers=headers) return json.loads(urllib.request.urlopen(req).read()) def get(path, token=None): headers = {} if token: headers["Authorization"] = f"Bearer {token}" req = urllib.request.Request(f"{API}{path}", headers=headers) return json.loads(urllib.request.urlopen(req).read()) def put(path, body, token=None): headers = {"Content-Type": "application/json"} if token: headers["Authorization"] = f"Bearer {token}" data = json.dumps(body).encode() req = urllib.request.Request(f"{API}{path}", data=data, headers=headers, method="PUT") return json.loads(urllib.request.urlopen(req).read()) # 1. Admin login r = post("/api/auth/login", {"username": "admin", "password": "admin123"}) admin_token = r["access_token"] print("=== Admin login OK ===") # 2. Assign subject to grader subs = get("/api/subjects", admin_token) first_sub = subs["items"][0] put("/api/admin/graders/2", { "username": "grader", "display_name": "", "is_active": True, "subjects": [first_sub] }, admin_token) print(f"Grader assigned subject: {first_sub}") # 3. Grader login r = post("/api/auth/login", {"username": "grader", "password": "grader123"}) grader_token = r["access_token"] print("=== Grader login OK ===") # 4. Check settings (privacy OFF) settings = get("/api/settings") print(f"Settings: grader_can_see_privacy={settings['grader_can_see_privacy']}") # 5. Grader scores (privacy OFF, name/id_card should be null, no search) scores = get("/api/scores?page=1&page_size=5", grader_token) print(f"\n=== Grader scores (privacy OFF) ===") print(f"Total: {scores['total']}") for item in scores["items"]: print(f" student_no={item['student_no']}, name={item['name']}, id_card={item['id_card']}, score={item['score']}") # 6. Grader search by name (should be ignored) scores2 = get("/api/scores?page=1&page_size=5&name=test", grader_token) print(f"\n=== Grader search name=test (should be ignored, same total) ===") print(f"Total: {scores2['total']} (expected: {scores['total']})") # 7. Admin turns ON privacy put("/api/admin/settings", { "system_name": settings["system_name"], "grader_can_see_privacy": True }, admin_token) print("\n=== Admin turned ON privacy ===") # 8. Grader scores (privacy ON, should show full) scores3 = get("/api/scores?page=1&page_size=5", grader_token) print(f"\n=== Grader scores (privacy ON) ===") print(f"Total: {scores3['total']}") for item in scores3["items"]: print(f" student_no={item['student_no']}, name={item['name']}, id_card={item['id_card']}, score={item['score']}") # 9. Grader search by name (should work now) scores4 = get("/api/scores?page=1&page_size=5&name=a", grader_token) print(f"\n=== Grader search name=a (should work now) ===") print(f"Total: {scores4['total']}") # 10. Reset to OFF put("/api/admin/settings", { "system_name": settings["system_name"], "grader_can_see_privacy": False }, admin_token) print("\n=== Reset privacy to OFF ===") # 11. Admin scores (always full) scores5 = get("/api/scores?page=1&page_size=5", admin_token) print(f"\n=== Admin scores (always full) ===") print(f"Total: {scores5['total']}") for item in scores5["items"]: print(f" student_no={item['student_no']}, name={item['name']}, id_card={item['id_card']}, score={item['score']}")