Bug fixes

This commit is contained in:
2026-06-09 19:12:19 -07:00
parent 274ae3fb07
commit 8650ebe5b2
12 changed files with 1075 additions and 383 deletions

View File

@@ -3,7 +3,7 @@ import json
from sqlmodel import SQLModel, create_engine, Session
from pirats import cards
from pirats import crud
from pirats.models import Game, Player, Obstacle, Challenge
from pirats.models import Game, Player, Obstacle
# In-memory database for testing
@pytest.fixture(name="session")
@@ -137,9 +137,6 @@ def test_scene_start_and_challenges(session):
session.add(p2)
session.commit()
# Create challenge
chal = crud.create_challenge(session, game.id, "Challenge 1", "Sneak past", [obs.id])
# Play card: 10D (value 10) vs Obstacle. Let's make sure obstacle value is less than 10.
# Set obstacle value to 5
obs.current_value = 5
@@ -151,7 +148,7 @@ def test_scene_start_and_challenges(session):
orig_is_red = cards.parse_card(obs.original_card)["color"] == "red"
deck_before = len(crud.get_game_deck(game))
ok, msg, res = crud.play_card_on_obstacle(session, p2.id, obs.id, "10D", chal.id)
ok, msg, res = crud.play_card_on_obstacle(session, p2.id, obs.id, "10D")
assert ok
assert res["success"]
assert "Success" in res["details"]
@@ -190,10 +187,8 @@ def test_secret_technique_auto_success(session):
session.add(obs)
session.commit()
chal = crud.create_challenge(session, game.id, "C1", "D1", [obs.id])
# Play Jack. J is a face card -> auto success!
ok, msg, res = crud.play_card_on_obstacle(session, p1.id, obs.id, "JS", chal.id)
ok, msg, res = crud.play_card_on_obstacle(session, p1.id, obs.id, "JS")
assert ok
assert res["success"]
assert res["is_technique"]
@@ -225,10 +220,8 @@ def test_joker_play(session):
session.add(obs)
session.commit()
chal = crud.create_challenge(session, game.id, "C1", "D1", [obs.id])
# Play Joker
ok, msg, res = crud.play_card_on_obstacle(session, p1.id, obs.id, "Joker1", chal.id)
ok, msg, res = crud.play_card_on_obstacle(session, p1.id, obs.id, "Joker1")
assert ok
assert res["is_joker"]
@@ -236,3 +229,92 @@ def test_joker_play(session):
session.refresh(game)
assert len(game.obstacles) == 1
assert game.obstacles[0].original_card != "10C"
def test_obstacle_success_count(session):
game = crud.create_game(session)
obs = Obstacle(
game_id=game.id,
original_card="10C",
suit="C",
title="Knights",
current_value=10,
played_cards=json.dumps([
{"card": "9H", "player_id": "p1", "player_name": "P1", "success": True},
{"card": "8S", "player_id": "p2", "player_name": "P2", "success": False},
{"card": "AH", "player_id": "p1", "player_name": "P1", "success": True}
])
)
session.add(obs)
session.commit()
assert obs.success_count == 2
def test_non_deep_player_treatment(session):
game = crud.create_game(session)
p1 = crud.add_player(session, game.id, "Captain Barnaby")
p2 = crud.add_player(session, game.id, "Crewmate Pip")
# p1 is deep, p2 is None (non-deep)
p1.role = "deep"
p2.role = None
session.add_all([p1, p2])
session.commit()
# Check captain status: p2 should be captain because p2 is the only non-deep player
assert crud.is_player_captain(p2, game.players)
assert not crud.is_player_captain(p1, game.players)
# Check hand size: p2 should participate in hand size calculations and get Captain privileges (+1)
assert crud.calculate_max_hand_size(p2, game.players) == 4
def test_set_role_endpoint():
from fastapi.testclient import TestClient
from sqlalchemy.pool import StaticPool
from sqlmodel import SQLModel, create_engine, Session
from pirats.main import app
from pirats import crud
# Setup in-memory DB with StaticPool to share connection across threads
engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
SQLModel.metadata.create_all(engine)
session = Session(engine)
# Create game and player
game = crud.create_game(session)
player = crud.add_player(session, game.id, "TestPirate")
game.phase = "scene_setup"
session.add(game)
session.commit()
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
client = TestClient(app)
try:
response = client.post(f"/game/{game.id}/player/{player.id}/set-role?role=pirat")
assert response.status_code == 200
# The response should contain the rendered scene setup template
assert "Play Pi-Rat" in response.text
# The database should be updated
session.refresh(player)
assert player.role == "pirat"
finally:
app.dependency_overrides.clear()