-
Notifications
You must be signed in to change notification settings - Fork 141
/
Copy pathbatch_test.go
288 lines (271 loc) · 17.4 KB
/
batch_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
package graphql_datasource
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/wundergraph/graphql-go-tools/pkg/engine/resolve"
"github.com/wundergraph/graphql-go-tools/pkg/fastbuffer"
)
func newBufPair(data string, err string) *resolve.BufPair {
bufPair := resolve.NewBufPair()
bufPair.Data.WriteString(data)
if err != "" {
bufPair.Errors.WriteString(err)
}
return bufPair
}
func runTestBatch(t *testing.T, inputs []string, expectedInput string, mappings []inputResponseBufferMappings, batchSize int) {
expectedFastBuf := fastbuffer.New()
expectedFastBuf.WriteBytes([]byte(expectedInput))
expectedBatch := &Batch{
resultedInput: expectedFastBuf,
batchSize: batchSize,
responseMappings: mappings,
}
convertedInputs := make([][]byte, len(inputs))
for i := range inputs {
convertedInputs[i] = []byte(inputs[i])
}
batchFactory := NewBatchFactory()
batch, err := batchFactory.CreateBatch(convertedInputs)
require.NoError(t, err)
assert.Equal(t, expectedBatch, batch)
}
func runTestDemultiplex(t *testing.T, inputs []string, responseBufPair *resolve.BufPair, expectedBufPairs []*resolve.BufPair) {
convertedInputs := make([][]byte, len(inputs))
for i := range inputs {
convertedInputs[i] = []byte(inputs[i])
}
batchFactory := NewBatchFactory()
batch, err := batchFactory.CreateBatch(convertedInputs)
require.NoError(t, err)
gotBufPairs := make([]*resolve.BufPair, len(inputs))
for i := range inputs {
gotBufPairs[i] = resolve.NewBufPair()
}
require.NoError(t, batch.Demultiplex(responseBufPair, gotBufPairs))
assert.Equal(t, expectedBufPairs, gotBufPairs)
}
func TestBatch(t *testing.T) {
t.Run("create batch with unique args", func(t *testing.T) {
runTestBatch(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
},
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"},{"upc":"top-2","__typename":"Product"}]}}}`,
[]inputResponseBufferMappings{
{
responseIndex: 0,
originalInput: []byte(`{"upc":"top-1","__typename":"Product"}`),
assignedBufferIndices: []int{0},
},
{
responseIndex: 1,
originalInput: []byte(`{"upc":"top-2","__typename":"Product"}`),
assignedBufferIndices: []int{1},
},
},
2,
)
})
t.Run("deduplicate the same args", func(t *testing.T) {
runTestBatch(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
},
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
[]inputResponseBufferMappings{
{
responseIndex: 0,
originalInput: []byte(`{"upc":"top-2","__typename":"Product"}`),
assignedBufferIndices: []int{0, 1},
},
},
2,
)
})
t.Run("handle null variables", func(t *testing.T) {
runTestBatch(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
"null",
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-4","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-5","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-6","__typename":"Product"}]}}}`,
},
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"},{"upc":"top-2","__typename":"Product"},{"upc":"top-4","__typename":"Product"},{"upc":"top-5","__typename":"Product"},{"upc":"top-6","__typename":"Product"}]}}}`,
[]inputResponseBufferMappings{
{
responseIndex: 0,
originalInput: []byte(`{"upc":"top-1","__typename":"Product"}`),
assignedBufferIndices: []int{0},
},
{
responseIndex: 1,
originalInput: []byte(`{"upc":"top-2","__typename":"Product"}`),
assignedBufferIndices: []int{1},
},
{
responseIndex: 2,
originalInput: []byte(`null`),
assignedBufferIndices: []int{2},
skip: true,
},
{
responseIndex: 3,
originalInput: []byte(`{"upc":"top-4","__typename":"Product"}`),
assignedBufferIndices: []int{3},
},
{
responseIndex: 4,
originalInput: []byte(`{"upc":"top-5","__typename":"Product"}`),
assignedBufferIndices: []int{4},
},
{
responseIndex: 5,
originalInput: []byte(`{"upc":"top-6","__typename":"Product"}`),
assignedBufferIndices: []int{5},
},
},
6,
)
})
t.Run("deduplicate the same args with overlaps", func(t *testing.T) {
runTestBatch(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"},{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"},{"upc":"top-3","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-3","__typename":"Product"},{"upc":"top-2","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"},{"upc":"top-2","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-3","__typename":"Product"},{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-3","__typename":"Product"}]}}}`,
},
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"},{"upc":"top-1","__typename":"Product"},{"upc":"top-3","__typename":"Product"}]}}}`,
[]inputResponseBufferMappings{
{
responseIndex: 0,
originalInput: []byte(`{"upc":"top-2","__typename":"Product"}`),
assignedBufferIndices: []int{0, 1, 2, 3, 5},
},
{
responseIndex: 1,
originalInput: []byte(`{"upc":"top-1","__typename":"Product"}`),
assignedBufferIndices: []int{0, 3, 4, 6},
},
{
responseIndex: 2,
originalInput: []byte(`{"upc":"top-3","__typename":"Product"}`),
assignedBufferIndices: []int{1, 2, 4, 7},
},
},
8,
)
})
t.Run("create batch with complex inputs", func(t *testing.T) {
runTestBatch(
t,
[]string{ // Entity has multi key: category + name
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"category":"category-1", "name":"Top 1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"category":"category-2", "name":"Top 1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"category":"category-1", "name":"Top 1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"category":"category-2", "name":"Top 2","__typename":"Product"}]}}}`,
},
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"category":"category-1", "name":"Top 1","__typename":"Product"},{"category":"category-2", "name":"Top 1","__typename":"Product"},{"category":"category-2", "name":"Top 2","__typename":"Product"}]}}}`,
[]inputResponseBufferMappings{
{
responseIndex: 0,
originalInput: []byte(`{"category":"category-1", "name":"Top 1","__typename":"Product"}`),
assignedBufferIndices: []int{0, 2},
},
{
responseIndex: 1,
originalInput: []byte(`{"category":"category-2", "name":"Top 1","__typename":"Product"}`),
assignedBufferIndices: []int{1},
},
{
responseIndex: 2,
originalInput: []byte(`{"category":"category-2", "name":"Top 2","__typename":"Product"}`),
assignedBufferIndices: []int{3},
},
},
4,
)
})
}
func TestBatch_Demultiplex(t *testing.T) {
t.Run("demultiplex uniq inputs", func(t *testing.T) {
runTestDemultiplex(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
},
newBufPair(`[{"name":"Name 1", "price": 1.01, "__typename":"Product"},{"name":"Name 2", "price": 2.01, "__typename":"Product"}]`, ""),
[]*resolve.BufPair{
newBufPair(`{"name":"Name 1", "price": 1.01, "__typename":"Product"}`, ""),
newBufPair(`{"name":"Name 2", "price": 2.01, "__typename":"Product"}`, ""),
},
)
})
t.Run("demultiplex deduplicated inputs", func(t *testing.T) {
runTestDemultiplex(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
},
newBufPair(`[{"name":"Name 1", "price": 1.01, "__typename":"Product"},{"name":"Name 2", "price": 2.01, "__typename":"Product"}]`, ""),
[]*resolve.BufPair{
newBufPair(`{"name":"Name 1", "price": 1.01, "__typename":"Product"}`, ""),
newBufPair(`{"name":"Name 2", "price": 2.01, "__typename":"Product"}`, ""),
newBufPair(`{"name":"Name 1", "price": 1.01, "__typename":"Product"}`, ""),
},
)
})
t.Run("demultiplex null inputs", func(t *testing.T) {
runTestDemultiplex(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
"null",
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-4","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-5","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-6","__typename":"Product"}]}}}`,
},
newBufPair(`[{"name":"Name 1","price":1,"__typename":"Product"},{"name":"Name 2","price":2,"__typename":"Product"},{"name":"Name 4","price":4,"__typename":"Product"},{"name":"Name 5","price":5,"__typename":"Product"},{"name":"Name 6","price":6,"__typename":"Product"}]`, ""),
[]*resolve.BufPair{
newBufPair(`{"name":"Name 1","price":1,"__typename":"Product"}`, ""),
newBufPair(`{"name":"Name 2","price":2,"__typename":"Product"}`, ""),
newBufPair(`null`, ""),
newBufPair(`{"name":"Name 4","price":4,"__typename":"Product"}`, ""),
newBufPair(`{"name":"Name 5","price":5,"__typename":"Product"}`, ""),
newBufPair(`{"name":"Name 6","price":6,"__typename":"Product"}`, ""),
},
)
})
t.Run("demultiplex response with error", func(t *testing.T) {
runTestDemultiplex(
t,
[]string{
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-1","__typename":"Product"}]}}}`,
`{"method":"POST","url":"http://product.service","body":{"query":"query($representations: [_Any!]!){_entities(representations: $representations){... on Product {name price}}}","variables":{"representations":[{"upc":"top-2","__typename":"Product"}]}}}`,
},
newBufPair(`[null,{"name":"Name 2", "price": 2.01, "__typename":"Product"}]`, `{"message":"errorMessage"}`),
[]*resolve.BufPair{
newBufPair("null", `{"message":"errorMessage"}`),
newBufPair(`{"name":"Name 2", "price": 2.01, "__typename":"Product"}`, ""),
},
)
})
}