[2026-06-25T20:42:30.285Z] === Crossword smoke test (finalize) === [2026-06-25T20:42:30.289Z] Base URL: http://localhost:3001 [2026-06-25T20:42:30.289Z] [2026-06-25T20:42:30.289Z] --- 1. Teacher login --- [2026-06-25T20:42:30.540Z] status=200 [2026-06-25T20:42:30.540Z] teacher user: id=3 email=teacher@school.com role=teacher [2026-06-25T20:42:30.540Z] teacher token (truncated): eyJhbGciOiJIUzI1NiIs... [2026-06-25T20:42:30.540Z] [2026-06-25T20:42:30.540Z] --- 2. POST /api/crossword/games (5 clues) --- [2026-06-25T20:42:30.555Z] status=201 [2026-06-25T20:42:30.555Z] response (truncated to 1500 chars): [2026-06-25T20:42:30.555Z] {"id":7,"uid":"4b2d6007-ab7e-40c2-a1c2-b53313be384e","title":"Smoke Test Crossword","description":"Auto-created by smoke-crossword-finalize.mjs","subject_id":null,"class_id":null,"created_by":3,"status":"ready","grid_layout":"{\"rows\":10,\"cols\":6,\"cells\":[{\"row\":0,\"col\":0,\"letter\":\"M\",\"clue_number\":1,\"is_block\":false},{\"row\":0,\"col\":5,\"letter\":\"S\",\"clue_number\":2,\"is_block\":false},{\"row\":1,\"col\":0,\"letter\":\"O\",\"clue_number\":null,\"is_block\":false},{\"row\":1,\"col\":5,\"letter\":\"U\",\"clue_number\":null,\"is_block\":false},{\"row\":2,\"col\":0,\"letter\":\"O\",\"clue_number\":null,\"is_block\":false},{\"row\":2,\"col\":5,\"letter\":\"N\",\"clue_number\":null,\"is_block\":false},{\"row\":3,\"col\":0,\"letter\":\"N\",\"clue_number\":null,\"is_block\":false},{\"row\":5,\"col\":0,\"letter\":\"S\",\"clue_number\":3,\"is_block\":false},{\"row\":5,\"col\":1,\"letter\":\"T\",\"clue_number\":null,\"is_block\":false},{\"row\":5,\"col\":2,\"letter\":\"A\",\"clue_number\":null,\"is_block\":false},{\"row\":5,\"col\":3,\"letter\":\"R\",\"clue_number\":null,\"is_block\":false},{\"row\":7,\"col\":0,\"letter\":\"C\",\"clue_number\":4,\"is_block\":false},{\"row\":7,\"col\":1,\"letter\":\"A\",\"clue_number\":null,\"is_block\":false},{\"row\":7,\"col\":2,\"letter\":\"T\",\"clue_number\":null,\"is_block\":false},{\"row\":9,\"col\":0,\"letter\":\"D\",\"clue_number\":5,\"is_block\":false},{\"row\":9,\"col\":1,\"letter\":\"O\",\"clue_number\":null,\"is_block [2026-06-25T20:42:30.555Z] [2026-06-25T20:42:30.555Z] game.id = 7 [2026-06-25T20:42:30.555Z] game.title = Smoke Test Crossword [2026-06-25T20:42:30.555Z] game.word_count = 5 [2026-06-25T20:42:30.555Z] game.difficulty = medium [2026-06-25T20:42:30.555Z] game.status = ready [2026-06-25T20:42:30.555Z] game.grid_layout present? YES (1790 chars) [2026-06-25T20:42:30.555Z] parsed grid: rows=10 cols=6 cells=17 placements=5 [2026-06-25T20:42:30.555Z] [2026-06-25T20:42:30.555Z] --- 3. POST /api/crossword/games/:id/publish --- [2026-06-25T20:42:30.558Z] status=200 [2026-06-25T20:42:30.558Z] response (truncated to 500 chars): [2026-06-25T20:42:30.558Z] {"id":7,"uid":"4b2d6007-ab7e-40c2-a1c2-b53313be384e","title":"Smoke Test Crossword","description":"Auto-created by smoke-crossword-finalize.mjs","subject_id":null,"class_id":null,"created_by":3,"status":"ready","grid_layout":"{\"rows\":10,\"cols\":6,\"cells\":[{\"row\":0,\"col\":0,\"letter\":\"M\",\"clue_number\":1,\"is_block\":false},{\"row\":0,\"col\":5,\"letter\":\"S\",\"clue_number\":2,\"is_block\":false},{\"row\":1,\"col\":0,\"letter\":\"O\",\"clue_number\":null,\"is_block\":false},{\"row\" [2026-06-25T20:42:30.558Z] is_published = 1 (expected 1) [2026-06-25T20:42:30.558Z] [2026-06-25T20:42:30.558Z] --- 4. Student login --- [2026-06-25T20:42:30.660Z] status=200 [2026-06-25T20:42:30.661Z] student user: id=6 email=student@school.com role=student [2026-06-25T20:42:30.661Z] [2026-06-25T20:42:30.661Z] --- 5. POST /api/crossword/sessions (start) --- [2026-06-25T20:42:30.675Z] status=201 [2026-06-25T20:42:30.675Z] response (truncated to 500 chars): [2026-06-25T20:42:30.675Z] {"id":5,"uid":"d6a8619f-d3d1-4f81-93c2-f17f6ffbf0d3","game_id":7,"student_id":6,"current_state":"{}","correct_count":0,"total_count":5,"time_taken_seconds":null,"completed_at":null,"points_earned":0,"created_at":"2026-06-25 20:42:30","updated_at":"2026-06-25 20:42:30","last_synced_at":null,"sync_status":"pending","is_deleted":0} [2026-06-25T20:42:30.675Z] session.id = 5 game_id = 7 student_id = 6 total_count = 5 [2026-06-25T20:42:30.675Z] [2026-06-25T20:42:30.675Z] --- 6. PUT /api/crossword/sessions/:id (save full state) --- [2026-06-25T20:42:30.675Z] userState size: 17 cells [2026-06-25T20:42:30.684Z] status=200 [2026-06-25T20:42:30.684Z] response (truncated to 500 chars): [2026-06-25T20:42:30.684Z] {"id":5,"uid":"d6a8619f-d3d1-4f81-93c2-f17f6ffbf0d3","game_id":7,"student_id":6,"current_state":"{\"0,0\":\"M\",\"1,0\":\"O\",\"2,0\":\"O\",\"3,0\":\"N\",\"5,0\":\"S\",\"5,1\":\"T\",\"5,2\":\"A\",\"5,3\":\"R\",\"7,0\":\"C\",\"7,1\":\"A\",\"7,2\":\"T\",\"9,0\":\"D\",\"9,1\":\"O\",\"9,2\":\"G\",\"0,5\":\"S\",\"1,5\":\"U\",\"2,5\":\"N\"}","correct_count":0,"total_count":5,"time_taken_seconds":null,"completed_at":null,"points_earned":0,"created_at":"2026-06-25 20:42:30","updated_at":"2026-06-25 20:4 [2026-06-25T20:42:30.684Z] [2026-06-25T20:42:30.684Z] --- 7. POST /api/crossword/sessions/:id/submit --- [2026-06-25T20:42:30.692Z] status=200 [2026-06-25T20:42:30.692Z] response (truncated to 800 chars): [2026-06-25T20:42:30.692Z] {"id":5,"uid":"d6a8619f-d3d1-4f81-93c2-f17f6ffbf0d3","game_id":7,"student_id":6,"current_state":"{\"0,0\":\"M\",\"1,0\":\"O\",\"2,0\":\"O\",\"3,0\":\"N\",\"5,0\":\"S\",\"5,1\":\"T\",\"5,2\":\"A\",\"5,3\":\"R\",\"7,0\":\"C\",\"7,1\":\"A\",\"7,2\":\"T\",\"9,0\":\"D\",\"9,1\":\"O\",\"9,2\":\"G\",\"0,5\":\"S\",\"1,5\":\"U\",\"2,5\":\"N\"}","correct_count":5,"total_count":5,"time_taken_seconds":0,"completed_at":"2026-06-25 20:42:30","points_earned":50,"created_at":"2026-06-25 20:42:30","updated_at":"2026-06-25 20:42:30","last_synced_at":null,"sync_status":"pending","is_deleted":0,"is_complete":true,"per_clue":[{"clue_id":3,"clue_number":1,"direction":"down","user_answer":"MOON","isCorrect":true},{"clue_id":4,"clue_number":3,"direction":"across","user_answer":"STAR","isCorrect":true},{"clue_id": [2026-06-25T20:42:30.692Z] [2026-06-25T20:42:30.692Z] is_complete = true [2026-06-25T20:42:30.692Z] correct_count = 5 / total_count = 5 [2026-06-25T20:42:30.692Z] points_earned = 50 [2026-06-25T20:42:30.693Z] completed_at = 2026-06-25 20:42:30 [2026-06-25T20:42:30.693Z] time_taken_seconds = 0 [2026-06-25T20:42:30.693Z] [2026-06-25T20:42:30.693Z] --- 8. GET /api/crossword/leaderboard (sanity) --- [2026-06-25T20:42:30.700Z] status=200 [2026-06-25T20:42:30.700Z] response (truncated to 500 chars): [2026-06-25T20:42:30.700Z] [{"student_id":6,"first_name":"Nyasha","last_name":"Moyo","total_points":202,"sessions_completed":5,"perfect_completions":4}] [2026-06-25T20:42:30.700Z] [2026-06-25T20:42:30.700Z] === SMOKE TEST PASSED === [2026-06-25T20:42:30.700Z] summary: {"game_id":7,"session_id":5,"is_complete":true,"correct_count":5,"total_count":5,"points_earned":50,"completed_at":"2026-06-25 20:42:30"}