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  }