From 071e7cc78d3f13fa782dbc6ca5fcec3a37263a4d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 16 Feb 2026 20:05:39 +0900 Subject: test(backend): add unit tests for auth, config, ratelimit, game, and api Cover previously untested logic: session ID generation/hashing, password authentication, IP rate limiting, game state helpers, handler endpoints, task enqueue/result processing, and config loading. Co-Authored-By: Claude Opus 4.6 --- backend/game/hub_test.go | 249 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 248 insertions(+), 1 deletion(-) (limited to 'backend/game') diff --git a/backend/game/hub_test.go b/backend/game/hub_test.go index a8fad58..59ce996 100644 --- a/backend/game/hub_test.go +++ b/backend/game/hub_test.go @@ -1,6 +1,253 @@ package game -import "testing" +import ( + "context" + "errors" + "testing" + + "albatross-2026-backend/db" + "albatross-2026-backend/taskqueue" +) + +// mockTaskQueue implements TaskQueueInterface for testing. +type mockTaskQueue struct { + enqueued []taskqueue.TaskPayloadRunTestcase + err error +} + +func (m *mockTaskQueue) EnqueueTaskRunTestcase(gameID, userID, submissionID, testcaseID int, language, code, stdin, stdout string) error { + if m.err != nil { + return m.err + } + m.enqueued = append(m.enqueued, taskqueue.TaskPayloadRunTestcase{ + GameID: gameID, + UserID: userID, + SubmissionID: submissionID, + TestcaseID: testcaseID, + Language: language, + Code: code, + Stdin: stdin, + Stdout: stdout, + }) + return nil +} + +// mockQuerier implements db.Querier for testing. +type mockQuerier struct { + db.Querier + listTestcasesByGameIDFunc func(ctx context.Context, gameID int32) ([]db.Testcase, error) + createTestcaseResultFunc func(ctx context.Context, arg db.CreateTestcaseResultParams) error + createTestcaseResultCalls []db.CreateTestcaseResultParams +} + +func (m *mockQuerier) ListTestcasesByGameID(ctx context.Context, gameID int32) ([]db.Testcase, error) { + if m.listTestcasesByGameIDFunc != nil { + return m.listTestcasesByGameIDFunc(ctx, gameID) + } + return nil, nil +} + +func (m *mockQuerier) CreateTestcaseResult(_ context.Context, arg db.CreateTestcaseResultParams) error { + m.createTestcaseResultCalls = append(m.createTestcaseResultCalls, arg) + if m.createTestcaseResultFunc != nil { + return m.createTestcaseResultFunc(context.Background(), arg) + } + return nil +} + +func TestEnqueueTestTasks(t *testing.T) { + testcases := []db.Testcase{ + {TestcaseID: 1, ProblemID: 10, Stdin: "input1", Stdout: "output1"}, + {TestcaseID: 2, ProblemID: 10, Stdin: "input2", Stdout: "output2"}, + } + + tq := &mockTaskQueue{} + mq := &mockQuerier{ + listTestcasesByGameIDFunc: func(_ context.Context, _ int32) ([]db.Testcase, error) { + return testcases, nil + }, + } + + hub := &Hub{q: mq, taskQueue: tq, ctx: context.Background()} + + err := hub.EnqueueTestTasks(context.Background(), 100, 1, 42, "php", "