Player minimum of 3 to start a game or scene

Enforced server-side in lobby/start and confirm_scene_setup via
crud_base.has_min_players; Dev Mode bypasses it so local single-player
testing still works. Lobby and scene-setup UIs show a player-count
message instead of the start button when below the minimum.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 16:16:49 -07:00
parent 5ad9c9db07
commit 121f2f7498
7 changed files with 94 additions and 6 deletions

View File

@@ -1433,3 +1433,76 @@ def test_grant_and_revoke_admin():
assert "admin_key" not in response.json()["game"]
finally:
app.dependency_overrides.clear()
def test_player_minimum(session):
game = crud.create_game(session)
game.dev_mode = False
session.add(game)
session.commit()
crud.add_player(session, game.id, "P1", is_creator=True)
crud.add_player(session, game.id, "P2")
session.refresh(game)
# Two players can't start a scene
assert not crud.has_min_players(game)
ok, msg = crud.confirm_scene_setup(session, game.id)
assert not ok
assert "at least 3" in msg
# Dev Mode bypasses the minimum for testing
game.dev_mode = True
session.add(game)
session.commit()
assert crud.has_min_players(game)
# Three players is enough regardless
game.dev_mode = False
session.add(game)
session.commit()
crud.add_player(session, game.id, "P3")
session.refresh(game)
assert crud.has_min_players(game)
def test_lobby_start_requires_min_players():
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
engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
SQLModel.metadata.create_all(engine)
session = Session(engine)
game = crud.create_game(session)
game.dev_mode = False
session.add(game)
session.commit()
crud.add_player(session, game.id, "P1", is_creator=True)
crud.add_player(session, game.id, "P2")
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"/api/game/{game.id}/lobby/start")
assert response.status_code == 400
assert "at least 3" in response.json()["error"]
session.refresh(game)
assert game.phase == "lobby"
crud.add_player(session, game.id, "P3")
response = client.post(f"/api/game/{game.id}/lobby/start")
assert response.status_code == 200
session.refresh(game)
assert game.phase == "character_creation"
finally:
app.dependency_overrides.clear()