github.com/weaviate/weaviate@v1.24.6/adapters/handlers/grpc/v1/mapping_test.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package v1 13 14 import ( 15 "testing" 16 17 "github.com/weaviate/weaviate/entities/models" 18 19 "github.com/stretchr/testify/require" 20 "github.com/weaviate/weaviate/entities/schema" 21 pb "github.com/weaviate/weaviate/grpc/generated/protocol/v1" 22 ) 23 24 type innerTest struct { 25 datatype schema.DataType 26 out *pb.Value 27 shouldError bool 28 } 29 30 func makeTestList(succeedingInnerTests map[schema.DataType]*pb.Value) []innerTest { 31 dtypes := append(schema.PrimitiveDataTypes, schema.DeprecatedPrimitiveDataTypes...) 32 list := make([]innerTest, len(dtypes)) 33 for idx := range dtypes { 34 out, ok := succeedingInnerTests[dtypes[idx]] 35 if ok { 36 list[idx] = innerTest{ 37 datatype: dtypes[idx], 38 out: out, 39 shouldError: false, 40 } 41 } else { 42 list[idx] = innerTest{ 43 datatype: dtypes[idx], 44 out: nil, 45 shouldError: true, 46 } 47 } 48 } 49 return list 50 } 51 52 func TestNewPrimitiveValue(t *testing.T) { 53 float_val := float32(1.1) 54 55 tests := []struct { 56 name string 57 in any 58 tests []innerTest 59 }{ 60 { 61 name: "bools", 62 in: []bool{true, false}, 63 tests: makeTestList(map[schema.DataType]*pb.Value{ 64 schema.DataTypeBooleanArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 65 {Kind: &pb.Value_BoolValue{BoolValue: true}}, 66 {Kind: &pb.Value_BoolValue{BoolValue: false}}, 67 }}}}, 68 }), 69 }, 70 { 71 name: "strings", 72 in: []string{"a string", "another string"}, 73 tests: makeTestList(map[schema.DataType]*pb.Value{ 74 schema.DataTypeDateArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 75 {Kind: &pb.Value_DateValue{DateValue: "a string"}}, 76 {Kind: &pb.Value_DateValue{DateValue: "another string"}}, 77 }}}}, 78 schema.DataTypeStringArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 79 {Kind: &pb.Value_StringValue{StringValue: "a string"}}, 80 {Kind: &pb.Value_StringValue{StringValue: "another string"}}, 81 }}}}, 82 schema.DataTypeTextArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 83 {Kind: &pb.Value_StringValue{StringValue: "a string"}}, 84 {Kind: &pb.Value_StringValue{StringValue: "another string"}}, 85 }}}}, 86 schema.DataTypeUUIDArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 87 {Kind: &pb.Value_UuidValue{UuidValue: "a string"}}, 88 {Kind: &pb.Value_UuidValue{UuidValue: "another string"}}, 89 }}}}, 90 }), 91 }, 92 { 93 name: "float64s", 94 in: []float64{1.1, 2.2, 3.3}, 95 tests: makeTestList(map[schema.DataType]*pb.Value{ 96 schema.DataTypeNumberArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 97 {Kind: &pb.Value_NumberValue{NumberValue: 1.1}}, 98 {Kind: &pb.Value_NumberValue{NumberValue: 2.2}}, 99 {Kind: &pb.Value_NumberValue{NumberValue: 3.3}}, 100 }}}}, 101 schema.DataTypeIntArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{ 102 {Kind: &pb.Value_IntValue{IntValue: 1}}, 103 {Kind: &pb.Value_IntValue{IntValue: 2}}, 104 {Kind: &pb.Value_IntValue{IntValue: 3}}, 105 }}}}, 106 }), 107 }, 108 { 109 name: "empty array", 110 in: []interface{}{}, 111 tests: makeTestList(map[schema.DataType]*pb.Value{ 112 schema.DataTypeBooleanArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 113 schema.DataTypeDateArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 114 schema.DataTypeNumberArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 115 schema.DataTypeIntArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 116 schema.DataTypeStringArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 117 schema.DataTypeTextArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 118 schema.DataTypeUUIDArray: {Kind: &pb.Value_ListValue{ListValue: &pb.ListValue{Values: []*pb.Value{}}}}, 119 }), 120 }, 121 { 122 name: "bool", 123 in: true, 124 tests: makeTestList(map[schema.DataType]*pb.Value{ 125 schema.DataTypeBoolean: {Kind: &pb.Value_BoolValue{BoolValue: true}}, 126 }), 127 }, 128 { 129 name: "string", 130 in: "a string", 131 tests: makeTestList(map[schema.DataType]*pb.Value{ 132 schema.DataTypeDate: {Kind: &pb.Value_DateValue{DateValue: "a string"}}, 133 schema.DataTypeString: {Kind: &pb.Value_StringValue{StringValue: "a string"}}, 134 schema.DataTypeText: {Kind: &pb.Value_StringValue{StringValue: "a string"}}, 135 schema.DataTypeUUID: {Kind: &pb.Value_UuidValue{UuidValue: "a string"}}, 136 schema.DataTypeBlob: {Kind: &pb.Value_BlobValue{BlobValue: "a string"}}, 137 }), 138 }, 139 { 140 name: "float64", 141 in: 1.1, 142 tests: makeTestList(map[schema.DataType]*pb.Value{ 143 schema.DataTypeNumber: {Kind: &pb.Value_NumberValue{NumberValue: 1.1}}, 144 schema.DataTypeInt: {Kind: &pb.Value_IntValue{IntValue: 1}}, 145 }), 146 }, 147 { 148 name: "geo", 149 in: &models.GeoCoordinates{Longitude: &float_val, Latitude: &float_val}, 150 tests: makeTestList(map[schema.DataType]*pb.Value{ 151 schema.DataTypeGeoCoordinates: {Kind: &pb.Value_GeoValue{GeoValue: &pb.GeoCoordinate{Latitude: float_val, Longitude: float_val}}}, 152 }), 153 }, 154 { 155 name: "phone number", 156 in: &models.PhoneNumber{Input: "1234567890"}, 157 tests: makeTestList(map[schema.DataType]*pb.Value{ 158 schema.DataTypePhoneNumber: {Kind: &pb.Value_PhoneValue{PhoneValue: &pb.PhoneNumber{Input: "1234567890"}}}, 159 }), 160 }, 161 } 162 163 for _, tt := range tests { 164 for _, test := range tt.tests { 165 out, err := NewPrimitiveValue(tt.in, test.datatype) 166 if test.shouldError { 167 if err == nil { 168 t.Logf("expected an error for %v and %s", tt.in, test.datatype) 169 } 170 require.Error(t, err) 171 } else { 172 require.NoError(t, err) 173 require.Equal(t, test.out, out) 174 } 175 } 176 } 177 }