import urllib.request, urllib.error, json, http.cookiejar
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
print("=" * 60)
print(" School Meal Admin Test Report")
print("=" * 60)
# Test 1: Admin Login Page
print("\n1. Admin Login Page")
try:
r = opener.open("http://127.0.0.1:8000/admin/login/", timeout=5)
body = r.read().decode("utf-8", errors="replace")
print(" Status: %d OK" % r.status)
print(" Size: %d bytes" % len(body))
print(" Has login form: %s" % ("id_username" in body))
print(" Has password field: %s" % ("id_password" in body))
print(" Has CSRF: %s" % ("csrfmiddlewaretoken" in body))
title_start = body.find("
") + 7
title_end = body.find("")
print(" Title: %s" % body[title_start:title_end])
except Exception as e:
print(" FAIL: %s" % e)
# Test 2: Admin Login
print("\n2. Admin Login")
try:
r = opener.open("http://127.0.0.1:8000/admin/login/", timeout=5)
body = r.read().decode("utf-8", errors="replace")
csrf = body.split('csrfmiddlewaretoken" value="')[1].split('"')[0]
import urllib.parse
data = urllib.parse.urlencode({"csrfmiddlewaretoken": csrf, "username": "admin", "password": "admin123", "next": "/admin/"}).encode()
req = urllib.request.Request("http://127.0.0.1:8000/admin/login/", data=data)
req.add_header("Referer", "http://127.0.0.1:8000/admin/login/")
r2 = opener.open(req, timeout=5)
print(" Login OK: %d" % r2.status)
except urllib.error.HTTPError as e:
if e.code == 302:
print(" Login OK: 302 redirect to %s" % e.headers.get("Location", "unknown"))
else:
print(" FAIL: %d" % e.code)
except Exception as e:
print(" FAIL: %s" % e)
# Test 3: Admin Dashboard
print("\n3. Admin Dashboard")
try:
r = opener.open("http://127.0.0.1:8000/admin/", timeout=5)
body = r.read().decode("utf-8", errors="replace")
print(" Status: %d OK" % r.status)
print(" Size: %d bytes" % len(body))
print(" Has Dish model: %s" % ("Dish" in body or "meals" in body))
print(" Has User model: %s" % ("User" in body or "auth" in body))
print(" Has sidebar: %s" % ("sidebar" in body))
except Exception as e:
print(" FAIL: %s" % e)
# Test 4: Admin Dishes List
print("\n4. Admin Dishes List")
try:
r = opener.open("http://127.0.0.1:8000/admin/meals/dish/", timeout=5)
body = r.read().decode("utf-8", errors="replace")
print(" Status: %d OK" % r.status)
print(" Size: %d bytes" % len(body))
print(" Has result table: %s" % ("result_list" in body))
except Exception as e:
print(" FAIL: %s" % e)
# Test 5: API Dishes
print("\n5. API Dishes")
try:
r = opener.open("http://127.0.0.1:8000/api/dishes/", timeout=5)
data = json.loads(r.read())
print(" Status: %d OK" % r.status)
print(" Dish count: %d" % len(data))
if data:
print(" First dish: %s (%s)" % (data[0]["name"], data[0]["dish_type"]))
except Exception as e:
print(" FAIL: %s" % e)
# Test 6: Menu Generation
print("\n6. Menu Generation")
try:
req = urllib.request.Request("http://127.0.0.1:8000/api/menu/generate/",
data=json.dumps({"selections": [], "auto_all": True}).encode(),
headers={"Content-Type": "application/json"})
r = opener.open(req, timeout=10)
menu = json.loads(r.read())
print(" Status: %d OK" % r.status)
print(" Menu A days: %d" % len(menu["a"]["week"]))
print(" Menu B days: %d" % len(menu["b"]["week"]))
day_a = menu["a"]["week"][0]
print(" A Mon: %d meats %d vegs soup" % (len(day_a["meats"]), len(day_a["vegs"])))
except Exception as e:
print(" FAIL: %s" % e)
# Test 7: Frontend
print("\n7. Frontend")
try:
r = opener.open("http://127.0.0.1:8000/", timeout=5)
body = r.read().decode("utf-8", errors="replace")
print(" Status: %d OK" % r.status)
print(" Size: %d bytes" % len(body))
print(" Has React root: %s" % ("root" in body))
except Exception as e:
print(" FAIL: %s" % e)
# Test 8: Static Files
print("\n8. Static Files")
for path in ["/static/admin/css/base.css", "/static/jazzmin/css/main.css"]:
try:
r = opener.open("http://127.0.0.1:8000%s" % path, timeout=5)
print(" %s: %d OK (%d bytes)" % (path, r.status, len(r.read())))
except Exception as e:
print(" %s: FAIL (%s)" % (path, e))
print("\n" + "=" * 60)
print(" All tests completed")
print("=" * 60)