import json import pytest from models.category import Category, CategoryWord def _seed(db_session): cat = Category(name="animals") db_session.add(cat) db_session.flush() for w in ["TIGER", "LION", "BEAR", "WOLF", "EAGLE", "HAWK", "DEER", "FROG"]: db_session.add(CategoryWord(category_id=cat.id, word=w)) db_session.commit() return cat @pytest.fixture def seeded_db(db_session): return _seed(db_session) async def test_get_categories(http_server_client, seeded_db): resp = await http_server_client.fetch("/api/categories") assert resp.code == 200 data = json.loads(resp.body) assert len(data) >= 1 assert data[0]["name"] == "animals" async def test_create_new_game(http_server_client, seeded_db): body = json.dumps({"category_id": seeded_db.id, "board_size": 10}) resp = await http_server_client.fetch( "/api/game/new", method="POST", body=body, headers={"Content-Type": "application/json"}, ) assert resp.code == 200 data = json.loads(resp.body) assert data["board_size"] == 10 assert data["status"] == "in_progress" assert len(data["grid"]) == 10 assert len(data["words"]) >= 1 # Words should NOT include position info for w in data["words"]: assert "start_row" not in w assert "direction" not in w async def test_get_game_state(http_server_client, seeded_db): body = json.dumps({"category_id": seeded_db.id}) create_resp = await http_server_client.fetch( "/api/game/new", method="POST", body=body, headers={"Content-Type": "application/json"}, ) game_id = json.loads(create_resp.body)["id"] resp = await http_server_client.fetch(f"/api/game/{game_id}") assert resp.code == 200 data = json.loads(resp.body) assert data["id"] == game_id async def test_text_guess_correct(http_server_client, seeded_db): body = json.dumps({"category_id": seeded_db.id}) create_resp = await http_server_client.fetch( "/api/game/new", method="POST", body=body, headers={"Content-Type": "application/json"}, ) game_data = json.loads(create_resp.body) game_id = game_data["id"] # Pick a word that was placed target_word = game_data["words"][0]["text"] guess_body = json.dumps({"word": target_word}) resp = await http_server_client.fetch( f"/api/game/{game_id}/guess", method="POST", body=guess_body, headers={"Content-Type": "application/json"}, ) assert resp.code == 200 data = json.loads(resp.body) assert data["correct"] is True assert data["word"] == target_word assert "cells" in data async def test_text_guess_incorrect(http_server_client, seeded_db): body = json.dumps({"category_id": seeded_db.id}) create_resp = await http_server_client.fetch( "/api/game/new", method="POST", body=body, headers={"Content-Type": "application/json"}, ) game_id = json.loads(create_resp.body)["id"] guess_body = json.dumps({"word": "ZZZZNOTAWORD"}) resp = await http_server_client.fetch( f"/api/game/{game_id}/guess", method="POST", body=guess_body, headers={"Content-Type": "application/json"}, ) assert resp.code == 200 data = json.loads(resp.body) assert data["correct"] is False