diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-21 10:29:21 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-21 10:29:21 +0900 |
| commit | e8db174d3e464a5764a9f4bfd82172261bd50519 (patch) | |
| tree | 68cb8f0713fcc1f960a650d879232cb4c20ca6cd /backend/game/service_test.go | |
| parent | 1be106ac53caa019a8912af932a43570fa8c052d (diff) | |
| download | phperkaigi-2026-albatross-e8db174d3e464a5764a9f4bfd82172261bd50519.tar.gz phperkaigi-2026-albatross-e8db174d3e464a5764a9f4bfd82172261bd50519.tar.zst phperkaigi-2026-albatross-e8db174d3e464a5764a9f4bfd82172261bd50519.zip | |
refactor(api): separate business logic into game, tournament, session packages
Extract business logic from api/handler.go into dedicated service packages:
- session: context helpers (resolves admin → api import dependency)
- game: game state, code submission, ranking, watch logic
- tournament: bracket construction and seed ordering
- api/convert.go: domain → API type conversion functions
api/handler.go is now a thin adapter that delegates to services and
maps domain errors to HTTP status codes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'backend/game/service_test.go')
| -rw-r--r-- | backend/game/service_test.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/backend/game/service_test.go b/backend/game/service_test.go new file mode 100644 index 0000000..95ceef6 --- /dev/null +++ b/backend/game/service_test.go @@ -0,0 +1,82 @@ +package game + +import ( + "testing" + "time" + + "github.com/jackc/pgx/v5/pgtype" +) + +func TestIsGameRunning(t *testing.T) { + now := time.Now() + tests := []struct { + name string + startedAt pgtype.Timestamp + durationSeconds int32 + want bool + }{ + { + name: "not started", + startedAt: pgtype.Timestamp{Valid: false}, + durationSeconds: 300, + want: false, + }, + { + name: "running", + startedAt: pgtype.Timestamp{Time: now.Add(-1 * time.Minute), Valid: true}, + durationSeconds: 300, + want: true, + }, + { + name: "finished", + startedAt: pgtype.Timestamp{Time: now.Add(-10 * time.Minute), Valid: true}, + durationSeconds: 300, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := IsGameRunning(tt.startedAt, tt.durationSeconds) + if got != tt.want { + t.Errorf("IsGameRunning() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestIsGameFinished(t *testing.T) { + now := time.Now() + tests := []struct { + name string + startedAt pgtype.Timestamp + durationSeconds int32 + want bool + }{ + { + name: "not started", + startedAt: pgtype.Timestamp{Valid: false}, + durationSeconds: 300, + want: false, + }, + { + name: "still running", + startedAt: pgtype.Timestamp{Time: now.Add(-1 * time.Minute), Valid: true}, + durationSeconds: 300, + want: false, + }, + { + name: "finished", + startedAt: pgtype.Timestamp{Time: now.Add(-10 * time.Minute), Valid: true}, + durationSeconds: 300, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := IsGameFinished(tt.startedAt, tt.durationSeconds) + if got != tt.want { + t.Errorf("IsGameFinished() = %v, want %v", got, tt.want) + } + }) + } +} |
