Skip to content
Snippets Groups Projects
Select Git revision
  • 04774659f2ff36c4b949c465c516f1b6d61c20ca
  • master default protected
  • refactor/PRXS-3053-Files
  • feature/PRXS-3143-3235-ReferenceOptions
  • feature/PRXS-3421-ImplementNewRefAPI
  • feature/PRXS-3143-LimitReferenceFields
  • feature/PRXS-3234-FeaturePruneIdents
  • feature/3149-LocaleCodeAsID-Feature
  • feature/PRXS-3383-CollectionsRankSortAPI
  • PRXS-3421-RecursiveReferences
  • feature/PRXS-3383-CollectionsSort
  • feature/3109-SerializeFeature
  • release/0.33
  • feature/3109-RecoverySchema
  • feature/3109-feature
  • fix/PRXS-3369-ValidateFields
  • refactor/PRXS-3306-MovePkgGroup1
  • refactor/6-pkg-refactor-expr
  • fix/PRXS-3360-TemplateBuilderPatch
  • feature/3293-MongoV2
  • feature/3272-GoVersionUp
  • v0.33.1
  • v0.32.0
  • v0.31.1
  • v0.31.0
  • v0.30.0
  • v0.29.0
  • v0.28.0
  • v0.27.0-alpha.1+16
  • v0.27.0-alpha.1+15
  • v0.27.0-alpha.1+14
  • v0.27.0-alpha.1+13
  • v0.27.0-alpha.1+12
  • v0.27.0-alpha.1+11
  • v0.27.0-alpha.1+10
  • v0.27.0-alpha.1+9
  • v0.27.0-alpha.1+8
  • v0.27.0-alpha.1+7
  • v0.27.0-alpha.1+6
  • v0.27.0-alpha.1+5
  • v0.27.0-alpha.1+4
41 results

array_test.go

Blame
  • user avatar
    Danis Kirasirov authored
    04774659
    History
    array_test.go 9.06 KiB
    package field
    
    import (
    	"context"
    	"fmt"
    	"testing"
    
    	"github.com/stretchr/testify/assert"
    	"github.com/stretchr/testify/require"
    )
    
    func TestArrayField_Decode(t *testing.T) {
    	tests := []struct {
    		name    string
    		field   *Field
    		data    interface{}
    		want    interface{}
    		wantErr bool
    	}{
    		{
    			"Correct",
    			Array(Number("float")),
    			[]interface{}{1.0, 2.0},
    			[]interface{}{1.0, 2.0},
    			false,
    		},
    		{
    			"With object inside with nil-data",
    			Array(
    				Object("a", String(),
    					"b", String()),
    			),
    			nil,
    			nil,
    			false,
    		},
    		{
    			"With object inside with data",
    			Array(
    				Object("a", String(),
    					"b", String()),
    			),
    			[]interface{}{map[string]interface{}{"a": "1", "b": "2"}},
    			[]interface{}{map[string]interface{}{"a": "1", "b": "2"}},
    			false,
    		},
    		{
    			"Incorrect type",
    			Array(Number("int")),
    			"1 2 3",
    			"decode error: incorrect type: string, expected array or slice",
    			true,
    		},
    	}
    	for _, tt := range tests {
    		t.Run(tt.name, func(t *testing.T) {
    			got, err := Decode(context.Background(), tt.field, tt.data)
    			if tt.wantErr {
    				require.Error(t, err)
    				assert.EqualError(t, err, tt.want.(string), fmt.Sprintf("Decode() error = %v, want %v", err, tt.want.(string)))
    			}
    			if !tt.wantErr {
    				require.NoError(t, err)
    				assert.ElementsMatch(t, got, tt.want, fmt.Sprintf("Decode() got = %v, want %v", got, tt.want))
    			}
    		})
    	}
    }
    
    func TestArrayField_Encode(t *testing.T) {
    	tests := []struct {
    		name    string
    		field   *Field
    		data    interface{}
    		want    interface{}
    		wantErr bool
    	}{
    		{
    			"Correct",
    			Array(Number("float")),
    			[]interface{}{1.0, 2.0},
    			[]interface{}{1.0, 2.0},
    			false,
    		},
    		{
    			"Incorrect type",
    			Array(Number("int")),
    			"1 2 3",
    			"encode error: incorrect type: string, expected array or slice",
    			true,
    		},
    	}
    	for _, tt := range tests {
    		t.Run(tt.name, func(t *testing.T) {
    			got, err := Encode(context.Background(), tt.field, tt.data)
    			if tt.wantErr {
    				require.Error(t, err)
    				assert.EqualError(t, err, tt.want.(string), fmt.Sprintf("Decode() error = %v, want %v", err, tt.want.(string)))
    			}
    			if !tt.wantErr {
    				require.NoError(t, err)
    				assert.ElementsMatch(t, got, tt.want, fmt.Sprintf("Decode() got = %v, want %v", got, tt.want))
    			}
    		})
    	}
    }
    
    func TestArrayType_Walk(t *testing.T) {
    	tests := []struct {
    		name    string
    		field   *Field
    		v       interface{}
    		fn      WalkFunc
    		opts    *WalkOptions
    		want    interface{}
    		want1   bool
    		wantErr assert.ErrorAssertionFunc
    	}{
    		{
    			name:    "With nil data and WalkSchema = false",
    			field:   Array(Object("a", String(), "b", String())),
    			v:       nil,
    			opts:    &WalkOptions{WalkSchema: false},
    			want:    nil,
    			want1:   false,
    			wantErr: assert.NoError,
    		},
    		{
    			name:  "With nil data and WalkSchema = true",
    			field: Array(Object("a", String(), "b", String())),
    			v:     nil,
    			opts:  &WalkOptions{WalkSchema: true},
    			want:  nil,
    			want1: false,
    			fn: func(_ context.Context, _ *Field, _ interface{}) (WalkFuncResult, error) {
    				return WalkFuncResult{}, nil
    			},
    			wantErr: assert.NoError,
    		},
    		{
    			name:  "With empty data and WalkSchema = false",
    			field: Array(Object("a", String(), "b", String())),
    			v:     []interface{}{map[string]interface{}{}},
    			opts:  &WalkOptions{WalkSchema: false},
    			fn: func(ctx context.Context, fld *Field, v interface{}) (result WalkFuncResult, err error) {
    				return WalkFuncResult{}, err
    			},
    			want:    []interface{}{map[string]interface{}{}},
    			want1:   false,
    			wantErr: assert.NoError,
    		},
    		{
    			name:  "With data and WalkSchema = false",
    			field: Array(Object("a", String(), "b", String())),
    			v:     []interface{}{map[string]interface{}{"a": "1", "b": "2"}},
    			opts:  &WalkOptions{WalkSchema: false},
    			fn: func(ctx context.Context, fld *Field, v interface{}) (result WalkFuncResult, err error) {
    				return WalkFuncResult{}, err
    			},
    			want:    []interface{}{map[string]interface{}{"a": "1", "b": "2"}},
    			want1:   false,
    			wantErr: assert.NoError,
    		},
    	}
    	for _, tt := range tests {
    		t.Run(tt.name, func(t *testing.T) {
    			ar := ArrayType{}
    			got, got1, err := ar.Walk(context.Background(), tt.field, tt.v, tt.fn, tt.opts)
    			if !tt.wantErr(t, err, fmt.Sprintf("Walk(%v, %v, %v, %v)", tt.field, tt.v, tt.fn, tt.opts)) {
    				return
    			}
    			assert.Equalf(t, tt.want, got, "Walk(%v, %v, %v, %v)", tt.field, tt.v, tt.fn, tt.opts)
    			assert.Equalf(t, tt.want1, got1, "Walk(%v, %v, %v, %v)", tt.field, tt.v, tt.fn, tt.opts)
    		})
    	}
    }
    
    type customFloat float64
    type customInt int
    type customStr string
    type customMap map[string]interface{}
    
    func TestArrayField_WithType(t *testing.T) {
    	t.Run("Nil", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Number("float")), nil)
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, nil)
    
    		got, err = Encode(context.Background(), Array(Number("float")), nil)
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, nil)
    	})
    	t.Run("With []float64", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Number("float")), []float64{1.0, 2.0})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{1.0, 2.0})
    
    		got, err = Encode(context.Background(), Array(Number("float")), []float64{1.0, 2.0})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{1.0, 2.0})
    	})
    	t.Run("With []int", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Number("int")), []int{1, 2})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{int64(1), int64(2)})
    
    		got, err = Encode(context.Background(), Array(Number("int")), []int{1, 2})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{int64(1), int64(2)})
    	})
    	t.Run("With []string", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(String()), []string{"1", "2"})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{"1", "2"})
    
    		got, err = Encode(context.Background(), Array(String()), []string{"1", "2"})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{"1", "2"})
    	})
    	t.Run("With []map", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Object("a", String(), "b", String())),
    			[]map[string]interface{}{{"a": "1", "b": "2"}})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}})
    
    		got, err = Encode(context.Background(), Array(Object("a", String(), "b", String())),
    			[]map[string]interface{}{{"a": "1", "b": "2"}})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}})
    	})
    	t.Run("With []customFloat", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Number("float")), []customFloat{1.0, 2.0})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{1.0, 2.0})
    
    		got, err = Encode(context.Background(), Array(Number("float")), []customFloat{1.0, 2.0})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{1.0, 2.0})
    	})
    	t.Run("With []customInt", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Number("int")), []customInt{1, 2})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{int64(1), int64(2)})
    
    		got, err = Encode(context.Background(), Array(Number("int")), []customInt{1, 2})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{int64(1), int64(2)})
    	})
    	t.Run("With []customStr", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(String()), []customStr{"1", "2"})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{"1", "2"})
    
    		got, err = Encode(context.Background(), Array(String()), []customStr{"1", "2"})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{"1", "2"})
    	})
    	t.Run("With []customMap", func(t *testing.T) {
    		got, err := Decode(context.Background(), Array(Object("a", String(), "b", String())),
    			[]customMap{{"a": "1", "b": "2"}})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}})
    
    		got, err = Encode(context.Background(), Array(Object("a", String(), "b", String())),
    			[]customMap{{"a": "1", "b": "2"}})
    		require.NoError(t, err)
    		assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}})
    	})
    }
    
    func TestArrayField_ListFields(t *testing.T) {
    	tests := []struct {
    		name   string
    		field  *Field
    		filter FieldFilterFunc
    		want   []*Field
    	}{
    		{
    			name:  "Without filter",
    			field: Array(Number("number")),
    			want:  []*Field{Number("number")},
    		},
    		{
    			name:   "With filter positive",
    			field:  Array(Number("number").SetTextSearch(true)),
    			filter: func(f *Field) bool { return f.TextSearch },
    			want:   []*Field{Number("number").SetTextSearch(true)},
    		},
    		{
    			name:   "With filter negative",
    			field:  Array(Number("float")),
    			filter: func(f *Field) bool { return f.TextSearch },
    			want:   nil,
    		},
    	}
    	for _, tt := range tests {
    		t.Run(tt.name, func(t *testing.T) {
    			var filters []FieldFilterFunc
    			if tt.filter != nil {
    				filters = append(filters, tt.filter)
    			}
    			got := tt.field.ListFields(filters...)
    			require.Equal(t, tt.want, got)
    		})
    	}
    }