UNPKG

28.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var lodash_1 = require("lodash");
5var graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
6var apollo_utilities_1 = require("apollo-utilities");
7var __1 = require("../");
8var readFromStore_1 = require("../readFromStore");
9var objectCache_1 = require("../objectCache");
10var fragmentMatcherFunction = new __1.HeuristicFragmentMatcher().match;
11var diffAgainstStore_1 = require("./diffAgainstStore");
12describe('reading from the store', function () {
13 var reader = new readFromStore_1.StoreReader();
14 it('runs a nested query with proper fragment fields in arrays', function () {
15 diffAgainstStore_1.withError(function () {
16 var store = objectCache_1.defaultNormalizedCacheFactory({
17 ROOT_QUERY: {
18 __typename: 'Query',
19 nestedObj: { type: 'id', id: 'abcde', generated: false },
20 },
21 abcde: {
22 id: 'abcde',
23 innerArray: [
24 { type: 'id', generated: true, id: 'abcde.innerArray.0' },
25 ],
26 },
27 'abcde.innerArray.0': {
28 id: 'abcdef',
29 someField: 3,
30 },
31 });
32 var queryResult = reader.readQueryFromStore({
33 store: store,
34 query: graphql_tag_1.default(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n {\n ... on DummyQuery {\n nestedObj {\n innerArray {\n id\n otherField\n }\n }\n }\n ... on Query {\n nestedObj {\n innerArray {\n id\n someField\n }\n }\n }\n ... on DummyQuery2 {\n nestedObj {\n innerArray {\n id\n otherField2\n }\n }\n }\n }\n "], ["\n {\n ... on DummyQuery {\n nestedObj {\n innerArray {\n id\n otherField\n }\n }\n }\n ... on Query {\n nestedObj {\n innerArray {\n id\n someField\n }\n }\n }\n ... on DummyQuery2 {\n nestedObj {\n innerArray {\n id\n otherField2\n }\n }\n }\n }\n "]))),
35 fragmentMatcherFunction: fragmentMatcherFunction,
36 });
37 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
38 nestedObj: {
39 innerArray: [{ id: 'abcdef', someField: 3 }],
40 },
41 });
42 }, /queries contain union or interface types/);
43 });
44 it('rejects malformed queries', function () {
45 expect(function () {
46 reader.readQueryFromStore({
47 store: objectCache_1.defaultNormalizedCacheFactory(),
48 query: graphql_tag_1.default(templateObject_2 || (templateObject_2 = tslib_1.__makeTemplateObject(["\n query {\n name\n }\n\n query {\n address\n }\n "], ["\n query {\n name\n }\n\n query {\n address\n }\n "]))),
49 });
50 }).toThrowError(/2 operations/);
51 expect(function () {
52 reader.readQueryFromStore({
53 store: objectCache_1.defaultNormalizedCacheFactory(),
54 query: graphql_tag_1.default(templateObject_3 || (templateObject_3 = tslib_1.__makeTemplateObject(["\n fragment x on y {\n name\n }\n "], ["\n fragment x on y {\n name\n }\n "]))),
55 });
56 }).toThrowError(/contain a query/);
57 });
58 it('runs a basic query', function () {
59 var result = {
60 id: 'abcd',
61 stringField: 'This is a string!',
62 numberField: 5,
63 nullField: null,
64 };
65 var store = objectCache_1.defaultNormalizedCacheFactory({
66 ROOT_QUERY: result,
67 });
68 var queryResult = reader.readQueryFromStore({
69 store: store,
70 query: graphql_tag_1.default(templateObject_4 || (templateObject_4 = tslib_1.__makeTemplateObject(["\n query {\n stringField\n numberField\n }\n "], ["\n query {\n stringField\n numberField\n }\n "]))),
71 });
72 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
73 stringField: result['stringField'],
74 numberField: result['numberField'],
75 });
76 });
77 it('runs a basic query with arguments', function () {
78 var query = graphql_tag_1.default(templateObject_5 || (templateObject_5 = tslib_1.__makeTemplateObject(["\n query {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "], ["\n query {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "])));
79 var variables = {
80 intArg: 5,
81 floatArg: 3.14,
82 stringArg: 'This is a string!',
83 };
84 var store = objectCache_1.defaultNormalizedCacheFactory({
85 ROOT_QUERY: {
86 id: 'abcd',
87 nullField: null,
88 'numberField({"floatArg":3.14,"intArg":5})': 5,
89 'stringField({"arg":"This is a string!"})': 'Heyo',
90 },
91 });
92 var result = reader.readQueryFromStore({
93 store: store,
94 query: query,
95 variables: variables,
96 });
97 expect(apollo_utilities_1.stripSymbols(result)).toEqual({
98 id: 'abcd',
99 nullField: null,
100 numberField: 5,
101 stringField: 'Heyo',
102 });
103 });
104 it('runs a basic query with custom directives', function () {
105 var query = graphql_tag_1.default(templateObject_6 || (templateObject_6 = tslib_1.__makeTemplateObject(["\n query {\n id\n firstName @include(if: true)\n lastName @upperCase\n birthDate @dateFormat(format: \"DD-MM-YYYY\")\n }\n "], ["\n query {\n id\n firstName @include(if: true)\n lastName @upperCase\n birthDate @dateFormat(format: \"DD-MM-YYYY\")\n }\n "])));
106 var store = objectCache_1.defaultNormalizedCacheFactory({
107 ROOT_QUERY: {
108 id: 'abcd',
109 firstName: 'James',
110 'lastName@upperCase': 'BOND',
111 'birthDate@dateFormat({"format":"DD-MM-YYYY"})': '20-05-1940',
112 },
113 });
114 var result = reader.readQueryFromStore({
115 store: store,
116 query: query,
117 });
118 expect(apollo_utilities_1.stripSymbols(result)).toEqual({
119 id: 'abcd',
120 firstName: 'James',
121 lastName: 'BOND',
122 birthDate: '20-05-1940',
123 });
124 });
125 it('runs a basic query with default values for arguments', function () {
126 var query = graphql_tag_1.default(templateObject_7 || (templateObject_7 = tslib_1.__makeTemplateObject(["\n query someBigQuery(\n $stringArg: String = \"This is a default string!\"\n $intArg: Int = 0\n $floatArg: Float\n ) {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "], ["\n query someBigQuery(\n $stringArg: String = \"This is a default string!\"\n $intArg: Int = 0\n $floatArg: Float\n ) {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "])));
127 var variables = {
128 floatArg: 3.14,
129 };
130 var store = objectCache_1.defaultNormalizedCacheFactory({
131 ROOT_QUERY: {
132 id: 'abcd',
133 nullField: null,
134 'numberField({"floatArg":3.14,"intArg":0})': 5,
135 'stringField({"arg":"This is a default string!"})': 'Heyo',
136 },
137 });
138 var result = reader.readQueryFromStore({
139 store: store,
140 query: query,
141 variables: variables,
142 });
143 expect(apollo_utilities_1.stripSymbols(result)).toEqual({
144 id: 'abcd',
145 nullField: null,
146 numberField: 5,
147 stringField: 'Heyo',
148 });
149 });
150 it('runs a nested query', function () {
151 var result = {
152 id: 'abcd',
153 stringField: 'This is a string!',
154 numberField: 5,
155 nullField: null,
156 nestedObj: {
157 id: 'abcde',
158 stringField: 'This is a string too!',
159 numberField: 6,
160 nullField: null,
161 },
162 };
163 var store = objectCache_1.defaultNormalizedCacheFactory({
164 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj')), {
165 nestedObj: {
166 type: 'id',
167 id: 'abcde',
168 generated: false,
169 },
170 }),
171 abcde: result.nestedObj,
172 });
173 var queryResult = reader.readQueryFromStore({
174 store: store,
175 query: graphql_tag_1.default(templateObject_8 || (templateObject_8 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nestedObj {\n stringField\n numberField\n }\n }\n "], ["\n {\n stringField\n numberField\n nestedObj {\n stringField\n numberField\n }\n }\n "]))),
176 });
177 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
178 stringField: 'This is a string!',
179 numberField: 5,
180 nestedObj: {
181 stringField: 'This is a string too!',
182 numberField: 6,
183 },
184 });
185 });
186 it('runs a nested query with multiple fragments', function () {
187 var result = {
188 id: 'abcd',
189 stringField: 'This is a string!',
190 numberField: 5,
191 nullField: null,
192 nestedObj: {
193 id: 'abcde',
194 stringField: 'This is a string too!',
195 numberField: 6,
196 nullField: null,
197 },
198 deepNestedObj: {
199 stringField: 'This is a deep string',
200 numberField: 7,
201 nullField: null,
202 },
203 nullObject: null,
204 __typename: 'Item',
205 };
206 var store = objectCache_1.defaultNormalizedCacheFactory({
207 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj', 'deepNestedObj')), {
208 __typename: 'Query',
209 nestedObj: {
210 type: 'id',
211 id: 'abcde',
212 generated: false,
213 },
214 }),
215 abcde: lodash_1.assign({}, result.nestedObj, {
216 deepNestedObj: {
217 type: 'id',
218 id: 'abcdef',
219 generated: false,
220 },
221 }),
222 abcdef: result.deepNestedObj,
223 });
224 var queryResult = reader.readQueryFromStore({
225 store: store,
226 query: graphql_tag_1.default(templateObject_9 || (templateObject_9 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nullField\n ... on Query {\n nestedObj {\n stringField\n nullField\n deepNestedObj {\n stringField\n nullField\n }\n }\n }\n ... on Query {\n nestedObj {\n numberField\n nullField\n deepNestedObj {\n numberField\n nullField\n }\n }\n }\n ... on Query {\n nullObject\n }\n }\n "], ["\n {\n stringField\n numberField\n nullField\n ... on Query {\n nestedObj {\n stringField\n nullField\n deepNestedObj {\n stringField\n nullField\n }\n }\n }\n ... on Query {\n nestedObj {\n numberField\n nullField\n deepNestedObj {\n numberField\n nullField\n }\n }\n }\n ... on Query {\n nullObject\n }\n }\n "]))),
227 });
228 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
229 stringField: 'This is a string!',
230 numberField: 5,
231 nullField: null,
232 nestedObj: {
233 stringField: 'This is a string too!',
234 numberField: 6,
235 nullField: null,
236 deepNestedObj: {
237 stringField: 'This is a deep string',
238 numberField: 7,
239 nullField: null,
240 },
241 },
242 nullObject: null,
243 });
244 });
245 it('runs a nested query with an array without IDs', function () {
246 var result = {
247 id: 'abcd',
248 stringField: 'This is a string!',
249 numberField: 5,
250 nullField: null,
251 nestedArray: [
252 {
253 stringField: 'This is a string too!',
254 numberField: 6,
255 nullField: null,
256 },
257 {
258 stringField: 'This is a string also!',
259 numberField: 7,
260 nullField: null,
261 },
262 ],
263 };
264 var store = objectCache_1.defaultNormalizedCacheFactory({
265 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
266 nestedArray: [
267 { type: 'id', generated: true, id: 'abcd.nestedArray.0' },
268 { type: 'id', generated: true, id: 'abcd.nestedArray.1' },
269 ],
270 }),
271 'abcd.nestedArray.0': result.nestedArray[0],
272 'abcd.nestedArray.1': result.nestedArray[1],
273 });
274 var queryResult = reader.readQueryFromStore({
275 store: store,
276 query: graphql_tag_1.default(templateObject_10 || (templateObject_10 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nestedArray {\n stringField\n numberField\n }\n }\n "], ["\n {\n stringField\n numberField\n nestedArray {\n stringField\n numberField\n }\n }\n "]))),
277 });
278 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
279 stringField: 'This is a string!',
280 numberField: 5,
281 nestedArray: [
282 {
283 stringField: 'This is a string too!',
284 numberField: 6,
285 },
286 {
287 stringField: 'This is a string also!',
288 numberField: 7,
289 },
290 ],
291 });
292 });
293 it('runs a nested query with an array without IDs and a null', function () {
294 var result = {
295 id: 'abcd',
296 stringField: 'This is a string!',
297 numberField: 5,
298 nullField: null,
299 nestedArray: [
300 null,
301 {
302 stringField: 'This is a string also!',
303 numberField: 7,
304 nullField: null,
305 },
306 ],
307 };
308 var store = objectCache_1.defaultNormalizedCacheFactory({
309 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
310 nestedArray: [
311 null,
312 { type: 'id', generated: true, id: 'abcd.nestedArray.1' },
313 ],
314 }),
315 'abcd.nestedArray.1': result.nestedArray[1],
316 });
317 var queryResult = reader.readQueryFromStore({
318 store: store,
319 query: graphql_tag_1.default(templateObject_11 || (templateObject_11 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nestedArray {\n stringField\n numberField\n }\n }\n "], ["\n {\n stringField\n numberField\n nestedArray {\n stringField\n numberField\n }\n }\n "]))),
320 });
321 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
322 stringField: 'This is a string!',
323 numberField: 5,
324 nestedArray: [
325 null,
326 {
327 stringField: 'This is a string also!',
328 numberField: 7,
329 },
330 ],
331 });
332 });
333 it('runs a nested query with an array with IDs and a null', function () {
334 var result = {
335 id: 'abcd',
336 stringField: 'This is a string!',
337 numberField: 5,
338 nullField: null,
339 nestedArray: [
340 null,
341 {
342 id: 'abcde',
343 stringField: 'This is a string also!',
344 numberField: 7,
345 nullField: null,
346 },
347 ],
348 };
349 var store = objectCache_1.defaultNormalizedCacheFactory({
350 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
351 nestedArray: [null, { type: 'id', generated: false, id: 'abcde' }],
352 }),
353 abcde: result.nestedArray[1],
354 });
355 var queryResult = reader.readQueryFromStore({
356 store: store,
357 query: graphql_tag_1.default(templateObject_12 || (templateObject_12 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nestedArray {\n id\n stringField\n numberField\n }\n }\n "], ["\n {\n stringField\n numberField\n nestedArray {\n id\n stringField\n numberField\n }\n }\n "]))),
358 });
359 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
360 stringField: 'This is a string!',
361 numberField: 5,
362 nestedArray: [
363 null,
364 {
365 id: 'abcde',
366 stringField: 'This is a string also!',
367 numberField: 7,
368 },
369 ],
370 });
371 });
372 it('throws on a missing field', function () {
373 var result = {
374 id: 'abcd',
375 stringField: 'This is a string!',
376 numberField: 5,
377 nullField: null,
378 };
379 var store = objectCache_1.defaultNormalizedCacheFactory({ ROOT_QUERY: result });
380 expect(function () {
381 reader.readQueryFromStore({
382 store: store,
383 query: graphql_tag_1.default(templateObject_13 || (templateObject_13 = tslib_1.__makeTemplateObject(["\n {\n stringField\n missingField\n }\n "], ["\n {\n stringField\n missingField\n }\n "]))),
384 });
385 }).toThrowError(/field missingField on object/);
386 });
387 it('runs a nested query where the reference is null', function () {
388 var result = {
389 id: 'abcd',
390 stringField: 'This is a string!',
391 numberField: 5,
392 nullField: null,
393 nestedObj: null,
394 };
395 var store = objectCache_1.defaultNormalizedCacheFactory({
396 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj')), {
397 nestedObj: null,
398 }),
399 });
400 var queryResult = reader.readQueryFromStore({
401 store: store,
402 query: graphql_tag_1.default(templateObject_14 || (templateObject_14 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nestedObj {\n stringField\n numberField\n }\n }\n "], ["\n {\n stringField\n numberField\n nestedObj {\n stringField\n numberField\n }\n }\n "]))),
403 });
404 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
405 stringField: 'This is a string!',
406 numberField: 5,
407 nestedObj: null,
408 });
409 });
410 it('runs an array of non-objects', function () {
411 var result = {
412 id: 'abcd',
413 stringField: 'This is a string!',
414 numberField: 5,
415 nullField: null,
416 simpleArray: ['one', 'two', 'three'],
417 };
418 var store = objectCache_1.defaultNormalizedCacheFactory({
419 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'simpleArray')), {
420 simpleArray: {
421 type: 'json',
422 json: result.simpleArray,
423 },
424 }),
425 });
426 var queryResult = reader.readQueryFromStore({
427 store: store,
428 query: graphql_tag_1.default(templateObject_15 || (templateObject_15 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n simpleArray\n }\n "], ["\n {\n stringField\n numberField\n simpleArray\n }\n "]))),
429 });
430 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
431 stringField: 'This is a string!',
432 numberField: 5,
433 simpleArray: ['one', 'two', 'three'],
434 });
435 });
436 it('runs an array of non-objects with null', function () {
437 var result = {
438 id: 'abcd',
439 stringField: 'This is a string!',
440 numberField: 5,
441 nullField: null,
442 simpleArray: [null, 'two', 'three'],
443 };
444 var store = objectCache_1.defaultNormalizedCacheFactory({
445 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'simpleArray')), {
446 simpleArray: {
447 type: 'json',
448 json: result.simpleArray,
449 },
450 }),
451 });
452 var queryResult = reader.readQueryFromStore({
453 store: store,
454 query: graphql_tag_1.default(templateObject_16 || (templateObject_16 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n simpleArray\n }\n "], ["\n {\n stringField\n numberField\n simpleArray\n }\n "]))),
455 });
456 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
457 stringField: 'This is a string!',
458 numberField: 5,
459 simpleArray: [null, 'two', 'three'],
460 });
461 });
462 it('will read from an arbitrary root id', function () {
463 var data = {
464 id: 'abcd',
465 stringField: 'This is a string!',
466 numberField: 5,
467 nullField: null,
468 nestedObj: {
469 id: 'abcde',
470 stringField: 'This is a string too!',
471 numberField: 6,
472 nullField: null,
473 },
474 deepNestedObj: {
475 stringField: 'This is a deep string',
476 numberField: 7,
477 nullField: null,
478 },
479 nullObject: null,
480 __typename: 'Item',
481 };
482 var store = objectCache_1.defaultNormalizedCacheFactory({
483 ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(data, 'nestedObj', 'deepNestedObj')), {
484 __typename: 'Query',
485 nestedObj: {
486 type: 'id',
487 id: 'abcde',
488 generated: false,
489 },
490 }),
491 abcde: lodash_1.assign({}, data.nestedObj, {
492 deepNestedObj: {
493 type: 'id',
494 id: 'abcdef',
495 generated: false,
496 },
497 }),
498 abcdef: data.deepNestedObj,
499 });
500 var queryResult1 = reader.readQueryFromStore({
501 store: store,
502 rootId: 'abcde',
503 query: graphql_tag_1.default(templateObject_17 || (templateObject_17 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nullField\n deepNestedObj {\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n stringField\n numberField\n nullField\n deepNestedObj {\n stringField\n numberField\n nullField\n }\n }\n "]))),
504 });
505 expect(apollo_utilities_1.stripSymbols(queryResult1)).toEqual({
506 stringField: 'This is a string too!',
507 numberField: 6,
508 nullField: null,
509 deepNestedObj: {
510 stringField: 'This is a deep string',
511 numberField: 7,
512 nullField: null,
513 },
514 });
515 var queryResult2 = reader.readQueryFromStore({
516 store: store,
517 rootId: 'abcdef',
518 query: graphql_tag_1.default(templateObject_18 || (templateObject_18 = tslib_1.__makeTemplateObject(["\n {\n stringField\n numberField\n nullField\n }\n "], ["\n {\n stringField\n numberField\n nullField\n }\n "]))),
519 });
520 expect(apollo_utilities_1.stripSymbols(queryResult2)).toEqual({
521 stringField: 'This is a deep string',
522 numberField: 7,
523 nullField: null,
524 });
525 });
526 it('properly handles the connection directive', function () {
527 var store = objectCache_1.defaultNormalizedCacheFactory({
528 ROOT_QUERY: {
529 abc: [
530 {
531 generated: true,
532 id: 'ROOT_QUERY.abc.0',
533 type: 'id',
534 },
535 ],
536 },
537 'ROOT_QUERY.abc.0': {
538 name: 'efgh',
539 },
540 });
541 var queryResult = reader.readQueryFromStore({
542 store: store,
543 query: graphql_tag_1.default(templateObject_19 || (templateObject_19 = tslib_1.__makeTemplateObject(["\n {\n books(skip: 0, limit: 2) @connection(key: \"abc\") {\n name\n }\n }\n "], ["\n {\n books(skip: 0, limit: 2) @connection(key: \"abc\") {\n name\n }\n }\n "]))),
544 });
545 expect(apollo_utilities_1.stripSymbols(queryResult)).toEqual({
546 books: [
547 {
548 name: 'efgh',
549 },
550 ],
551 });
552 });
553});
554var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19;
555//# sourceMappingURL=readFromStore.js.map
\No newline at end of file