From 85b7a14913c05b88b720fc546eaca5575ffe53fd Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 20 Feb 2026 21:38:58 +0900 Subject: feat(admin): add bulk rejudge for game submissions Extract common rejudge logic into a helper method and add two new endpoints: rejudge-latest (per-user latest only) and rejudge-all. This allows re-running submissions in bulk after testcase changes. Co-Authored-By: Claude Opus 4.6 --- backend/admin/handler_test.go | 127 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) (limited to 'backend/admin/handler_test.go') diff --git a/backend/admin/handler_test.go b/backend/admin/handler_test.go index 3b7a2ba..7249c2b 100644 --- a/backend/admin/handler_test.go +++ b/backend/admin/handler_test.go @@ -41,6 +41,7 @@ type mockQuerier struct { listMainPlayersFunc func(ctx context.Context, gameIDs []int32) ([]db.ListMainPlayersRow, error) listSubmissionIDsFunc func(ctx context.Context) ([]int32, error) getSubmissionsByGameIDFunc func(ctx context.Context, gameID int32) ([]db.Submission, error) + getLatestSubmissionsByGameIDFunc func(ctx context.Context, gameID int32) ([]db.Submission, error) getSubmissionByIDFunc func(ctx context.Context, submissionID int32) (db.Submission, error) getTestcaseResultsBySubmIDFunc func(ctx context.Context, submissionID int32) ([]db.TestcaseResult, error) updateSubmissionStatusFunc func(ctx context.Context, arg db.UpdateSubmissionStatusParams) error @@ -184,6 +185,13 @@ func (m *mockQuerier) GetSubmissionsByGameID(ctx context.Context, gameID int32) return nil, nil } +func (m *mockQuerier) GetLatestSubmissionsByGameID(ctx context.Context, gameID int32) ([]db.Submission, error) { + if m.getLatestSubmissionsByGameIDFunc != nil { + return m.getLatestSubmissionsByGameIDFunc(ctx, gameID) + } + return nil, nil +} + func (m *mockQuerier) GetSubmissionByID(ctx context.Context, submissionID int32) (db.Submission, error) { if m.getSubmissionByIDFunc != nil { return m.getSubmissionByIDFunc(ctx, submissionID) @@ -1499,3 +1507,122 @@ func TestPostSubmissionRejudge_SubmissionNotFound(t *testing.T) { t.Errorf("status = %d, want %d", httpErr.Code, http.StatusNotFound) } } + +func TestPostSubmissionsRejudgeLatest_Success(t *testing.T) { + var enqueuedIDs []int + + q := &mockQuerier{ + getGameByIDFunc: func(_ context.Context, gameID int32) (db.GetGameByIDRow, error) { + return db.GetGameByIDRow{GameID: gameID, ProblemID: 1, Language: "php"}, nil + }, + getLatestSubmissionsByGameIDFunc: func(_ context.Context, _ int32) ([]db.Submission, error) { + return []db.Submission{ + {SubmissionID: 10, GameID: 1, UserID: 1, Code: "