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  }