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  }