Skip to content

Commit 1eed2ec

Browse files
committed
Repo level tests
1 parent 3b38b05 commit 1eed2ec

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package integration
5+
6+
import (
7+
"fmt"
8+
"net/http"
9+
"testing"
10+
11+
actions_model "code.gitea.io/gitea/models/actions"
12+
auth_model "code.gitea.io/gitea/models/auth"
13+
"code.gitea.io/gitea/models/db"
14+
api "code.gitea.io/gitea/modules/structs"
15+
"code.gitea.io/gitea/tests"
16+
17+
"github.com/stretchr/testify/assert"
18+
)
19+
20+
func TestAPIRunnerRepoApi(t *testing.T) {
21+
defer tests.PrepareTestEnv(t)()
22+
userUsername := "user2"
23+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeWriteRepository)
24+
req := NewRequest(t, "POST", "/api/v1/repos/user2/repo1/actions/runners/registration-token").AddTokenAuth(token)
25+
tokenResp := MakeRequest(t, req, http.StatusOK)
26+
var registrationToken struct {
27+
Token string `json:"token"`
28+
}
29+
DecodeJSON(t, tokenResp, &registrationToken)
30+
assert.NotEmpty(t, registrationToken.Token)
31+
32+
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/actions/runners").AddTokenAuth(token)
33+
runnerListResp := MakeRequest(t, req, http.StatusOK)
34+
runnerList := api.ActionRunnersResponse{}
35+
DecodeJSON(t, runnerListResp, &runnerList)
36+
37+
assert.Len(t, runnerList.Entries, 1)
38+
assert.Equal(t, "runner_to_be_deleted-repo1", runnerList.Entries[0].Name)
39+
assert.Equal(t, int64(34348), runnerList.Entries[0].ID)
40+
assert.False(t, runnerList.Entries[0].Ephemeral)
41+
assert.Len(t, runnerList.Entries[0].Labels, 2)
42+
assert.Equal(t, "runner_to_be_deleted", runnerList.Entries[0].Labels[0].Name)
43+
assert.Equal(t, "linux", runnerList.Entries[0].Labels[1].Name)
44+
45+
// Verify get the runner by id
46+
req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", runnerList.Entries[0].ID)).AddTokenAuth(token)
47+
runnerResp := MakeRequest(t, req, http.StatusOK)
48+
49+
runner := api.ActionRunner{}
50+
DecodeJSON(t, runnerResp, &runner)
51+
52+
assert.Equal(t, "runner_to_be_deleted-repo1", runner.Name)
53+
assert.Equal(t, int64(34348), runner.ID)
54+
assert.False(t, runner.Ephemeral)
55+
assert.Len(t, runner.Labels, 2)
56+
assert.Equal(t, "runner_to_be_deleted", runner.Labels[0].Name)
57+
assert.Equal(t, "linux", runner.Labels[1].Name)
58+
59+
// Verify delete the runner by id
60+
req = NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", runnerList.Entries[0].ID)).AddTokenAuth(token)
61+
MakeRequest(t, req, http.StatusNoContent)
62+
63+
// Verify runner deletion
64+
req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", runnerList.Entries[0].ID)).AddTokenAuth(token)
65+
MakeRequest(t, req, http.StatusNotFound)
66+
}
67+
68+
func TestAPIRunnerDeleteReadScopeForbiddenRepoApi(t *testing.T) {
69+
defer tests.PrepareTestEnv(t)()
70+
userUsername := "user2"
71+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeReadRepository)
72+
73+
// Verify delete the runner by id is forbidden with read scope
74+
req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", 34348)).AddTokenAuth(token)
75+
MakeRequest(t, req, http.StatusForbidden)
76+
}
77+
78+
func TestAPIRunnerGetRepoApi(t *testing.T) {
79+
defer tests.PrepareTestEnv(t)()
80+
userUsername := "user2"
81+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeReadRepository)
82+
// Verify get the runner by id with read scope
83+
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", 34348)).AddTokenAuth(token)
84+
runnerResp := MakeRequest(t, req, http.StatusOK)
85+
86+
runner := api.ActionRunner{}
87+
DecodeJSON(t, runnerResp, &runner)
88+
89+
assert.Equal(t, "runner_to_be_deleted-repo1", runner.Name)
90+
assert.Equal(t, int64(34348), runner.ID)
91+
assert.False(t, runner.Ephemeral)
92+
assert.Len(t, runner.Labels, 2)
93+
assert.Equal(t, "runner_to_be_deleted", runner.Labels[0].Name)
94+
assert.Equal(t, "linux", runner.Labels[1].Name)
95+
}
96+
97+
func TestAPIRunnerGetOrganizationScopeForbiddenRepoApi(t *testing.T) {
98+
defer tests.PrepareTestEnv(t)()
99+
userUsername := "user2"
100+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeReadOrganization)
101+
// Verify get the runner by id with read scope
102+
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", 34348)).AddTokenAuth(token)
103+
MakeRequest(t, req, http.StatusForbidden)
104+
}
105+
106+
func TestAPIRunnerGetAdminRunnerNotFoundRepoApi(t *testing.T) {
107+
defer tests.PrepareTestEnv(t)()
108+
userUsername := "user2"
109+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeReadRepository)
110+
// Verify get a runner by id of different entity is not found
111+
// runner.Editable(ownerID, repoID) false
112+
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", 34344)).AddTokenAuth(token)
113+
MakeRequest(t, req, http.StatusNotFound)
114+
}
115+
116+
func TestAPIRunnerDeleteAdminRunnerNotFoundRepoApi(t *testing.T) {
117+
defer tests.PrepareTestEnv(t)()
118+
userUsername := "user2"
119+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeWriteRepository)
120+
// Verify delete a runner by id of different entity is not found
121+
// runner.Editable(ownerID, repoID) false
122+
req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", 34344)).AddTokenAuth(token)
123+
MakeRequest(t, req, http.StatusNotFound)
124+
}
125+
126+
func TestAPIRunnerDeleteNoConflictWhileJobIsDoneRepoApi(t *testing.T) {
127+
defer tests.PrepareTestEnv(t)()
128+
userUsername := "user2"
129+
token := getUserToken(t, userUsername, auth_model.AccessTokenScopeWriteRepository)
130+
131+
_, err := db.GetEngine(t.Context()).Insert(&actions_model.ActionTask{
132+
RunnerID: 34348,
133+
Status: actions_model.StatusSuccess,
134+
})
135+
assert.NoError(t, err)
136+
137+
// Verify delete the runner by id is ok
138+
req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/user2/repo1/actions/runners/%d", 34348)).AddTokenAuth(token)
139+
MakeRequest(t, req, http.StatusNoContent)
140+
}

0 commit comments

Comments
 (0)