@@ -81,7 +81,8 @@ func TestBuildPipelineStages(t *testing.T) {
8181 Rollback : tc .rollback ,
8282 },
8383 }
84- got := buildPipelineStages (input )
84+ got , err := buildPipelineStages (input )
85+ require .NoError (t , err )
8586
8687 require .Len (t , got , len (tc .wantNames ))
8788 for i , s := range got {
@@ -93,6 +94,21 @@ func TestBuildPipelineStages(t *testing.T) {
9394 }
9495}
9596
97+ // TestBuildPipelineStagesRollbackWithoutStages ensures a rollback request with
98+ // no stages returns an error instead of panicking on stages[0].
99+ func TestBuildPipelineStagesRollbackWithoutStages (t * testing.T ) {
100+ t .Parallel ()
101+
102+ got , err := buildPipelineStages (& sdk.BuildPipelineSyncStagesInput {
103+ Request : sdk.BuildPipelineSyncStagesRequest {
104+ Stages : []sdk.StageConfig {},
105+ Rollback : true ,
106+ },
107+ })
108+ assert .Nil (t , got )
109+ assert .ErrorIs (t , err , ErrRollbackRequiresStages )
110+ }
111+
96112// replica of piped's controller.validateStageIndexes (unexported there), kept in sync manually.
97113func validateStageIndexes (req []sdk.StageConfig , res []sdk.PipelineStage ) error {
98114 reqIndexes := make (map [int ]struct {})
@@ -117,14 +133,15 @@ func TestBuildPipelineStagesRollbackIndexContract(t *testing.T) {
117133 {Name : StageECSPrimaryRollout , Index : 0 },
118134 {Name : StageECSCanaryRollout , Index : 1 },
119135 }
120- got := buildPipelineStages (& sdk.BuildPipelineSyncStagesInput {
136+ got , err := buildPipelineStages (& sdk.BuildPipelineSyncStagesInput {
121137 Request : sdk.BuildPipelineSyncStagesRequest {
122138 Stages : reqStages ,
123139 Rollback : true ,
124140 },
125141 })
142+ require .NoError (t , err )
126143
127- err : = validateStageIndexes (reqStages , got )
144+ err = validateStageIndexes (reqStages , got )
128145 assert .NoError (t , err , "rollback stage index must be one of the requested indexes" )
129146}
130147
0 commit comments