This commit is contained in:
2026-10-11 03:05:26 +07:00
parent 72ecdc0687
commit b733efe8e2
7 changed files with 96 additions and 6 deletions
@@ -107,6 +107,27 @@ func TestServicesLifecyclePostgres(t *testing.T) {
if !strings.HasPrefix(string(pdf), "%PDF-") {
t.Fatal("invalid QR PDF")
}
for _, format := range []string{"online", "offline"} {
for _, state := range []string{"draft", "pause", "finish"} {
_, err := pool.Exec(ctx, `UPDATE games SET format=$1, status=$2 WHERE id=$3`, format, state, id)
check(err)
for _, viaMCP := range []bool{false, true} {
err := play.AddTeamAction(ctx, teamID, registered.Password, "p", viaMCP)
if !errors.Is(err, gameplay_service.ErrMovesNotAllowed) {
t.Fatalf("%s/%s MCP=%t accepted a move: %v", format, state, viaMCP, err)
}
}
}
}
_, err = pool.Exec(ctx, `UPDATE games SET format='online', status='draft' WHERE id=$1`, id)
check(err)
registered, err = teams.GetTeamByID(ctx, teamID)
check(err)
counts, err := actions.GetActionsCountByTeamIDs(ctx, []int{teamID})
check(err)
if registered.ParticipationStatus != "pending" || counts[teamID] != 0 {
t.Fatal("rejected moves changed participation or progress")
}
check(game.StartGame(ctx, id))
check(play.AddTeamAction(ctx, teamID, registered.Password, "p", true))
registered, err = teams.GetTeamByID(ctx, teamID)
@@ -142,9 +163,15 @@ func TestServicesLifecyclePostgres(t *testing.T) {
}
check(answers.SubmitTeamAnswers(ctx, teamID, registered.Password, []answer_service.Answer{{QuestionCode: "q", Text: "Butler"}}))
check(game.PauseGame(ctx, id))
if err := play.AddTeamAction(ctx, teamID, registered.Password, "p", false); !errors.Is(err, gameplay_service.ErrMovesNotAllowed) {
t.Fatalf("paused move: %v", err)
}
check(answers.SubmitTeamAnswers(ctx, teamID, registered.Password, []answer_service.Answer{{QuestionCode: "q", Text: "Butler"}}))
check(game.PlayGame(ctx, id))
check(game.FinishGame(ctx, id))
if err := play.AddTeamAction(ctx, teamID, registered.Password, "p", true); !errors.Is(err, gameplay_service.ErrMovesNotAllowed) {
t.Fatalf("finished MCP move: %v", err)
}
if err := answers.SubmitTeamAnswers(ctx, teamID, registered.Password, nil); !errors.Is(err, answer_service.ErrGameFinished) {
t.Fatalf("finished answers: %v", err)
}
+10 -5
View File
@@ -19,6 +19,8 @@ var (
ErrTeamNotFound = errors.New("команда не найдена")
// ErrGameNotFound indicates that a game was not found.
ErrGameNotFound = errors.New("игра не найдена")
// ErrMovesNotAllowed indicates that the game is not running.
ErrMovesNotAllowed = errors.New("ходы доступны только во время игры")
)
// GameplayService handles team gameplay operations.
@@ -110,6 +112,14 @@ func (s *GameplayService) AddTeamAction(ctx context.Context, teamID int, passwor
return fmt.Errorf("%w: %v", ErrTeamNotFound, teams_repo.ErrTeamNotFound)
}
game, err := s.gamesRepo.GetGameByID(ctx, team.GameID)
if err != nil {
return mapGameplayError(err)
}
if game.Status != "run" {
return ErrMovesNotAllowed
}
_, err = s.actionsRepo.AddAction(ctx, teamID, actionCode, viaMCP)
if err != nil {
return mapGameplayError(err)
@@ -120,11 +130,6 @@ func (s *GameplayService) AddTeamAction(ctx context.Context, teamID int, passwor
}
}
game, err := s.gamesRepo.GetGameByID(ctx, team.GameID)
if err != nil {
return mapGameplayError(err)
}
actionDetails, err := s.actionsRepo.GetActionsByTeamID(ctx, teamID)
if err != nil {
return mapGameplayError(err)