mirror of
https://github.com/go-gitea/gitea.git
synced 2026-05-09 15:14:32 +00:00
Backport of 8e85454a50
Fixes the issue that status report always shows "waiting to run" when
already running, by comparing state, targetURL, and description (not
just state) in the deduplication check.
Co-authored-by: Nicolas <bircni@icloud.com>
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: Claude (claude-sonnet-4-5) <noreply@anthropic.com>
Agent-Logs-Url: https://github.com/go-gitea/gitea/sessions/1b315e9f-698c-4564-9ffa-aac1b9cb1692
Co-authored-by: silverwind <115237+silverwind@users.noreply.github.com>
89 lines
3.1 KiB
Go
89 lines
3.1 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package actions
|
|
|
|
import (
|
|
"testing"
|
|
|
|
actions_model "code.gitea.io/gitea/models/actions"
|
|
"code.gitea.io/gitea/models/db"
|
|
git_model "code.gitea.io/gitea/models/git"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
"code.gitea.io/gitea/models/unittest"
|
|
"code.gitea.io/gitea/modules/commitstatus"
|
|
"code.gitea.io/gitea/modules/gitrepo"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCreateCommitStatus_Dedupe(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
|
|
gitRepo, err := gitrepo.OpenRepository(t.Context(), repo)
|
|
require.NoError(t, err)
|
|
defer gitRepo.Close()
|
|
|
|
commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch)
|
|
require.NoError(t, err)
|
|
|
|
run := &actions_model.ActionRun{
|
|
ID: 99001,
|
|
RepoID: repo.ID,
|
|
Repo: repo,
|
|
WorkflowID: "status-dedupe-test.yaml",
|
|
}
|
|
job := &actions_model.ActionRunJob{
|
|
ID: 99002,
|
|
RunID: run.ID,
|
|
RepoID: repo.ID,
|
|
Name: "status-dedupe-job",
|
|
Status: actions_model.StatusWaiting,
|
|
}
|
|
|
|
expectedContext := "status-dedupe-test.yaml / status-dedupe-job (push)"
|
|
expectedTargetURL := run.Link() + "/jobs/99002"
|
|
|
|
require.NoError(t, createCommitStatus(t.Context(), repo, "push", commit.ID.String(), run, job))
|
|
|
|
statuses := findCommitStatusesForContext(t, repo.ID, commit.ID.String(), expectedContext)
|
|
require.Len(t, statuses, 1)
|
|
assert.Equal(t, commitstatus.CommitStatusPending, statuses[0].State)
|
|
assert.Equal(t, "Waiting to run", statuses[0].Description)
|
|
assert.Equal(t, expectedTargetURL, statuses[0].TargetURL)
|
|
|
|
job.Status = actions_model.StatusRunning
|
|
require.NoError(t, createCommitStatus(t.Context(), repo, "push", commit.ID.String(), run, job))
|
|
|
|
statuses = findCommitStatusesForContext(t, repo.ID, commit.ID.String(), expectedContext)
|
|
require.Len(t, statuses, 2)
|
|
assert.Equal(t, "Waiting to run", statuses[0].Description)
|
|
assert.Equal(t, commitstatus.CommitStatusPending, statuses[1].State)
|
|
assert.Equal(t, "Has started running", statuses[1].Description)
|
|
assert.Equal(t, expectedTargetURL, statuses[1].TargetURL)
|
|
|
|
require.NoError(t, createCommitStatus(t.Context(), repo, "push", commit.ID.String(), run, job))
|
|
statuses = findCommitStatusesForContext(t, repo.ID, commit.ID.String(), expectedContext)
|
|
assert.Len(t, statuses, 2)
|
|
|
|
job.Status = actions_model.StatusSuccess
|
|
require.NoError(t, createCommitStatus(t.Context(), repo, "push", commit.ID.String(), run, job))
|
|
statuses = findCommitStatusesForContext(t, repo.ID, commit.ID.String(), expectedContext)
|
|
require.Len(t, statuses, 3)
|
|
assert.Equal(t, commitstatus.CommitStatusSuccess, statuses[2].State)
|
|
}
|
|
|
|
func findCommitStatusesForContext(t *testing.T, repoID int64, sha, context string) []*git_model.CommitStatus {
|
|
t.Helper()
|
|
|
|
var statuses []*git_model.CommitStatus
|
|
err := db.GetEngine(t.Context()).
|
|
Where("repo_id = ? AND sha = ? AND context = ?", repoID, sha, context).
|
|
Asc("`index`").
|
|
Find(&statuses)
|
|
require.NoError(t, err)
|
|
return statuses
|
|
}
|