Switch to Svelte

This commit is contained in:
2026-06-11 14:39:41 -07:00
parent 29860061c4
commit 58a7e4d4f1
74 changed files with 7144 additions and 2379 deletions

View File

@@ -293,26 +293,14 @@ def test_set_role_endpoint():
def get_session_override():
yield session
# Dynamically find the get_session function object used by the route
get_session_func = None
for route in app.routes:
if route.path == "/game/{game_id}/player/{player_id}/set-role":
for dep in route.dependant.dependencies:
if dep.name == "db":
get_session_func = dep.call
break
if get_session_func:
break
assert get_session_func is not None, "Could not find get_session dependency in route"
app.dependency_overrides[get_session_func] = get_session_override
from pirats.database import get_session
app.dependency_overrides[get_session] = get_session_override
client = TestClient(app)
try:
response = client.post(f"/game/{game.id}/player/{player.id}/set-role?role=pirat")
response = client.post(f"/api/game/{game.id}/player/{player.id}/set-role", data={"role": "pirat"})
assert response.status_code == 200
# The response should contain the rendered scene setup template
assert "Play Pi-Rat" in response.text
assert response.json()["status"] == "ok"
# The database should be updated
session.refresh(player)
assert player.role == "pirat"
@@ -344,24 +332,13 @@ def test_create_game_endpoint():
def get_session_override():
yield session
# Dynamically find the get_session function object used by the route
get_session_func = None
for route in app.routes:
if route.path == "/game/create":
for dep in route.dependant.dependencies:
if dep.name == "db":
get_session_func = dep.call
break
if get_session_func:
break
assert get_session_func is not None, "Could not find get_session dependency in route"
app.dependency_overrides[get_session_func] = get_session_override
from pirats.database import get_session
app.dependency_overrides[get_session] = get_session_override
client = TestClient(app, base_url="http://testserver")
try:
response = client.post("/game/create", data={"crew_name": "The Math Mutineers"})
assert response.status_code in [200, 303] # starlette redirects can be 303
response = client.post("/api/game", data={"crew_name": "The Math Mutineers"})
assert response.status_code == 200
# Verify the database has the game with the crew name
from pirats.models import Game
@@ -463,10 +440,9 @@ def test_submit_vote_endpoint():
client = TestClient(app)
try:
response = client.post(f"/game/{game.id}/player/{p1.id}/submit-vote", data={"nominated_id": p2.id})
# TestClient follows redirects by default
response = client.post(f"/api/game/{game.id}/player/{p1.id}/submit-vote", data={"nominated_id": p2.id})
assert response.status_code == 200
assert "Vote submitted" in response.text
assert response.json()["status"] == "ok"
finally:
app.dependency_overrides.clear()
@@ -505,3 +481,111 @@ def test_single_eligible_deep_player(session):
success, msg = crud.confirm_scene_setup(session, game.id)
assert success
def test_player_death_toggle(session):
game = crud.create_game(session)
player = crud.add_player(session, game.id, "DeadRat")
assert not player.is_dead
assert not player.completed_personal_3
# Toggle objective 3
crud.toggle_objective(session, game.id, player.id, "personal_3", True)
session.refresh(player)
assert player.is_dead
assert player.completed_personal_3
# Toggle off
crud.toggle_objective(session, game.id, player.id, "personal_3", False)
session.refresh(player)
assert not player.is_dead
assert not player.completed_personal_3
def test_become_ghost_flow(session):
game = crud.create_game(session)
player = crud.add_player(session, game.id, "DeadRat")
player.is_dead = True
session.add(player)
session.commit()
from fastapi.testclient import TestClient
from pirats.main import app
from pirats.database import get_session
def get_session_override():
yield session
app.dependency_overrides[get_session] = get_session_override
client = TestClient(app)
try:
response = client.post(f"/api/game/{game.id}/player/{player.id}/become-ghost")
assert response.status_code == 200
session.refresh(player)
assert player.is_ghost
assert not player.is_dead
finally:
app.dependency_overrides.clear()
def test_roll_new_character(session):
game = crud.create_game(session)
p1 = crud.add_player(session, game.id, "P1")
p2 = crud.add_player(session, game.id, "P2") # helper player for delegation target
p1.is_dead = True
p1.rank = 3
p1.hand_cards = json.dumps(["2C", "3D", "4H"])
p1.completed_personal_1 = True
p1.completed_personal_2 = True
p1.completed_personal_3 = True
session.add_all([p1, p2])
session.commit()
crud.roll_new_character(
session,
game.id,
p1.id,
avatar_look="Shiny eyes",
avatar_smell="Spiced Rum",
first_words="No fear!",
good_at_math="Yes"
)
session.refresh(p1)
session.refresh(game)
# Verify properties
assert not p1.is_dead
assert not p1.is_ghost
assert not p1.completed_personal_1
assert not p1.completed_personal_2
assert not p1.completed_personal_3
assert p1.avatar_look == "Shiny eyes"
assert p1.avatar_smell == "Spiced Rum"
assert p1.first_words == "No fear!"
assert p1.good_at_math == "Yes"
# Verify rank randomized between 1-3
assert p1.rank in [1, 2, 3]
# Verify name is "Recruit Spiced Rum"
assert p1.name == "Recruit Spiced Rum"
# Verify techniques auto-assigned
assert p1.tech_jack != ""
assert p1.tech_queen != ""
assert p1.tech_king != ""
# Verify delegated targets exist (p2 is the only other player)
assert p1.other_like_from_player_id == p2.id
assert p1.other_hate_from_player_id == p2.id
# Verify hand was refreshed up to new max hand size
hand = json.loads(p1.hand_cards)
assert len(hand) > 0
# Old cards returned to deck
deck = json.loads(game.deck_cards)
assert "2C" in deck or "2C" in hand
assert "3D" in deck or "3D" in hand
assert "4H" in deck or "4H" in hand