2024-12-16 11:18:00 +08:00
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestAggregateJobStatus ( t * testing . T ) {
testStatuses := func ( expected Status , statuses [ ] Status ) {
2024-12-16 21:49:53 +08:00
t . Helper ( )
2024-12-16 11:18:00 +08:00
var jobs [ ] * ActionRunJob
for _ , v := range statuses {
jobs = append ( jobs , & ActionRunJob { Status : v } )
}
actual := AggregateJobStatus ( jobs )
if ! assert . Equal ( t , expected , actual ) {
var statusStrings [ ] string
for _ , s := range statuses {
statusStrings = append ( statusStrings , s . String ( ) )
}
t . Errorf ( "AggregateJobStatus(%v) = %v, want %v" , statusStrings , statusNames [ actual ] , statusNames [ expected ] )
}
}
cases := [ ] struct {
statuses [ ] Status
expected Status
} {
2024-12-16 21:49:53 +08:00
// unknown cases, maybe it shouldn't happen in real world
{ [ ] Status { } , StatusUnknown } ,
{ [ ] Status { StatusUnknown , StatusSuccess } , StatusUnknown } ,
{ [ ] Status { StatusUnknown , StatusSkipped } , StatusUnknown } ,
{ [ ] Status { StatusUnknown , StatusFailure } , StatusFailure } ,
{ [ ] Status { StatusUnknown , StatusCancelled } , StatusCancelled } ,
{ [ ] Status { StatusUnknown , StatusWaiting } , StatusWaiting } ,
{ [ ] Status { StatusUnknown , StatusRunning } , StatusRunning } ,
{ [ ] Status { StatusUnknown , StatusBlocked } , StatusBlocked } ,
2024-12-16 11:18:00 +08:00
// success with other status
{ [ ] Status { StatusSuccess } , StatusSuccess } ,
{ [ ] Status { StatusSuccess , StatusSkipped } , StatusSuccess } , // skipped doesn't affect success
{ [ ] Status { StatusSuccess , StatusFailure } , StatusFailure } ,
{ [ ] Status { StatusSuccess , StatusCancelled } , StatusCancelled } ,
{ [ ] Status { StatusSuccess , StatusWaiting } , StatusWaiting } ,
{ [ ] Status { StatusSuccess , StatusRunning } , StatusRunning } ,
{ [ ] Status { StatusSuccess , StatusBlocked } , StatusBlocked } ,
2024-12-16 21:49:53 +08:00
// any cancelled, then cancelled
{ [ ] Status { StatusCancelled } , StatusCancelled } ,
{ [ ] Status { StatusCancelled , StatusSuccess } , StatusCancelled } ,
{ [ ] Status { StatusCancelled , StatusSkipped } , StatusCancelled } ,
{ [ ] Status { StatusCancelled , StatusFailure } , StatusCancelled } ,
{ [ ] Status { StatusCancelled , StatusWaiting } , StatusCancelled } ,
{ [ ] Status { StatusCancelled , StatusRunning } , StatusCancelled } ,
{ [ ] Status { StatusCancelled , StatusBlocked } , StatusCancelled } ,
2024-12-16 11:18:00 +08:00
// failure with other status, fail fast
// Should "running" win? Maybe no: old code does make "running" win, but GitHub does fail fast.
{ [ ] Status { StatusFailure } , StatusFailure } ,
{ [ ] Status { StatusFailure , StatusSuccess } , StatusFailure } ,
{ [ ] Status { StatusFailure , StatusSkipped } , StatusFailure } ,
2024-12-16 21:49:53 +08:00
{ [ ] Status { StatusFailure , StatusCancelled } , StatusCancelled } ,
2024-12-16 11:18:00 +08:00
{ [ ] Status { StatusFailure , StatusWaiting } , StatusFailure } ,
{ [ ] Status { StatusFailure , StatusRunning } , StatusFailure } ,
{ [ ] Status { StatusFailure , StatusBlocked } , StatusFailure } ,
// skipped with other status
2024-12-17 09:15:18 +08:00
// "all skipped" is also considered as "mergeable" by "services/actions.toCommitStatus", the same as GitHub
2024-12-16 21:49:53 +08:00
{ [ ] Status { StatusSkipped } , StatusSkipped } ,
2024-12-16 11:18:00 +08:00
{ [ ] Status { StatusSkipped , StatusSuccess } , StatusSuccess } ,
{ [ ] Status { StatusSkipped , StatusFailure } , StatusFailure } ,
{ [ ] Status { StatusSkipped , StatusCancelled } , StatusCancelled } ,
{ [ ] Status { StatusSkipped , StatusWaiting } , StatusWaiting } ,
{ [ ] Status { StatusSkipped , StatusRunning } , StatusRunning } ,
{ [ ] Status { StatusSkipped , StatusBlocked } , StatusBlocked } ,
}
for _ , c := range cases {
testStatuses ( c . expected , c . statuses )
}
}