# retoor import json import requests from tests.api.quizzes._helpers import ( DOCUMENT, JSON, build_published, create_quiz, import_quiz, signup, ) from tests.conftest import BASE_URL def test_importing_requires_auth(app_server, seeded_db): response = requests.post( f"{BASE_URL}/quizzes/import", data={"document": json.dumps(DOCUMENT)}, headers=JSON ) assert response.status_code in (401, 303) def test_importing_creates_a_complete_draft(app_server, seeded_db): session, _ = signup() response = import_quiz(session) assert response.status_code == 200 data = response.json()["data"] assert data["question_count"] == 2 assert data["url"].endswith("/edit") def test_an_imported_quiz_has_its_questions(app_server, seeded_db): session, _ = signup() slug = import_quiz(session).json()["data"]["slug"] payload = session.get(f"{BASE_URL}/quizzes/{slug}/edit", headers=JSON).json() assert [question["kind"] for question in payload["questions"]] == [ "single_choice", "numeric", ] assert payload["quiz"]["total_points"] == 3 def test_an_imported_quiz_carries_its_settings(app_server, seeded_db): session, _ = signup() slug = import_quiz(session).json()["data"]["slug"] quiz = session.get(f"{BASE_URL}/quizzes/{slug}", headers=JSON).json()["quiz"] assert quiz["pass_percent"] == 60 assert quiz["reveal_answers"] is True def test_an_imported_quiz_starts_as_a_draft(app_server, seeded_db): session, _ = signup() slug = import_quiz(session).json()["data"]["slug"] quiz = session.get(f"{BASE_URL}/quizzes/{slug}", headers=JSON).json()["quiz"] assert quiz["status"] == "draft" def test_an_imported_quiz_passes_validation(app_server, seeded_db): session, _ = signup() slug = import_quiz(session).json()["data"]["slug"] payload = session.get(f"{BASE_URL}/quizzes/{slug}/edit", headers=JSON).json() assert payload["validation_errors"] == [] def test_an_imported_quiz_can_be_published(app_server, seeded_db): session, _ = signup() slug = import_quiz(session).json()["data"]["slug"] response = session.post(f"{BASE_URL}/quizzes/{slug}/publish", headers=JSON) assert response.status_code == 200 def test_invalid_json_is_rejected(app_server, seeded_db): session, _ = signup() response = session.post( f"{BASE_URL}/quizzes/import", data={"document": "{not json"}, headers=JSON ) assert response.status_code == 422 def test_a_document_without_questions_is_rejected(app_server, seeded_db): session, _ = signup() response = import_quiz(session, {"title": "Empty document", "questions": []}) assert response.status_code == 422 def test_a_broken_question_is_rejected(app_server, seeded_db): session, _ = signup() document = { "title": "Broken document", "questions": [{"kind": "single_choice", "prompt": "q", "options": [{"label": "only"}]}], } assert import_quiz(session, document).status_code == 422 def test_an_oversized_document_is_rejected(app_server, seeded_db): from devplacepy.config import QUIZ_MAX_QUESTIONS session, _ = signup() question = {"kind": "numeric", "prompt": "q", "numeric_value": 1} document = {"title": "Huge document", "questions": [question] * (QUIZ_MAX_QUESTIONS + 1)} assert import_quiz(session, document).status_code == 422 def test_an_unknown_kind_is_rejected(app_server, seeded_db): session, _ = signup() document = {"title": "Weird document", "questions": [{"kind": "telepathy", "prompt": "q"}]} assert import_quiz(session, document).status_code == 422 def test_the_public_export_omits_the_answer_key(app_server, seeded_db): session, _ = signup() slug = build_published(session, title="Export withhold quiz") payload = requests.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).json() choice = payload["questions"][0] assert all("is_correct" not in option for option in choice["options"]) assert "correct_boolean" not in choice assert "numeric_value" not in payload["questions"][1] def test_the_public_export_keeps_the_prompts(app_server, seeded_db): session, _ = signup() slug = build_published(session, title="Export prompts quiz") payload = requests.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).json() assert payload["questions"][0]["prompt"].startswith("Which journal mode") assert [option["label"] for option in payload["questions"][0]["options"]] == [ "DELETE", "WAL", "MEMORY", ] def test_the_owner_export_carries_the_answer_key(app_server, seeded_db): session, _ = signup() slug = build_published(session, title="Owner export quiz") payload = session.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).json() assert any(option.get("is_correct") for option in payload["questions"][0]["options"]) assert payload["questions"][1]["numeric_value"] == 1024.0 def test_another_member_gets_the_public_export(app_server, seeded_db): owner, _ = signup() slug = build_published(owner, title="Other export quiz") other, _ = signup() payload = other.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).json() assert all("is_correct" not in option for option in payload["questions"][0]["options"]) def test_a_draft_export_is_hidden_from_a_guest(app_server, seeded_db): session, _ = signup() slug = create_quiz(session, "Hidden export quiz") assert requests.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).status_code == 404 def test_an_export_round_trips_back_through_import(app_server, seeded_db): session, _ = signup() slug = build_published(session, title="Round trip quiz") exported = session.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).json() reimported = import_quiz(session, exported) assert reimported.status_code == 200 new_slug = reimported.json()["data"]["slug"] assert session.get(f"{BASE_URL}/quizzes/{new_slug}/export", headers=JSON).json() == exported def test_the_export_carries_the_settings(app_server, seeded_db): session, _ = signup() slug = build_published(session, title="Export settings quiz", pass_percent="75") payload = requests.get(f"{BASE_URL}/quizzes/{slug}/export", headers=JSON).json() assert payload["settings"]["pass_percent"] == 75