github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/apperrors/errors_test.go (about) 1 package apperrors_test 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/kyma-incubator/compass/components/director/pkg/resource" 8 9 "github.com/kyma-incubator/compass/components/director/pkg/apperrors" 10 errors1 "github.com/pkg/errors" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestInternalErrorFrom(t *testing.T) { 16 //GIVEN 17 err := errors.New("Error") 18 19 // WHEN 20 err = apperrors.InternalErrorFrom(err, "Very bad error") 21 // THEN 22 require.Error(t, err) 23 assert.EqualError(t, err, "Internal Server Error: Very bad error: Error") 24 } 25 26 func TestErrorMessage(t *testing.T) { 27 t.Run("Single field", func(t *testing.T) { 28 //GIVEN 29 validationErrors := map[string]error{ 30 "field1": errors.New("field1 is invalid"), 31 } 32 33 // WHEN 34 err := apperrors.NewInvalidDataErrorWithFields(validationErrors, "testObject") 35 36 // THEN 37 require.Error(t, err) 38 assert.EqualError(t, err, "Invalid data testObject [field1=field1 is invalid]") 39 }) 40 t.Run("Multiple fields", func(t *testing.T) { 41 //GIVEN 42 validationErrors := map[string]error{ 43 "field2": errors.New("field2 is invalid"), 44 "field3": errors.New("field3 is invalid"), 45 "field1": errors.New("field1 is invalid"), 46 } 47 48 // WHEN 49 err := apperrors.NewInvalidDataErrorWithFields(validationErrors, "testObject") 50 51 // THEN 52 require.Error(t, err) 53 assert.EqualError(t, err, "Invalid data testObject [field1=field1 is invalid; field2=field2 is invalid; field3=field3 is invalid]") 54 }) 55 } 56 57 func TestError_Is(t *testing.T) { 58 t.Run("The same error", func(t *testing.T) { 59 //GIVEN 60 err, ok := apperrors.NewInternalError("test error").(apperrors.Error) 61 require.True(t, ok) 62 63 err1 := apperrors.NewInternalError("test error1") 64 // WHEN 65 equal := err.Is(err1) 66 67 // THEN 68 require.True(t, equal) 69 }) 70 71 t.Run("Not the same error", func(t *testing.T) { 72 //GIVEN 73 err, ok := apperrors.NewInternalError("test error").(apperrors.Error) 74 require.True(t, ok) 75 76 err1 := apperrors.NewNotFoundError(resource.Application, "test error1") 77 // WHEN 78 equal := err.Is(err1) 79 80 // THEN 81 require.False(t, equal) 82 }) 83 84 t.Run("Basic error", func(t *testing.T) { 85 //GIVEN 86 err, ok := apperrors.NewInternalError("test error").(apperrors.Error) 87 require.True(t, ok) 88 89 err1 := errors.New("very bad error") 90 // WHEN 91 equal := err.Is(err1) 92 93 // THEN 94 require.False(t, equal) 95 }) 96 } 97 98 func TestErrors_As(t *testing.T) { 99 //GIVEN 100 101 internalErr := apperrors.NewInternalError("very bad error") 102 chainedErr := errors1.Wrap(internalErr, "wrap no 1") 103 chainedErr = errors1.Wrap(chainedErr, "wrap no 2") 104 chainedErr = errors1.Wrap(chainedErr, "wrap no 3") 105 106 // WHEN 107 err := apperrors.Error{} 108 errors.As(chainedErr, &err) 109 110 // THEN 111 assert.Equal(t, internalErr, err) 112 } 113 114 func TestErrors_Is(t *testing.T) { 115 type testCase struct { 116 name string 117 input error 118 testFunc func(err error) bool 119 expectedResult bool 120 } 121 122 t.Run("Errors Match", func(t *testing.T) { 123 testCases := []testCase{ 124 { 125 name: "TenantRequired", 126 input: apperrors.NewTenantRequiredError(), 127 testFunc: apperrors.IsTenantRequired, 128 expectedResult: true, 129 }, 130 { 131 name: "KeyDoesNotExist", 132 input: apperrors.NewKeyDoesNotExistError("magic key"), 133 testFunc: apperrors.IsKeyDoesNotExist, 134 expectedResult: true, 135 }, 136 { 137 name: "CannotReadTenant", 138 input: apperrors.NewCannotReadTenantError(), 139 testFunc: apperrors.IsCannotReadTenant, 140 expectedResult: true, 141 }, 142 { 143 name: "ValueNotFoundInConfiguration", 144 input: apperrors.NewValueNotFoundInConfigurationError(), 145 testFunc: apperrors.IsValueNotFoundInConfiguration, 146 expectedResult: true, 147 }, 148 { 149 name: "IsNotUniqueError", 150 input: apperrors.NewNotUniqueError(resource.AutomaticScenarioAssigment), 151 testFunc: apperrors.IsNotUniqueError, 152 expectedResult: true, 153 }, 154 { 155 name: "IsTenantNotFoundError", 156 input: apperrors.NewTenantNotFoundError("external-tenant"), 157 testFunc: apperrors.IsTenantNotFoundError, 158 expectedResult: true, 159 }, 160 { 161 name: "IsTenantRequired", 162 input: apperrors.NewTenantRequiredError(), 163 testFunc: apperrors.IsTenantRequired, 164 expectedResult: true, 165 }, 166 { 167 name: "IsNotFoundError", 168 input: apperrors.NewNotFoundError(resource.Label, "scenarios"), 169 testFunc: apperrors.IsNotFoundError, 170 expectedResult: true, 171 }, 172 { 173 name: "IsInvalidStatusCondition", 174 input: apperrors.NewInvalidStatusCondition(resource.Application), 175 testFunc: apperrors.IsInvalidStatusCondition, 176 expectedResult: true, 177 }, 178 { 179 name: "IsCannotUpdateObjectInManyBundlesError", 180 input: apperrors.NewCannotUpdateObjectInManyBundles(), 181 testFunc: apperrors.IsCannotUpdateObjectInManyBundlesError, 182 expectedResult: true, 183 }, 184 } 185 for _, testCase := range testCases { 186 t.Run(testCase.name, func(t *testing.T) { 187 // WHEN 188 output := testCase.testFunc(testCase.input) 189 190 // THEN 191 assert.Equal(t, testCase.expectedResult, output) 192 }) 193 } 194 }) 195 196 t.Run("Errors not match", func(t *testing.T) { 197 err := apperrors.NewInternalError("very bad error") 198 testCases := []testCase{ 199 { 200 name: "TenantRequired", 201 input: err, 202 testFunc: apperrors.IsTenantRequired, 203 expectedResult: false, 204 }, 205 { 206 name: "KeyDoesNotExist", 207 input: err, 208 testFunc: apperrors.IsKeyDoesNotExist, 209 expectedResult: false, 210 }, 211 { 212 name: "KeyDoesNotExist - basic error", 213 input: errors.New("test error"), 214 testFunc: apperrors.IsKeyDoesNotExist, 215 expectedResult: false, 216 }, 217 { 218 name: "CannotReadTenant", 219 input: err, 220 testFunc: apperrors.IsCannotReadTenant, 221 expectedResult: false, 222 }, 223 { 224 name: "ValueNotFoundInConfiguration", 225 input: err, 226 testFunc: apperrors.IsValueNotFoundInConfiguration, 227 expectedResult: false, 228 }, 229 { 230 name: "IsNotUniqueError", 231 input: err, 232 testFunc: apperrors.IsNotUniqueError, 233 expectedResult: false, 234 }, 235 { 236 name: "IsTenantNotFoundError", 237 input: err, 238 testFunc: apperrors.IsTenantNotFoundError, 239 expectedResult: false, 240 }, 241 { 242 name: "IsTenantRequired", 243 input: err, 244 testFunc: apperrors.IsTenantRequired, 245 expectedResult: false, 246 }, 247 { 248 name: "IsNotFoundError", 249 input: err, 250 testFunc: apperrors.IsNotFoundError, 251 expectedResult: false, 252 }, 253 { 254 name: "IsInvalidStatusCondition", 255 input: err, 256 testFunc: apperrors.IsInvalidStatusCondition, 257 expectedResult: false, 258 }, 259 { 260 name: "IsCannotUpdateObjectInManyBundles", 261 input: err, 262 testFunc: apperrors.IsCannotUpdateObjectInManyBundlesError, 263 expectedResult: false, 264 }, 265 } 266 for _, testCase := range testCases { 267 t.Run(testCase.name, func(t *testing.T) { 268 // WHEN 269 output := testCase.testFunc(testCase.input) 270 271 // THEN 272 assert.Equal(t, testCase.expectedResult, output) 273 }) 274 } 275 }) 276 }