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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user