github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/persistence/sql_error_mapper_test.go (about) 1 package persistence_test 2 3 import ( 4 "context" 5 "database/sql" 6 "errors" 7 "testing" 8 9 "github.com/kyma-incubator/compass/components/director/pkg/resource" 10 11 "github.com/kyma-incubator/compass/components/director/pkg/apperrors" 12 "github.com/kyma-incubator/compass/components/director/pkg/persistence" 13 "github.com/lib/pq" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestMapSQLError(t *testing.T) { 19 //GIVEN 20 testCases := []struct { 21 Name string 22 Error error 23 AssertFunc func(err error) bool 24 }{ 25 { 26 Name: "SQL NoErrRows error", 27 Error: sql.ErrNoRows, 28 AssertFunc: apperrors.IsNotFoundError, 29 }, 30 { 31 Name: "Standard error", 32 Error: errors.New("test error"), 33 AssertFunc: isInternalServerErr(t, "Internal Server Error: Unexpected error while executing SQL query"), 34 }, 35 { 36 Name: "Timeout error", 37 Error: context.DeadlineExceeded, 38 AssertFunc: isInternalServerErr(t, "Internal Server Error: Maximum processing timeout reached"), 39 }, 40 { 41 Name: "Not null violation", 42 Error: &pq.Error{Code: persistence.NotNullViolation}, 43 AssertFunc: apperrors.IsNewNotNullViolationError, 44 }, 45 { 46 Name: "Check violation", 47 Error: &pq.Error{Code: persistence.CheckViolation}, 48 AssertFunc: apperrors.IsNewCheckViolationError, 49 }, 50 { 51 Name: "Unique violation error", 52 Error: &pq.Error{Code: persistence.UniqueViolation}, 53 AssertFunc: apperrors.IsNotUniqueError, 54 }, 55 { 56 Name: "Foreign key violation error", 57 Error: &pq.Error{Code: persistence.ForeignKeyViolation}, 58 AssertFunc: apperrors.IsNewInvalidOperationError, 59 }, 60 { 61 Name: "Not mapper sql error", 62 Error: &pq.Error{Code: "123", Message: "SQL fault"}, 63 AssertFunc: isInternalServerErr(t, "Internal Server Error: Unexpected error while executing SQL query"), 64 }, 65 } 66 67 for _, testCase := range testCases { 68 t.Run(testCase.Name, func(t *testing.T) { 69 // WHEN 70 err := persistence.MapSQLError(context.TODO(), testCase.Error, resource.Application, resource.Create, "testErr") 71 72 // THEN 73 require.Error(t, err) 74 assert.True(t, testCase.AssertFunc(err)) 75 }) 76 77 t.Run(testCase.Name, func(t *testing.T) { 78 // WHEN 79 err := persistence.MapSQLError(context.TODO(), testCase.Error, resource.Application, resource.Delete, "testErr") 80 81 // THEN 82 require.Error(t, err) 83 assert.True(t, testCase.AssertFunc(err)) 84 }) 85 } 86 87 t.Run("Error is nil", func(t *testing.T) { 88 // WHEN 89 err := persistence.MapSQLError(context.TODO(), nil, resource.Application, resource.Create, "test: %s", "test") 90 91 // THEN 92 require.NoError(t, err) 93 }) 94 } 95 96 func isInternalServerErr(t *testing.T, expectedErrMsg string) func(err error) bool { 97 return func(err error) bool { 98 return assert.Equal(t, err.Error(), expectedErrMsg) 99 } 100 }