giteabot backport / giteabot (push) Canceled after 0s
giteabot / giteabot (push) Canceled after 0s
release-nightly / nightly-binary (push) Canceled after 0s
release-nightly / nightly-container (push) Canceled after 0s
cache-seeder / gobuild (push) Canceled after 0s
cache-seeder / lint (bindata, lint-backend) (push) Canceled after 0s
release-nightly-snapcraft / build-and-publish (push) Canceled after 0s
Includes direct password setup links in registration emails. Assisted-by: Codex:GPT-5
102 lines
3.2 KiB
Go
102 lines
3.2 KiB
Go
// Copyright 2025 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package actions
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"gitea.dev/models/db"
|
|
repo_model "gitea.dev/models/repo"
|
|
"gitea.dev/models/unittest"
|
|
"gitea.dev/modules/timeutil"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestUpdateRepoRunsNumbers(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
// update the number to a wrong one, the original is 3
|
|
_, err := db.GetEngine(t.Context()).ID(4).Cols("num_closed_action_runs").Update(&repo_model.Repository{
|
|
NumClosedActionRuns: 2,
|
|
})
|
|
assert.NoError(t, err)
|
|
|
|
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
|
|
assert.Equal(t, 4, repo.NumActionRuns)
|
|
assert.Equal(t, 2, repo.NumClosedActionRuns)
|
|
|
|
// now update will correct them, only num_actionr_runs and num_closed_action_runs should be updated
|
|
UpdateRepoRunsNumbers(t.Context(), repo.ID)
|
|
repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
|
|
assert.Equal(t, 4, repo.NumActionRuns)
|
|
assert.Equal(t, 3, repo.NumClosedActionRuns)
|
|
}
|
|
|
|
func TestActionRun_Duration_NonNegative(t *testing.T) {
|
|
run := &ActionRun{
|
|
Started: timeutil.TimeStamp(100),
|
|
Stopped: timeutil.TimeStamp(200),
|
|
Status: StatusSuccess,
|
|
PreviousDuration: -time.Hour,
|
|
}
|
|
assert.Equal(t, time.Duration(0), run.Duration())
|
|
}
|
|
|
|
func TestActionRun_WorkflowLink(t *testing.T) {
|
|
repo := &repo_model.Repository{OwnerName: "org", Name: "consumer"}
|
|
|
|
// a repo-level run links by file name only
|
|
repoLevel := &ActionRun{Repo: repo, WorkflowID: "ci.yaml", WorkflowRepoID: repo.ID}
|
|
assert.Equal(t, repo.Link()+"/actions/?workflow=ci.yaml", repoLevel.WorkflowLink())
|
|
|
|
// a scoped run carries its source repo id back, so the list stays filtered to that source
|
|
scoped := &ActionRun{Repo: repo, WorkflowID: "ci.yaml", WorkflowRepoID: 42, IsScopedRun: true}
|
|
assert.Equal(t, repo.Link()+"/actions/?workflow=ci.yaml&scoped_workflow_source_repo_id=42", scoped.WorkflowLink())
|
|
}
|
|
|
|
func TestGetWorkflowLatestRun_RepoLevelOnly(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
const (
|
|
repoID = int64(4)
|
|
workflowID = "badge-source-aware.yaml"
|
|
ref = "refs/heads/main"
|
|
)
|
|
require.NoError(t, db.Insert(t.Context(), &ActionRun{
|
|
ID: 99811,
|
|
Index: 99811,
|
|
RepoID: repoID,
|
|
OwnerID: 1,
|
|
TriggerUserID: 1,
|
|
WorkflowID: workflowID,
|
|
Ref: ref,
|
|
Event: "push",
|
|
Status: StatusSuccess,
|
|
WorkflowRepoID: repoID,
|
|
WorkflowCommitSHA: "repo-level-sha",
|
|
}))
|
|
require.NoError(t, db.Insert(t.Context(), &ActionRun{
|
|
ID: 99812,
|
|
Index: 99812,
|
|
RepoID: repoID,
|
|
OwnerID: 1,
|
|
TriggerUserID: 1,
|
|
WorkflowID: workflowID,
|
|
Ref: ref,
|
|
Event: "push",
|
|
Status: StatusFailure,
|
|
WorkflowRepoID: 111,
|
|
WorkflowCommitSHA: "scoped-sha",
|
|
IsScopedRun: true,
|
|
}))
|
|
|
|
run, err := GetWorkflowLatestRun(t.Context(), repoID, workflowID, ref, "push")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 99811, run.ID)
|
|
assert.False(t, run.IsScopedRun)
|
|
}
|