go.temporal.io/server@v1.23.0/common/searchattribute/mapper_test.go (about) 1 // The MIT License 2 // 3 // Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. 4 // 5 // Copyright (c) 2020 Uber Technologies, Inc. 6 // 7 // Permission is hereby granted, free of charge, to any person obtaining a copy 8 // of this software and associated documentation files (the "Software"), to deal 9 // in the Software without restriction, including without limitation the rights 10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 // copies of the Software, and to permit persons to whom the Software is 12 // furnished to do so, subject to the following conditions: 13 // 14 // The above copyright notice and this permission notice shall be included in 15 // all copies or substantial portions of the Software. 16 // 17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 // THE SOFTWARE. 24 25 package searchattribute 26 27 import ( 28 "testing" 29 30 "github.com/stretchr/testify/assert" 31 commonpb "go.temporal.io/api/common/v1" 32 "go.temporal.io/api/serviceerror" 33 ) 34 35 func Test_AliasFields(t *testing.T) { 36 mapperProvider := NewTestMapperProvider(&TestMapper{}) 37 38 sa := &commonpb.SearchAttributes{ 39 IndexedFields: map[string]*commonpb.Payload{ 40 "Field1": {Data: []byte("data1")}, 41 "wrong_field": {Data: []byte("data23")}, // Wrong unknown name must be ignored. 42 }, 43 } 44 _, err := AliasFields(mapperProvider, sa, "error-namespace") 45 assert.Error(t, err) 46 var internalErr *serviceerror.Internal 47 assert.ErrorAs(t, err, &internalErr) 48 49 sa = &commonpb.SearchAttributes{ 50 IndexedFields: map[string]*commonpb.Payload{ 51 "Field1": {Data: []byte("data1")}, 52 "wrong_field": {Data: []byte("data23")}, // Wrong unknown name must be ignored. 53 }, 54 } 55 sa, err = AliasFields(mapperProvider, sa, "unknown-namespace") 56 assert.NoError(t, err) 57 assert.Nil(t, sa) 58 59 sa = &commonpb.SearchAttributes{ 60 IndexedFields: map[string]*commonpb.Payload{ 61 "Field1": {Data: []byte("data1")}, 62 "Field2": {Data: []byte("data2")}, 63 "wrong_field": {Data: []byte("data23")}, // Wrong unknown name must be ignored. 64 }, 65 } 66 sa, err = AliasFields(mapperProvider, sa, "test-namespace") 67 assert.NoError(t, err) 68 assert.NotNil(t, sa) 69 assert.Len(t, sa.GetIndexedFields(), 2) 70 assert.EqualValues(t, "data1", sa.GetIndexedFields()["AliasForField1"].GetData()) 71 assert.EqualValues(t, "data2", sa.GetIndexedFields()["AliasForField2"].GetData()) 72 73 // Empty search attributes are not validated with mapper. 74 sa = &commonpb.SearchAttributes{ 75 IndexedFields: nil, 76 } 77 sa, err = AliasFields(mapperProvider, sa, "error-namespace") 78 assert.NoError(t, err) 79 assert.Nil(t, sa) 80 sa, err = AliasFields(mapperProvider, sa, "unknown-namespace") 81 assert.NoError(t, err) 82 assert.Nil(t, sa) 83 84 // Pass through search attributes are not mapped. 85 sa = &commonpb.SearchAttributes{ 86 IndexedFields: map[string]*commonpb.Payload{ 87 "pass-through": {Data: []byte("data1")}, 88 }, 89 } 90 sa, err = AliasFields(mapperProvider, sa, "test-namespace") 91 assert.NoError(t, err) 92 assert.Nil(t, sa) 93 } 94 95 func Test_UnaliasFields(t *testing.T) { 96 mapperProvider := NewTestMapperProvider(&TestMapper{}) 97 98 sa := &commonpb.SearchAttributes{ 99 IndexedFields: map[string]*commonpb.Payload{ 100 "AliasForField1": {Data: []byte("data1")}, 101 }, 102 } 103 _, err := UnaliasFields(mapperProvider, sa, "error-namespace") 104 assert.Error(t, err) 105 var internalErr *serviceerror.Internal 106 assert.ErrorAs(t, err, &internalErr) 107 108 sa = &commonpb.SearchAttributes{ 109 IndexedFields: map[string]*commonpb.Payload{ 110 "AliasForField1": {Data: []byte("data1")}, 111 "AliasForField2": {Data: []byte("data2")}, 112 }, 113 } 114 _, err = UnaliasFields(mapperProvider, sa, "unknown-namespace") 115 assert.Error(t, err) 116 var invalidArgumentErr *serviceerror.InvalidArgument 117 assert.ErrorAs(t, err, &invalidArgumentErr) 118 119 sa = &commonpb.SearchAttributes{ 120 IndexedFields: map[string]*commonpb.Payload{ 121 "AliasForField1": {Data: []byte("data1")}, 122 "AliasForField2": {Data: []byte("data2")}, 123 }, 124 } 125 sa, err = UnaliasFields(mapperProvider, sa, "test-namespace") 126 assert.NoError(t, err) 127 assert.NotNil(t, sa) 128 assert.Len(t, sa.GetIndexedFields(), 2) 129 assert.EqualValues(t, "data1", sa.GetIndexedFields()["Field1"].GetData()) 130 assert.EqualValues(t, "data2", sa.GetIndexedFields()["Field2"].GetData()) 131 132 sa = &commonpb.SearchAttributes{ 133 IndexedFields: map[string]*commonpb.Payload{ 134 "AliasForField1": {Data: []byte("data1")}, 135 "AliasForField2": {Data: []byte("data2")}, 136 "wrong_alias": {Data: []byte("data3")}, 137 }, 138 } 139 _, err = UnaliasFields(mapperProvider, sa, "test-namespace") 140 assert.Error(t, err) 141 assert.ErrorAs(t, err, &invalidArgumentErr) 142 143 // Empty search attributes are not validated with mapper. 144 sa = &commonpb.SearchAttributes{ 145 IndexedFields: nil, 146 } 147 sa, err = UnaliasFields(mapperProvider, sa, "error-namespace") 148 assert.NoError(t, err) 149 assert.Nil(t, sa) 150 sa, err = UnaliasFields(mapperProvider, sa, "unknown-namespace") 151 assert.NoError(t, err) 152 assert.Nil(t, sa) 153 154 // Pass through aliases are not substituted. 155 sa = &commonpb.SearchAttributes{ 156 IndexedFields: map[string]*commonpb.Payload{ 157 "pass-through": {Data: []byte("data1")}, 158 }, 159 } 160 sa, err = UnaliasFields(mapperProvider, sa, "test-namespace") 161 assert.NoError(t, err) 162 assert.Nil(t, sa) 163 }