@@ -2,6 +2,7 @@ package crdupgradesafety
22
33import (
44 "errors"
5+ "fmt"
56 "testing"
67
78 kappcus "carvel.dev/kapp/pkg/kapp/crdupgradesafety"
@@ -905,3 +906,81 @@ func TestType(t *testing.T) {
905906 })
906907 }
907908}
909+
910+ func TestOrderKappsValidateErr (t * testing.T ) {
911+ testErr1 := errors .New ("fallback1" )
912+ testErr2 := errors .New ("fallback2" )
913+
914+ generateErrors := func (n int , base string ) []error {
915+ var result []error
916+ for i := n ; i >= 0 ; i -- {
917+ result = append (result , fmt .Errorf ("%s%d" , base , i ))
918+ }
919+ return result
920+ }
921+
922+ joinedAndNested := func (format string , errs ... error ) error {
923+ return fmt .Errorf (format , errors .Join (errs ... ))
924+ }
925+
926+ testCases := []struct {
927+ name string
928+ inpuError error
929+ expectedError error
930+ }{
931+ {
932+ name : "fallback: initial error was not error.Join'ed" ,
933+ inpuError : testErr1 ,
934+ expectedError : testErr1 ,
935+ },
936+ {
937+ name : "fallback: nested error was not wrapped" ,
938+ inpuError : errors .Join (testErr1 ),
939+ expectedError : testErr1 ,
940+ },
941+ {
942+ name : "fallback: multiple nested errors, one was not wrapped" ,
943+ inpuError : errors .Join (testErr2 , fmt .Errorf ("%w" , testErr1 )),
944+ expectedError : errors .Join (testErr2 , fmt .Errorf ("%w" , testErr1 )),
945+ },
946+ {
947+ name : "fallback: nested error did not contain \" :\" " ,
948+ inpuError : errors .Join (fmt .Errorf ("%w" , testErr1 )),
949+ expectedError : testErr1 ,
950+ },
951+ {
952+ name : "fallback: multiple nested errors, one did not contain \" :\" " ,
953+ inpuError : errors .Join (joinedAndNested ("fail: %w" , testErr2 ), joinedAndNested ("%w" , testErr1 )),
954+ expectedError : errors .Join (fmt .Errorf ("fail: %w" , testErr2 ), testErr1 ),
955+ },
956+ {
957+ name : "fallback: nested error was not error.Join'ed" ,
958+ inpuError : errors .Join (fmt .Errorf ("fail: %w" , testErr1 )),
959+ expectedError : fmt .Errorf ("fail: %w" , testErr1 ),
960+ },
961+ {
962+ name : "fallback: multiple nested errors, one was not error.Join'ed" ,
963+ inpuError : errors .Join (joinedAndNested ("fail: %w" , testErr2 ), fmt .Errorf ("fail: %w" , testErr1 )),
964+ expectedError : fmt .Errorf ("fail: %w\n fail: %w" , testErr2 , testErr1 ),
965+ },
966+ {
967+ name : "ensures order for a single group of multiple deeply nested errors" ,
968+ inpuError : errors .Join (joinedAndNested ("fail: %w" , testErr2 , testErr1 )),
969+ expectedError : fmt .Errorf ("fail: %w\n %w" , testErr1 , testErr2 ),
970+ },
971+ {
972+ name : "ensures order for multiple groups of deeply nested errors" ,
973+ inpuError : errors .Join (
974+ joinedAndNested ("fail: %w" , testErr2 , testErr1 ),
975+ joinedAndNested ("validation: %w" , generateErrors (5 , "err" )... ),
976+ ),
977+ expectedError : fmt .Errorf ("fail: %w\n %w\n validation: err0\n err1\n err2\n err3\n err4\n err5" , testErr1 , testErr2 ),
978+ },
979+ }
980+ for _ , tc := range testCases {
981+ t .Run (tc .name , func (t * testing.T ) {
982+ err := orderKappsValidateErr (tc .inpuError )
983+ require .EqualError (t , err , tc .expectedError .Error ())
984+ })
985+ }
986+ }
0 commit comments