mirror of
https://github.com/go-gitea/gitea.git
synced 2026-07-28 09:15:18 +02:00
Backport #38280 by @bircni The **Status** filter dropdown on the repository Actions run list does not let you filter for **Blocked** runs (nor **Cancelled** or **Skipped**). These statuses are missing from the dropdown even though a run can legitimately end up in any of them. A run's status is computed by `aggregateJobStatus`, which can return `Blocked`, `Cancelled` and `Skipped`. Because the filter dropdown only offered Success, Failure, Waiting, Running and Cancelling, runs in those other states existed but were impossible to filter for. Co-authored-by: bircni <bircni@icloud.com>
166 lines
5.4 KiB
Go
166 lines
5.4 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package actions
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"gitea.dev/models/db"
|
|
"gitea.dev/models/unittest"
|
|
"gitea.dev/modules/optional"
|
|
"gitea.dev/modules/translation"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGetRunWorkflowIDs(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
ids, err := GetRunWorkflowIDs(t.Context(), 4)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"artifact.yaml", "test.yaml"}, ids)
|
|
|
|
ids, err = GetRunWorkflowIDs(t.Context(), 999999)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
}
|
|
|
|
func TestGetRepoRunWorkflowIDs(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
const (
|
|
repoID = int64(4)
|
|
repoWorkflowID = "repo-orphan.yaml"
|
|
scopedWorkflowID = "scoped-only.yaml"
|
|
sharedWorkflowID = "shared-name.yaml"
|
|
scopedWorkflowRepo = int64(111)
|
|
)
|
|
for _, spec := range []struct {
|
|
id int64
|
|
workflowID string
|
|
workflowRepoID int64
|
|
isScopedRun bool
|
|
}{
|
|
{99811, repoWorkflowID, repoID, false},
|
|
{99812, scopedWorkflowID, scopedWorkflowRepo, true},
|
|
{99813, sharedWorkflowID, repoID, false},
|
|
{99814, sharedWorkflowID, scopedWorkflowRepo, true},
|
|
} {
|
|
require.NoError(t, db.Insert(t.Context(), &ActionRun{
|
|
ID: spec.id,
|
|
Index: spec.id,
|
|
RepoID: repoID,
|
|
OwnerID: 1,
|
|
TriggerUserID: 1,
|
|
WorkflowID: spec.workflowID,
|
|
WorkflowRepoID: spec.workflowRepoID,
|
|
IsScopedRun: spec.isScopedRun,
|
|
}))
|
|
}
|
|
|
|
ids, err := GetRepoRunWorkflowIDs(t.Context(), repoID)
|
|
require.NoError(t, err)
|
|
assert.Contains(t, ids, repoWorkflowID)
|
|
assert.Contains(t, ids, sharedWorkflowID)
|
|
assert.NotContains(t, ids, scopedWorkflowID)
|
|
}
|
|
|
|
func TestGetStatusInfoList(t *testing.T) {
|
|
statusInfoList := GetStatusInfoList(t.Context(), translation.MockLocale{})
|
|
|
|
assert.Equal(t, []StatusInfo{
|
|
{Status: int(StatusSuccess), StatusName: StatusSuccess.String(), DisplayedStatus: "actions.status.success"},
|
|
{Status: int(StatusFailure), StatusName: StatusFailure.String(), DisplayedStatus: "actions.status.failure"},
|
|
{Status: int(StatusCancelled), StatusName: StatusCancelled.String(), DisplayedStatus: "actions.status.cancelled"},
|
|
{Status: int(StatusSkipped), StatusName: StatusSkipped.String(), DisplayedStatus: "actions.status.skipped"},
|
|
{Status: int(StatusWaiting), StatusName: StatusWaiting.String(), DisplayedStatus: "actions.status.waiting"},
|
|
{Status: int(StatusRunning), StatusName: StatusRunning.String(), DisplayedStatus: "actions.status.running"},
|
|
{Status: int(StatusBlocked), StatusName: StatusBlocked.String(), DisplayedStatus: "actions.status.blocked"},
|
|
{Status: int(StatusCancelling), StatusName: StatusCancelling.String(), DisplayedStatus: "actions.status.cancelling"},
|
|
}, statusInfoList)
|
|
}
|
|
|
|
// TestFindRunOptions_WorkflowRepoID: two runs share the bare WorkflowID but come from different content-source repos;
|
|
// the source-aware WorkflowRepoID filter must separate them.
|
|
func TestFindRunOptions_WorkflowRepoID(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
const (
|
|
repoID = int64(4)
|
|
sourceA = int64(111)
|
|
sourceB = int64(222)
|
|
workflowID = "u3-shared.yaml"
|
|
)
|
|
for _, spec := range []struct{ id, workflowRepoID int64 }{
|
|
{99801, sourceA},
|
|
{99802, sourceB},
|
|
} {
|
|
require.NoError(t, db.Insert(t.Context(), &ActionRun{
|
|
ID: spec.id,
|
|
Index: spec.id,
|
|
RepoID: repoID,
|
|
OwnerID: 1,
|
|
TriggerUserID: 1,
|
|
WorkflowID: workflowID,
|
|
WorkflowRepoID: spec.workflowRepoID,
|
|
IsScopedRun: true,
|
|
}))
|
|
}
|
|
|
|
// no source filter -> both
|
|
all, err := db.Find[ActionRun](t.Context(), FindRunOptions{RepoID: repoID, WorkflowID: workflowID})
|
|
require.NoError(t, err)
|
|
assert.Len(t, all, 2)
|
|
|
|
// filter by source A -> only the run whose content came from A
|
|
onlyA, err := db.Find[ActionRun](t.Context(), FindRunOptions{RepoID: repoID, WorkflowID: workflowID, WorkflowRepoID: sourceA})
|
|
require.NoError(t, err)
|
|
require.Len(t, onlyA, 1)
|
|
assert.EqualValues(t, 99801, onlyA[0].ID)
|
|
|
|
// filter by source B -> only the run whose content came from B
|
|
onlyB, err := db.Find[ActionRun](t.Context(), FindRunOptions{RepoID: repoID, WorkflowID: workflowID, WorkflowRepoID: sourceB})
|
|
require.NoError(t, err)
|
|
require.Len(t, onlyB, 1)
|
|
assert.EqualValues(t, 99802, onlyB[0].ID)
|
|
}
|
|
|
|
func TestFindRunOptions_IsScopedRun(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
const (
|
|
repoID = int64(4)
|
|
workflowID = "scoped-flag.yaml"
|
|
)
|
|
for _, spec := range []struct {
|
|
id int64
|
|
scoped bool
|
|
}{
|
|
{99821, false},
|
|
{99822, true},
|
|
} {
|
|
require.NoError(t, db.Insert(t.Context(), &ActionRun{
|
|
ID: spec.id,
|
|
Index: spec.id,
|
|
RepoID: repoID,
|
|
OwnerID: 1,
|
|
TriggerUserID: 1,
|
|
WorkflowID: workflowID,
|
|
WorkflowRepoID: repoID,
|
|
IsScopedRun: spec.scoped,
|
|
}))
|
|
}
|
|
|
|
repoLevel, err := db.Find[ActionRun](t.Context(), FindRunOptions{RepoID: repoID, WorkflowID: workflowID, IsScopedRun: optional.Some(false)})
|
|
require.NoError(t, err)
|
|
require.Len(t, repoLevel, 1)
|
|
assert.EqualValues(t, 99821, repoLevel[0].ID)
|
|
|
|
scoped, err := db.Find[ActionRun](t.Context(), FindRunOptions{RepoID: repoID, WorkflowID: workflowID, IsScopedRun: optional.Some(true)})
|
|
require.NoError(t, err)
|
|
require.Len(t, scoped, 1)
|
|
assert.EqualValues(t, 99822, scoped[0].ID)
|
|
}
|