Fixes and updates
This commit is contained in:
@@ -318,3 +318,190 @@ def test_set_role_endpoint():
|
||||
assert player.role == "pirat"
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
def test_game_creation_with_crew_name(session):
|
||||
game = crud.create_game(session, crew_name="The Black Gats")
|
||||
assert game.id is not None
|
||||
assert game.crew_name == "The Black Gats"
|
||||
assert game.phase == "lobby"
|
||||
|
||||
def test_create_game_endpoint():
|
||||
from fastapi.testclient import TestClient
|
||||
from sqlalchemy.pool import StaticPool
|
||||
from sqlmodel import SQLModel, create_engine, Session, select
|
||||
from pirats.main import app
|
||||
from pirats import crud
|
||||
|
||||
# Setup in-memory DB
|
||||
engine = create_engine(
|
||||
"sqlite://",
|
||||
connect_args={"check_same_thread": False},
|
||||
poolclass=StaticPool,
|
||||
)
|
||||
SQLModel.metadata.create_all(engine)
|
||||
session = Session(engine)
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
# Verify the database has the game with the crew name
|
||||
from pirats.models import Game
|
||||
games = session.exec(select(Game)).all()
|
||||
assert len(games) == 1
|
||||
assert games[0].crew_name == "The Math Mutineers"
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
def test_transition_to_deep_upkeep(session):
|
||||
game = crud.create_game(session)
|
||||
p1 = crud.add_player(session, game.id, "P1")
|
||||
p2 = crud.add_player(session, game.id, "P2")
|
||||
|
||||
p1.previous_role = "deep"
|
||||
p2.previous_role = "pirat"
|
||||
session.add_all([p1, p2])
|
||||
session.commit()
|
||||
|
||||
crud.transition_to_deep_upkeep(session, game.id)
|
||||
session.refresh(game)
|
||||
assert game.phase == "deep_upkeep"
|
||||
|
||||
def test_confirm_deep_refresh(session):
|
||||
game = crud.create_game(session)
|
||||
p1 = crud.add_player(session, game.id, "P1")
|
||||
p1.previous_role = "deep"
|
||||
p1.role = "deep"
|
||||
p1.rank = 2
|
||||
# Hand has 3 cards: ['2C', '3C', '4C']
|
||||
p1.hand_cards = json.dumps(["2C", "3C", "4C"])
|
||||
|
||||
# Rest of deck has some known cards
|
||||
game.deck_cards = json.dumps(["5H", "6H", "7H", "8H"])
|
||||
session.add_all([game, p1])
|
||||
session.commit()
|
||||
|
||||
# Stub shuffle to keep card order deterministic
|
||||
import random
|
||||
orig_shuffle = random.shuffle
|
||||
random.shuffle = lambda x: None
|
||||
|
||||
try:
|
||||
# Discard 2C and 3C
|
||||
crud.confirm_deep_refresh(session, p1.id, ["2C", "3C"])
|
||||
finally:
|
||||
random.shuffle = orig_shuffle
|
||||
|
||||
session.refresh(p1)
|
||||
session.refresh(game)
|
||||
|
||||
# Hand should not contain 2C and 3C, and should have drawn 5H and 6H
|
||||
hand = json.loads(p1.hand_cards)
|
||||
assert "2C" not in hand
|
||||
assert "3C" not in hand
|
||||
assert "4C" in hand
|
||||
assert "5H" in hand
|
||||
assert "6H" in hand
|
||||
assert len(hand) == 3
|
||||
|
||||
# Discarded cards should be at the end of the deck
|
||||
deck = json.loads(game.deck_cards)
|
||||
assert "2C" in deck
|
||||
assert "3C" in deck
|
||||
assert deck == ["7H", "8H", "2C", "3C"]
|
||||
|
||||
# Since P1 was the only resting deep player and is now ready, phase should have advanced to scene_setup!
|
||||
assert game.phase == "scene_setup"
|
||||
|
||||
def test_submit_vote_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
|
||||
engine = create_engine(
|
||||
"sqlite://",
|
||||
connect_args={"check_same_thread": False},
|
||||
poolclass=StaticPool,
|
||||
)
|
||||
SQLModel.metadata.create_all(engine)
|
||||
session = Session(engine)
|
||||
|
||||
# Create game and players
|
||||
game = crud.create_game(session)
|
||||
p1 = crud.add_player(session, game.id, "P1")
|
||||
p2 = crud.add_player(session, game.id, "P2")
|
||||
game.phase = "between_scenes"
|
||||
session.add(game)
|
||||
session.commit()
|
||||
|
||||
def get_session_override():
|
||||
yield session
|
||||
|
||||
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/{p1.id}/submit-vote", data={"nominated_id": p2.id})
|
||||
# TestClient follows redirects by default
|
||||
assert response.status_code == 200
|
||||
assert "Vote submitted" in response.text
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
def test_single_eligible_deep_player(session):
|
||||
game = crud.create_game(session)
|
||||
p1 = crud.add_player(session, game.id, "P1")
|
||||
p2 = crud.add_player(session, game.id, "P2")
|
||||
p3 = crud.add_player(session, game.id, "P3")
|
||||
|
||||
# Scene number > 1
|
||||
game.current_scene_number = 2
|
||||
|
||||
# 2 players were Deep in the last scene, 1 was Pi-Rat
|
||||
p1.previous_role = "deep"
|
||||
p2.previous_role = "deep"
|
||||
p3.previous_role = "pirat"
|
||||
|
||||
# Set their current roles to something invalid first
|
||||
# P3 is the only one eligible to be Deep, but plays Pi-Rat. This should fail!
|
||||
p1.role = "pirat"
|
||||
p2.role = "pirat"
|
||||
p3.role = "pirat"
|
||||
|
||||
session.add_all([game, p1, p2, p3])
|
||||
session.commit()
|
||||
|
||||
success, msg = crud.confirm_scene_setup(session, game.id)
|
||||
assert not success
|
||||
assert "is the only player eligible to play the Deep" in msg
|
||||
|
||||
# Now set P3 to play Deep. This should succeed!
|
||||
p3.role = "deep"
|
||||
session.add(p3)
|
||||
session.commit()
|
||||
|
||||
success, msg = crud.confirm_scene_setup(session, game.id)
|
||||
assert success
|
||||
|
||||
|
||||
Reference in New Issue
Block a user