Bug fixes
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user