github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/inputvalidation/directive_test.go (about)

     1  package inputvalidation
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  
     8  	validation "github.com/go-ozzo/ozzo-validation/v4"
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  type testStruct struct {
    15  	returnErr error
    16  }
    17  
    18  func (ts testStruct) Validate() error {
    19  	if ts.returnErr != nil {
    20  		return validation.Errors{"field": ts.returnErr}
    21  	}
    22  	return nil
    23  }
    24  
    25  func TestDirective_Validate(t *testing.T) {
    26  	validatorDirective := NewDirective()
    27  	testErr := errors.New("testError")
    28  	ctx := context.TODO()
    29  	t.Run("success", func(t *testing.T) {
    30  		//GIVEN
    31  		ts := testStruct{}
    32  		// WHEN
    33  		result, err := validatorDirective.Validate(ctx, ts, next(ts, nil))
    34  		// THEN
    35  		require.NoError(t, err)
    36  		require.Equal(t, ts, result)
    37  	})
    38  
    39  	t.Run("object is invalid", func(t *testing.T) {
    40  		//GIVEN
    41  		ts := testStruct{returnErr: testErr}
    42  		// WHEN
    43  		result, err := validatorDirective.Validate(ctx, ts, next(ts, nil))
    44  		// THEN
    45  		require.Error(t, err)
    46  		assert.Contains(t, err.Error(), "field=testError")
    47  		assert.Contains(t, err.Error(), "Invalid data testStruct")
    48  		require.Equal(t, ts, result)
    49  	})
    50  
    51  	t.Run("object is not validatable", func(t *testing.T) {
    52  		_, err := validatorDirective.Validate(ctx, nil, next("test", nil))
    53  		// THEN
    54  		require.Error(t, err)
    55  		assert.Contains(t, err.Error(), "object is not validatable")
    56  	})
    57  
    58  	t.Run("next resolver return err", func(t *testing.T) {
    59  		// WHEN
    60  		_, err := validatorDirective.Validate(ctx, nil, next(nil, testErr))
    61  		// THEN
    62  		require.Error(t, err)
    63  	})
    64  }
    65  
    66  func next(obj interface{}, testErr error) func(ctx context.Context) (interface{}, error) {
    67  	return func(ctx context.Context) (i interface{}, e error) {
    68  		return obj, testErr
    69  	}
    70  }