Skip to content

Commit 2d58463

Browse files
committed
TestJobNeedsMatrix
1 parent 3d682e2 commit 2d58463

File tree

2 files changed

+110
-4
lines changed

2 files changed

+110
-4
lines changed

tests/integration/actions_job_test.go

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ jobs:
126126
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
127127

128128
apiRepo := createActionsTestRepo(t, token, "actions-jobs-with-needs", false)
129-
130129
runner := newMockRunner()
131130
runner.registerAsRepoRunner(t, user2.Name, apiRepo.Name, "mock-runner", []string{"ubuntu-latest"})
132131

@@ -163,6 +162,113 @@ jobs:
163162
})
164163
}
165164

165+
func TestJobNeedsMatrix(t *testing.T) {
166+
testCases := []struct {
167+
treePath string
168+
fileContent string
169+
execPolicies map[string]*taskExecPolicy
170+
expectedOutputs map[string]map[string]string // jobID(string) => output(map[string]string)
171+
}{
172+
{
173+
treePath: ".gitea/workflows/jobs-outputs-with-matrix.yml",
174+
fileContent: `name: jobs-outputs-with-matrix
175+
on:
176+
push:
177+
paths:
178+
- '.gitea/workflows/jobs-outputs-with-matrix.yml'
179+
jobs:
180+
job1:
181+
runs-on: ubuntu-latest
182+
outputs:
183+
output_1: ${{ steps.gen_output.outputs.output_1 }}
184+
output_2: ${{ steps.gen_output.outputs.output_2 }}
185+
output_3: ${{ steps.gen_output.outputs.output_3 }}
186+
strategy:
187+
matrix:
188+
version: [1, 2, 3]
189+
steps:
190+
- name: Generate output
191+
id: gen_output
192+
run: |
193+
version="${{ matrix.version }}"
194+
echo "output_${version}=${version}" >> "$GITHUB_OUTPUT"
195+
job2:
196+
runs-on: ubuntu-latest
197+
needs: [job1]
198+
steps:
199+
- run: echo '${{ toJSON(needs.job1.outputs) }}'
200+
`,
201+
execPolicies: map[string]*taskExecPolicy{
202+
"job1 (1)": {
203+
result: runnerv1.Result_RESULT_SUCCESS,
204+
outputs: map[string]string{
205+
"output_1": "1",
206+
"output_2": "",
207+
"output_3": "",
208+
},
209+
},
210+
"job1 (2)": {
211+
result: runnerv1.Result_RESULT_SUCCESS,
212+
outputs: map[string]string{
213+
"output_1": "",
214+
"output_2": "2",
215+
"output_3": "",
216+
},
217+
},
218+
"job1 (3)": {
219+
result: runnerv1.Result_RESULT_SUCCESS,
220+
outputs: map[string]string{
221+
"output_1": "",
222+
"output_2": "",
223+
"output_3": "3",
224+
},
225+
},
226+
},
227+
expectedOutputs: map[string]map[string]string{
228+
"job1": {
229+
"output_1": "1",
230+
"output_2": "2",
231+
"output_3": "3",
232+
},
233+
},
234+
},
235+
}
236+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
237+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
238+
session := loginUser(t, user2.Name)
239+
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
240+
241+
apiRepo := createActionsTestRepo(t, token, "actions-jobs-outputs-with-matrix", false)
242+
runner := newMockRunner()
243+
runner.registerAsRepoRunner(t, user2.Name, apiRepo.Name, "mock-runner", []string{"ubuntu-latest"})
244+
245+
for _, tc := range testCases {
246+
t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) {
247+
opts := getWorkflowCreateFileOptions(user2, apiRepo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent)
248+
createWorkflowFile(t, token, user2.Name, apiRepo.Name, tc.treePath, opts)
249+
250+
for i := 0; i < len(tc.execPolicies); i++ {
251+
task := runner.fetchTask(t)
252+
jobName := getTaskJobNameByTaskID(t, token, user2.Name, apiRepo.Name, task.Id)
253+
policy := tc.execPolicies[jobName]
254+
assert.NotNil(t, policy)
255+
runner.execTask(t, task, policy)
256+
}
257+
258+
job2Task := runner.fetchTask(t)
259+
needs := job2Task.Needs
260+
assert.Len(t, needs, len(tc.expectedOutputs))
261+
for jobID, outputs := range tc.expectedOutputs {
262+
assert.Len(t, needs[jobID].Outputs, len(outputs))
263+
for outputKey, outputValue := range outputs {
264+
assert.Equal(t, outputValue, needs[jobID].Outputs[outputKey])
265+
}
266+
}
267+
})
268+
}
269+
})
270+
}
271+
166272
func createActionsTestRepo(t *testing.T, authToken, repoName string, isPrivate bool) *api.Repository {
167273
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
168274
Name: repoName,

tests/integration/actions_runner_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func (r *mockRunner) execTask(t *testing.T, task *runnerv1.Task, policy *taskExe
137137
assert.NoError(t, err)
138138
assert.EqualValues(t, idx+1, resp.Msg.AckIndex)
139139
}
140-
sentOutputs := make(map[string]string, len(policy.outputs))
140+
sentOutputKeys := make([]string, 0, len(policy.outputs))
141141
for outputKey, outputValue := range policy.outputs {
142142
resp, err := r.client.runnerServiceClient.UpdateTask(context.Background(), connect.NewRequest(&runnerv1.UpdateTaskRequest{
143143
State: &runnerv1.TaskState{
@@ -147,8 +147,8 @@ func (r *mockRunner) execTask(t *testing.T, task *runnerv1.Task, policy *taskExe
147147
Outputs: map[string]string{outputKey: outputValue},
148148
}))
149149
assert.NoError(t, err)
150-
sentOutputs[outputKey] = outputValue
151-
assert.True(t, reflect.DeepEqual(sentOutputs, resp.Msg.SentOutputs))
150+
sentOutputKeys = append(sentOutputKeys, outputKey)
151+
assert.True(t, reflect.DeepEqual(sentOutputKeys, resp.Msg.SentOutputs))
152152
}
153153
time.Sleep(policy.execTime)
154154
resp, err := r.client.runnerServiceClient.UpdateTask(context.Background(), connect.NewRequest(&runnerv1.UpdateTaskRequest{

0 commit comments

Comments
 (0)