import datetime import re import pytest from conftest import outcome_actions TODAY = datetime.date.today().isoformat() @pytest.fixture def instructor(dev_client): dev_client.post("/dev/launch/dev-instructor") return dev_client def record_one_call(client, action="GOOD"): client.post("/instructor/live/next", data={"date": TODAY}) page = client.get(f"/instructor/live?date={TODAY}").get_data(as_text=True) call_id = re.search(r"/instructor/call/(\d+)/outcome", page).group(1) actions = outcome_actions(page) value = actions.get(action) or actions[action.title()] client.post(f"/instructor/call/{call_id}/outcome", data={"action": value}) def test_report_page_renders(instructor): record_one_call(instructor, "GOOD") record_one_call(instructor, "POOR") record_one_call(instructor, "missing") page = instructor.get("/instructor/report").get_data(as_text=True) assert "3 questions asked over 1" in page assert "never called" in page assert 'class="hist"' in page assert "Outcomes by class day" in page def test_report_sorting(instructor): record_one_call(instructor, "GOOD") page = instructor.get("/instructor/report?sort=answered").get_data(as_text=True) rows = re.findall(r"([A-Z][a-z]+ [A-Za-z]+)", page) # The called student sorts first under the answered sort. called = re.search(r"never called", page) assert rows, "expected student rows" assert called def test_csv_exports(instructor): record_one_call(instructor, "GOOD") resp = instructor.get("/instructor/export/students.csv") assert resp.mimetype == "text/csv" lines = resp.get_data(as_text=True).strip().splitlines() assert lines[0].startswith("name,") assert len(lines) == 9 # header + 8 students resp = instructor.get("/instructor/export/calls.csv") lines = resp.get_data(as_text=True).strip().splitlines() assert len(lines) == 2 assert ",answered,GOOD," in lines[1] resp = instructor.get("/instructor/export/optouts.csv") assert resp.get_data(as_text=True).strip().splitlines()[0].startswith("date,") def test_report_requires_instructor(dev_client): dev_client.post("/dev/launch/dev-instructor") dev_client.post("/dev/launch/dev-student-1") assert dev_client.get("/instructor/report").status_code == 403 assert dev_client.get("/instructor/export/calls.csv").status_code == 403 def test_pronouns_flow_to_pages(instructor): # Dev roster carries pronouns; they should reach the print list. instructor.post(f"/instructor/day/{TODAY}/generate", data={"n": "30"}) page = instructor.get(f"/instructor/day/{TODAY}/print").get_data(as_text=True) assert "she/her" in page or "he/him" in page instructor.post("/dev/launch/dev-student-1") page = instructor.get("/me").get_data(as_text=True) assert "Ada Lovelace (she/her)" in page assert "drawn from Canvas" in page