UNPKG

39.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var graphql_tag_1 = tslib_1.__importStar(require("graphql-tag"));
5var apollo_utilities_1 = require("apollo-utilities");
6var objectCache_1 = require("../objectCache");
7var readFromStore_1 = require("../readFromStore");
8var writeToStore_1 = require("../writeToStore");
9var fragmentMatcher_1 = require("../fragmentMatcher");
10var inMemoryCache_1 = require("../inMemoryCache");
11var fragmentMatcherFunction = new fragmentMatcher_1.HeuristicFragmentMatcher().match;
12graphql_tag_1.disableFragmentWarnings();
13function withError(func, regex) {
14 var message = null;
15 var error = console.error;
16 console.error = function (m) {
17 message = m;
18 };
19 try {
20 var result = func();
21 expect(message).toMatch(regex);
22 return result;
23 }
24 finally {
25 console.error = error;
26 }
27}
28exports.withError = withError;
29describe('diffing queries against the store', function () {
30 var reader = new readFromStore_1.StoreReader();
31 var writer = new writeToStore_1.StoreWriter();
32 it('expects named fragments to return complete as true when diffd against ' +
33 'the store', function () {
34 var store = objectCache_1.defaultNormalizedCacheFactory({});
35 var queryResult = reader.diffQueryAgainstStore({
36 store: store,
37 query: graphql_tag_1.default(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n query foo {\n ...root\n }\n\n fragment root on Query {\n nestedObj {\n innerArray {\n id\n someField\n }\n }\n }\n "], ["\n query foo {\n ...root\n }\n\n fragment root on Query {\n nestedObj {\n innerArray {\n id\n someField\n }\n }\n }\n "]))),
38 fragmentMatcherFunction: fragmentMatcherFunction,
39 config: {
40 dataIdFromObject: inMemoryCache_1.defaultDataIdFromObject,
41 },
42 });
43 expect(queryResult.complete).toEqual(false);
44 });
45 it('expects inline fragments to return complete as true when diffd against ' +
46 'the store', function () {
47 var store = objectCache_1.defaultNormalizedCacheFactory();
48 var queryResult = reader.diffQueryAgainstStore({
49 store: store,
50 query: graphql_tag_1.default(templateObject_2 || (templateObject_2 = 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 "]))),
51 fragmentMatcherFunction: fragmentMatcherFunction,
52 config: {
53 dataIdFromObject: inMemoryCache_1.defaultDataIdFromObject,
54 },
55 });
56 expect(queryResult.complete).toEqual(false);
57 });
58 it('returns nothing when the store is enough', function () {
59 var query = graphql_tag_1.default(templateObject_3 || (templateObject_3 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"1\") {\n name\n }\n }\n "], ["\n {\n people_one(id: \"1\") {\n name\n }\n }\n "])));
60 var result = {
61 people_one: {
62 name: 'Luke Skywalker',
63 },
64 };
65 var store = writer.writeQueryToStore({
66 result: result,
67 query: query,
68 });
69 expect(reader.diffQueryAgainstStore({
70 store: store,
71 query: query,
72 }).complete).toBeTruthy();
73 });
74 it('caches root queries both under the ID of the node and the query name', function () {
75 var firstQuery = graphql_tag_1.default(templateObject_4 || (templateObject_4 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"1\") {\n __typename\n id\n name\n }\n }\n "], ["\n {\n people_one(id: \"1\") {\n __typename\n id\n name\n }\n }\n "])));
76 var result = {
77 people_one: {
78 __typename: 'Person',
79 id: '1',
80 name: 'Luke Skywalker',
81 },
82 };
83 var getIdField = function (_a) {
84 var id = _a.id;
85 return id;
86 };
87 var store = writer.writeQueryToStore({
88 result: result,
89 query: firstQuery,
90 dataIdFromObject: getIdField,
91 });
92 var secondQuery = graphql_tag_1.default(templateObject_5 || (templateObject_5 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"1\") {\n __typename\n id\n name\n }\n }\n "], ["\n {\n people_one(id: \"1\") {\n __typename\n id\n name\n }\n }\n "])));
93 var complete = reader.diffQueryAgainstStore({
94 store: store,
95 query: secondQuery,
96 }).complete;
97 expect(complete).toBeTruthy();
98 expect(store.get('1')).toEqual(result.people_one);
99 });
100 it('does not swallow errors other than field errors', function () {
101 var firstQuery = graphql_tag_1.default(templateObject_6 || (templateObject_6 = tslib_1.__makeTemplateObject(["\n query {\n person {\n powers\n }\n }\n "], ["\n query {\n person {\n powers\n }\n }\n "])));
102 var firstResult = {
103 person: {
104 powers: 'the force',
105 },
106 };
107 var store = writer.writeQueryToStore({
108 result: firstResult,
109 query: firstQuery,
110 });
111 var unionQuery = graphql_tag_1.default(templateObject_7 || (templateObject_7 = tslib_1.__makeTemplateObject(["\n query {\n ...notARealFragment\n }\n "], ["\n query {\n ...notARealFragment\n }\n "])));
112 return expect(function () {
113 reader.diffQueryAgainstStore({
114 store: store,
115 query: unionQuery,
116 });
117 }).toThrowError(/No fragment/);
118 });
119 it('does not error on a correct query with union typed fragments', function () {
120 return withError(function () {
121 var firstQuery = graphql_tag_1.default(templateObject_8 || (templateObject_8 = tslib_1.__makeTemplateObject(["\n query {\n person {\n __typename\n firstName\n lastName\n }\n }\n "], ["\n query {\n person {\n __typename\n firstName\n lastName\n }\n }\n "])));
122 var firstResult = {
123 person: {
124 __typename: 'Author',
125 firstName: 'John',
126 lastName: 'Smith',
127 },
128 };
129 var store = writer.writeQueryToStore({
130 result: firstResult,
131 query: firstQuery,
132 });
133 var unionQuery = graphql_tag_1.default(templateObject_9 || (templateObject_9 = tslib_1.__makeTemplateObject(["\n query {\n person {\n __typename\n ... on Author {\n firstName\n lastName\n }\n ... on Jedi {\n powers\n }\n }\n }\n "], ["\n query {\n person {\n __typename\n ... on Author {\n firstName\n lastName\n }\n ... on Jedi {\n powers\n }\n }\n }\n "])));
134 var complete = reader.diffQueryAgainstStore({
135 store: store,
136 query: unionQuery,
137 returnPartialData: false,
138 fragmentMatcherFunction: fragmentMatcherFunction,
139 }).complete;
140 expect(complete).toBe(false);
141 }, /IntrospectionFragmentMatcher/);
142 });
143 it('does not error on a query with fields missing from all but one named fragment', function () {
144 var firstQuery = graphql_tag_1.default(templateObject_10 || (templateObject_10 = tslib_1.__makeTemplateObject(["\n query {\n person {\n __typename\n firstName\n lastName\n }\n }\n "], ["\n query {\n person {\n __typename\n firstName\n lastName\n }\n }\n "])));
145 var firstResult = {
146 person: {
147 __typename: 'Author',
148 firstName: 'John',
149 lastName: 'Smith',
150 },
151 };
152 var store = writer.writeQueryToStore({
153 result: firstResult,
154 query: firstQuery,
155 });
156 var unionQuery = graphql_tag_1.default(templateObject_11 || (templateObject_11 = tslib_1.__makeTemplateObject(["\n query {\n person {\n __typename\n ...authorInfo\n ...jediInfo\n }\n }\n\n fragment authorInfo on Author {\n firstName\n }\n\n fragment jediInfo on Jedi {\n powers\n }\n "], ["\n query {\n person {\n __typename\n ...authorInfo\n ...jediInfo\n }\n }\n\n fragment authorInfo on Author {\n firstName\n }\n\n fragment jediInfo on Jedi {\n powers\n }\n "])));
157 var complete = reader.diffQueryAgainstStore({
158 store: store,
159 query: unionQuery,
160 }).complete;
161 expect(complete).toBe(false);
162 });
163 it('throws an error on a query with fields missing from matching named fragments', function () {
164 var firstQuery = graphql_tag_1.default(templateObject_12 || (templateObject_12 = tslib_1.__makeTemplateObject(["\n query {\n person {\n __typename\n firstName\n lastName\n }\n }\n "], ["\n query {\n person {\n __typename\n firstName\n lastName\n }\n }\n "])));
165 var firstResult = {
166 person: {
167 __typename: 'Author',
168 firstName: 'John',
169 lastName: 'Smith',
170 },
171 };
172 var store = writer.writeQueryToStore({
173 result: firstResult,
174 query: firstQuery,
175 });
176 var unionQuery = graphql_tag_1.default(templateObject_13 || (templateObject_13 = tslib_1.__makeTemplateObject(["\n query {\n person {\n __typename\n ...authorInfo2\n ...jediInfo2\n }\n }\n\n fragment authorInfo2 on Author {\n firstName\n address\n }\n\n fragment jediInfo2 on Jedi {\n jedi\n }\n "], ["\n query {\n person {\n __typename\n ...authorInfo2\n ...jediInfo2\n }\n }\n\n fragment authorInfo2 on Author {\n firstName\n address\n }\n\n fragment jediInfo2 on Jedi {\n jedi\n }\n "])));
177 expect(function () {
178 reader.diffQueryAgainstStore({
179 store: store,
180 query: unionQuery,
181 returnPartialData: false,
182 });
183 }).toThrow();
184 });
185 it('returns available fields if returnPartialData is true', function () {
186 var firstQuery = graphql_tag_1.default(templateObject_14 || (templateObject_14 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"1\") {\n __typename\n id\n name\n }\n }\n "], ["\n {\n people_one(id: \"1\") {\n __typename\n id\n name\n }\n }\n "])));
187 var firstResult = {
188 people_one: {
189 __typename: 'Person',
190 id: 'lukeId',
191 name: 'Luke Skywalker',
192 },
193 };
194 var store = writer.writeQueryToStore({
195 result: firstResult,
196 query: firstQuery,
197 });
198 var simpleQuery = graphql_tag_1.default(templateObject_15 || (templateObject_15 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"1\") {\n name\n age\n }\n }\n "], ["\n {\n people_one(id: \"1\") {\n name\n age\n }\n }\n "])));
199 var inlineFragmentQuery = graphql_tag_1.default(templateObject_16 || (templateObject_16 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"1\") {\n ... on Person {\n name\n age\n }\n }\n }\n "], ["\n {\n people_one(id: \"1\") {\n ... on Person {\n name\n age\n }\n }\n }\n "])));
200 var namedFragmentQuery = graphql_tag_1.default(templateObject_17 || (templateObject_17 = tslib_1.__makeTemplateObject(["\n query {\n people_one(id: \"1\") {\n ...personInfo\n }\n }\n\n fragment personInfo on Person {\n name\n age\n }\n "], ["\n query {\n people_one(id: \"1\") {\n ...personInfo\n }\n }\n\n fragment personInfo on Person {\n name\n age\n }\n "])));
201 var simpleDiff = reader.diffQueryAgainstStore({
202 store: store,
203 query: simpleQuery,
204 });
205 expect(simpleDiff.result).toEqual({
206 people_one: {
207 name: 'Luke Skywalker',
208 },
209 });
210 var inlineDiff = reader.diffQueryAgainstStore({
211 store: store,
212 query: inlineFragmentQuery,
213 });
214 expect(inlineDiff.result).toEqual({
215 people_one: {
216 name: 'Luke Skywalker',
217 },
218 });
219 var namedDiff = reader.diffQueryAgainstStore({
220 store: store,
221 query: namedFragmentQuery,
222 });
223 expect(namedDiff.result).toEqual({
224 people_one: {
225 name: 'Luke Skywalker',
226 },
227 });
228 expect(function () {
229 reader.diffQueryAgainstStore({
230 store: store,
231 query: simpleQuery,
232 returnPartialData: false,
233 });
234 }).toThrow();
235 });
236 it('will add a private id property', function () {
237 var query = graphql_tag_1.default(templateObject_18 || (templateObject_18 = tslib_1.__makeTemplateObject(["\n query {\n a {\n id\n b\n }\n c {\n d\n e {\n id\n f\n }\n g {\n h\n }\n }\n }\n "], ["\n query {\n a {\n id\n b\n }\n c {\n d\n e {\n id\n f\n }\n g {\n h\n }\n }\n }\n "])));
238 var queryResult = {
239 a: [{ id: 'a:1', b: 1.1 }, { id: 'a:2', b: 1.2 }, { id: 'a:3', b: 1.3 }],
240 c: {
241 d: 2,
242 e: [
243 { id: 'e:1', f: 3.1 },
244 { id: 'e:2', f: 3.2 },
245 { id: 'e:3', f: 3.3 },
246 { id: 'e:4', f: 3.4 },
247 { id: 'e:5', f: 3.5 },
248 ],
249 g: { h: 4 },
250 },
251 };
252 function dataIdFromObject(_a) {
253 var id = _a.id;
254 return id;
255 }
256 var store = writer.writeQueryToStore({
257 query: query,
258 result: queryResult,
259 dataIdFromObject: dataIdFromObject,
260 });
261 var result = reader.diffQueryAgainstStore({
262 store: store,
263 query: query,
264 }).result;
265 expect(result).toEqual(queryResult);
266 expect(dataIdFromObject(result.a[0])).toBe('a:1');
267 expect(dataIdFromObject(result.a[1])).toBe('a:2');
268 expect(dataIdFromObject(result.a[2])).toBe('a:3');
269 expect(dataIdFromObject(result.c.e[0])).toBe('e:1');
270 expect(dataIdFromObject(result.c.e[1])).toBe('e:2');
271 expect(dataIdFromObject(result.c.e[2])).toBe('e:3');
272 expect(dataIdFromObject(result.c.e[3])).toBe('e:4');
273 expect(dataIdFromObject(result.c.e[4])).toBe('e:5');
274 });
275 describe('referential equality preservation', function () {
276 it('will return the previous result if there are no changes', function () {
277 var query = graphql_tag_1.default(templateObject_19 || (templateObject_19 = tslib_1.__makeTemplateObject(["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "], ["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "])));
278 var queryResult = {
279 a: { b: 1 },
280 c: { d: 2, e: { f: 3 } },
281 };
282 var store = writer.writeQueryToStore({
283 query: query,
284 result: queryResult,
285 });
286 var previousResult = {
287 a: { b: 1 },
288 c: { d: 2, e: { f: 3 } },
289 };
290 var result = reader.diffQueryAgainstStore({
291 store: store,
292 query: query,
293 previousResult: previousResult,
294 }).result;
295 expect(result).toEqual(queryResult);
296 expect(result).toEqual(previousResult);
297 });
298 it('will return parts of the previous result that changed', function () {
299 var query = graphql_tag_1.default(templateObject_20 || (templateObject_20 = tslib_1.__makeTemplateObject(["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "], ["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "])));
300 var queryResult = {
301 a: { b: 1 },
302 c: { d: 2, e: { f: 3 } },
303 };
304 var store = writer.writeQueryToStore({
305 query: query,
306 result: queryResult,
307 });
308 var previousResult = {
309 a: { b: 1 },
310 c: { d: 20, e: { f: 3 } },
311 };
312 var result = reader.diffQueryAgainstStore({
313 store: store,
314 query: query,
315 previousResult: previousResult,
316 }).result;
317 expect(result).toEqual(queryResult);
318 expect(result).not.toEqual(previousResult);
319 expect(result.a).toEqual(previousResult.a);
320 expect(result.c).not.toEqual(previousResult.c);
321 expect(result.c.e).toEqual(previousResult.c.e);
322 });
323 it('will return the previous result if there are no changes in child arrays', function () {
324 var query = graphql_tag_1.default(templateObject_21 || (templateObject_21 = tslib_1.__makeTemplateObject(["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "], ["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "])));
325 var queryResult = {
326 a: [{ b: 1.1 }, { b: 1.2 }, { b: 1.3 }],
327 c: {
328 d: 2,
329 e: [{ f: 3.1 }, { f: 3.2 }, { f: 3.3 }, { f: 3.4 }, { f: 3.5 }],
330 },
331 };
332 var store = writer.writeQueryToStore({
333 query: query,
334 result: queryResult,
335 });
336 var previousResult = {
337 a: [{ b: 1.1 }, { b: 1.2 }, { b: 1.3 }],
338 c: {
339 d: 2,
340 e: [{ f: 3.1 }, { f: 3.2 }, { f: 3.3 }, { f: 3.4 }, { f: 3.5 }],
341 },
342 };
343 var result = reader.diffQueryAgainstStore({
344 store: store,
345 query: query,
346 previousResult: previousResult,
347 }).result;
348 expect(result).toEqual(queryResult);
349 expect(result).toEqual(previousResult);
350 });
351 it('will not add zombie items when previousResult starts with the same items', function () {
352 var query = graphql_tag_1.default(templateObject_22 || (templateObject_22 = tslib_1.__makeTemplateObject(["\n query {\n a {\n b\n }\n }\n "], ["\n query {\n a {\n b\n }\n }\n "])));
353 var queryResult = {
354 a: [{ b: 1.1 }, { b: 1.2 }],
355 };
356 var store = writer.writeQueryToStore({
357 query: query,
358 result: queryResult,
359 });
360 var previousResult = {
361 a: [{ b: 1.1 }, { b: 1.2 }, { b: 1.3 }],
362 };
363 var result = reader.diffQueryAgainstStore({
364 store: store,
365 query: query,
366 previousResult: previousResult,
367 }).result;
368 expect(result).toEqual(queryResult);
369 expect(result.a[0]).toEqual(previousResult.a[0]);
370 expect(result.a[1]).toEqual(previousResult.a[1]);
371 });
372 it('will return the previous result if there are no changes in nested child arrays', function () {
373 var query = graphql_tag_1.default(templateObject_23 || (templateObject_23 = tslib_1.__makeTemplateObject(["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "], ["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "])));
374 var queryResult = {
375 a: [[[[[{ b: 1.1 }, { b: 1.2 }, { b: 1.3 }]]]]],
376 c: {
377 d: 2,
378 e: [[{ f: 3.1 }, { f: 3.2 }, { f: 3.3 }], [{ f: 3.4 }, { f: 3.5 }]],
379 },
380 };
381 var store = writer.writeQueryToStore({
382 query: query,
383 result: queryResult,
384 });
385 var previousResult = {
386 a: [[[[[{ b: 1.1 }, { b: 1.2 }, { b: 1.3 }]]]]],
387 c: {
388 d: 2,
389 e: [[{ f: 3.1 }, { f: 3.2 }, { f: 3.3 }], [{ f: 3.4 }, { f: 3.5 }]],
390 },
391 };
392 var result = reader.diffQueryAgainstStore({
393 store: store,
394 query: query,
395 previousResult: previousResult,
396 }).result;
397 expect(result).toEqual(queryResult);
398 expect(result).toEqual(previousResult);
399 });
400 it('will return parts of the previous result if there are changes in child arrays', function () {
401 var query = graphql_tag_1.default(templateObject_24 || (templateObject_24 = tslib_1.__makeTemplateObject(["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "], ["\n query {\n a {\n b\n }\n c {\n d\n e {\n f\n }\n }\n }\n "])));
402 var queryResult = {
403 a: [{ b: 1.1 }, { b: 1.2 }, { b: 1.3 }],
404 c: {
405 d: 2,
406 e: [{ f: 3.1 }, { f: 3.2 }, { f: 3.3 }, { f: 3.4 }, { f: 3.5 }],
407 },
408 };
409 var store = writer.writeQueryToStore({
410 query: query,
411 result: queryResult,
412 });
413 var previousResult = {
414 a: [{ b: 1.1 }, { b: -1.2 }, { b: 1.3 }],
415 c: {
416 d: 20,
417 e: [{ f: 3.1 }, { f: 3.2 }, { f: 3.3 }, { f: 3.4 }, { f: 3.5 }],
418 },
419 };
420 var result = reader.diffQueryAgainstStore({
421 store: store,
422 query: query,
423 previousResult: previousResult,
424 }).result;
425 expect(result).toEqual(queryResult);
426 expect(result).not.toEqual(previousResult);
427 expect(result.a).not.toEqual(previousResult.a);
428 expect(result.a[0]).toEqual(previousResult.a[0]);
429 expect(result.a[1]).not.toEqual(previousResult.a[1]);
430 expect(result.a[2]).toEqual(previousResult.a[2]);
431 expect(result.c).not.toEqual(previousResult.c);
432 expect(result.c.e).toEqual(previousResult.c.e);
433 expect(result.c.e[0]).toEqual(previousResult.c.e[0]);
434 expect(result.c.e[1]).toEqual(previousResult.c.e[1]);
435 expect(result.c.e[2]).toEqual(previousResult.c.e[2]);
436 expect(result.c.e[3]).toEqual(previousResult.c.e[3]);
437 expect(result.c.e[4]).toEqual(previousResult.c.e[4]);
438 });
439 it('will return the same items in a different order with `dataIdFromObject`', function () {
440 var query = graphql_tag_1.default(templateObject_25 || (templateObject_25 = tslib_1.__makeTemplateObject(["\n query {\n a {\n id\n b\n }\n c {\n d\n e {\n id\n f\n }\n g {\n h\n }\n }\n }\n "], ["\n query {\n a {\n id\n b\n }\n c {\n d\n e {\n id\n f\n }\n g {\n h\n }\n }\n }\n "])));
441 var queryResult = {
442 a: [
443 { id: 'a:1', b: 1.1 },
444 { id: 'a:2', b: 1.2 },
445 { id: 'a:3', b: 1.3 },
446 ],
447 c: {
448 d: 2,
449 e: [
450 { id: 'e:1', f: 3.1 },
451 { id: 'e:2', f: 3.2 },
452 { id: 'e:3', f: 3.3 },
453 { id: 'e:4', f: 3.4 },
454 { id: 'e:5', f: 3.5 },
455 ],
456 g: { h: 4 },
457 },
458 };
459 var store = writer.writeQueryToStore({
460 query: query,
461 result: queryResult,
462 dataIdFromObject: function (_a) {
463 var id = _a.id;
464 return id;
465 },
466 });
467 var previousResult = {
468 a: [
469 { id: 'a:3', b: 1.3 },
470 { id: 'a:2', b: 1.2 },
471 { id: 'a:1', b: 1.1 },
472 ],
473 c: {
474 d: 2,
475 e: [
476 { id: 'e:4', f: 3.4 },
477 { id: 'e:2', f: 3.2 },
478 { id: 'e:5', f: 3.5 },
479 { id: 'e:3', f: 3.3 },
480 { id: 'e:1', f: 3.1 },
481 ],
482 g: { h: 4 },
483 },
484 };
485 var result = reader.diffQueryAgainstStore({
486 store: store,
487 query: query,
488 previousResult: previousResult,
489 }).result;
490 expect(result).toEqual(queryResult);
491 expect(result).not.toEqual(previousResult);
492 expect(result.a).not.toEqual(previousResult.a);
493 expect(result.a[0]).toEqual(previousResult.a[2]);
494 expect(result.a[1]).toEqual(previousResult.a[1]);
495 expect(result.a[2]).toEqual(previousResult.a[0]);
496 expect(result.c).not.toEqual(previousResult.c);
497 expect(result.c.e).not.toEqual(previousResult.c.e);
498 expect(result.c.e[0]).toEqual(previousResult.c.e[4]);
499 expect(result.c.e[1]).toEqual(previousResult.c.e[1]);
500 expect(result.c.e[2]).toEqual(previousResult.c.e[3]);
501 expect(result.c.e[3]).toEqual(previousResult.c.e[0]);
502 expect(result.c.e[4]).toEqual(previousResult.c.e[2]);
503 expect(result.c.g).toEqual(previousResult.c.g);
504 });
505 it('will return the same JSON scalar field object', function () {
506 var query = graphql_tag_1.default(templateObject_26 || (templateObject_26 = tslib_1.__makeTemplateObject(["\n {\n a {\n b\n c\n }\n d {\n e\n f\n }\n }\n "], ["\n {\n a {\n b\n c\n }\n d {\n e\n f\n }\n }\n "])));
507 var queryResult = {
508 a: { b: 1, c: { x: 2, y: 3, z: 4 } },
509 d: { e: 5, f: { x: 6, y: 7, z: 8 } },
510 };
511 var store = writer.writeQueryToStore({
512 query: query,
513 result: queryResult,
514 });
515 var previousResult = {
516 a: { b: 1, c: { x: 2, y: 3, z: 4 } },
517 d: { e: 50, f: { x: 6, y: 7, z: 8 } },
518 };
519 var result = reader.diffQueryAgainstStore({
520 store: store,
521 query: query,
522 previousResult: previousResult,
523 }).result;
524 expect(result).toEqual(queryResult);
525 expect(result).not.toEqual(previousResult);
526 expect(result.a).toEqual(previousResult.a);
527 expect(result.d).not.toEqual(previousResult.d);
528 expect(result.d.f).toEqual(previousResult.d.f);
529 });
530 it('will preserve equality with custom resolvers', function () {
531 var listQuery = graphql_tag_1.default(templateObject_27 || (templateObject_27 = tslib_1.__makeTemplateObject(["\n {\n people {\n id\n name\n __typename\n }\n }\n "], ["\n {\n people {\n id\n name\n __typename\n }\n }\n "])));
532 var listResult = {
533 people: [
534 {
535 id: '4',
536 name: 'Luke Skywalker',
537 __typename: 'Person',
538 },
539 ],
540 };
541 var itemQuery = graphql_tag_1.default(templateObject_28 || (templateObject_28 = tslib_1.__makeTemplateObject(["\n {\n person(id: 4) {\n id\n name\n __typename\n }\n }\n "], ["\n {\n person(id: 4) {\n id\n name\n __typename\n }\n }\n "])));
542 var dataIdFromObject = function (obj) { return obj.id; };
543 var store = writer.writeQueryToStore({
544 query: listQuery,
545 result: listResult,
546 dataIdFromObject: dataIdFromObject,
547 });
548 var previousResult = {
549 person: listResult.people[0],
550 };
551 var cacheRedirects = {
552 Query: {
553 person: function (_, args) {
554 return apollo_utilities_1.toIdValue({ id: args['id'], typename: 'Person' });
555 },
556 },
557 };
558 var config = { dataIdFromObject: dataIdFromObject, cacheRedirects: cacheRedirects };
559 var result = reader.diffQueryAgainstStore({
560 store: store,
561 query: itemQuery,
562 previousResult: previousResult,
563 config: config,
564 }).result;
565 expect(result).toEqual(previousResult);
566 });
567 });
568 describe('malformed queries', function () {
569 it('throws for non-scalar query fields without selection sets', function () {
570 var validQuery = graphql_tag_1.default(templateObject_29 || (templateObject_29 = tslib_1.__makeTemplateObject(["\n query getMessageList {\n messageList {\n id\n __typename\n message\n }\n }\n "], ["\n query getMessageList {\n messageList {\n id\n __typename\n message\n }\n }\n "])));
571 var invalidQuery = graphql_tag_1.default(templateObject_30 || (templateObject_30 = tslib_1.__makeTemplateObject(["\n query getMessageList {\n # This field needs a selection set because its value is an array\n # of non-scalar objects.\n messageList\n }\n "], ["\n query getMessageList {\n # This field needs a selection set because its value is an array\n # of non-scalar objects.\n messageList\n }\n "])));
572 var store = writer.writeQueryToStore({
573 query: validQuery,
574 result: {
575 messageList: [
576 {
577 id: 1,
578 __typename: 'Message',
579 message: 'hi',
580 },
581 {
582 id: 2,
583 __typename: 'Message',
584 message: 'hello',
585 },
586 {
587 id: 3,
588 __typename: 'Message',
589 message: 'hey',
590 },
591 ],
592 },
593 });
594 try {
595 reader.diffQueryAgainstStore({
596 store: store,
597 query: invalidQuery,
598 });
599 throw new Error('should have thrown');
600 }
601 catch (e) {
602 expect(e.message).toEqual('Missing selection set for object of type Message returned for query field messageList');
603 }
604 });
605 });
606 describe('issue #4081', function () {
607 it('should not return results containing cycles', function () {
608 var company = {
609 __typename: 'Company',
610 id: 1,
611 name: 'Apollo',
612 users: [],
613 };
614 company.users.push({
615 __typename: 'User',
616 id: 1,
617 name: 'Ben',
618 company: company,
619 }, {
620 __typename: 'User',
621 id: 2,
622 name: 'James',
623 company: company,
624 });
625 var query = graphql_tag_1.default(templateObject_31 || (templateObject_31 = tslib_1.__makeTemplateObject(["\n query Query {\n user {\n ...UserFragment\n company {\n users {\n ...UserFragment\n }\n }\n }\n }\n\n fragment UserFragment on User {\n id\n name\n company {\n id\n name\n }\n }\n "], ["\n query Query {\n user {\n ...UserFragment\n company {\n users {\n ...UserFragment\n }\n }\n }\n }\n\n fragment UserFragment on User {\n id\n name\n company {\n id\n name\n }\n }\n "])));
626 function check(store) {
627 var result = reader.diffQueryAgainstStore({ store: store, query: query }).result;
628 var json = JSON.stringify(result);
629 company.users.forEach(function (user) {
630 expect(json).toContain(JSON.stringify(user.name));
631 });
632 expect(result).toEqual({
633 user: {
634 id: 1,
635 name: 'Ben',
636 company: {
637 id: 1,
638 name: 'Apollo',
639 users: [
640 {
641 id: 1,
642 name: 'Ben',
643 company: {
644 id: 1,
645 name: 'Apollo',
646 },
647 },
648 {
649 id: 2,
650 name: 'James',
651 company: {
652 id: 1,
653 name: 'Apollo',
654 },
655 },
656 ],
657 },
658 },
659 });
660 }
661 check(writer.writeQueryToStore({
662 query: query,
663 result: {
664 user: company.users[0],
665 },
666 }));
667 check(writer.writeQueryToStore({
668 dataIdFromObject: inMemoryCache_1.defaultDataIdFromObject,
669 query: query,
670 result: {
671 user: company.users[0],
672 },
673 }));
674 });
675 });
676});
677var 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, templateObject_20, templateObject_21, templateObject_22, templateObject_23, templateObject_24, templateObject_25, templateObject_26, templateObject_27, templateObject_28, templateObject_29, templateObject_30, templateObject_31;
678//# sourceMappingURL=diffAgainstStore.js.map
\No newline at end of file