1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var graphql_tag_1 = tslib_1.__importStar(require("graphql-tag"));
|
5 | var apollo_utilities_1 = require("apollo-utilities");
|
6 | var objectCache_1 = require("../objectCache");
|
7 | var readFromStore_1 = require("../readFromStore");
|
8 | var writeToStore_1 = require("../writeToStore");
|
9 | var fragmentMatcher_1 = require("../fragmentMatcher");
|
10 | var inMemoryCache_1 = require("../inMemoryCache");
|
11 | var fragmentMatcherFunction = new fragmentMatcher_1.HeuristicFragmentMatcher().match;
|
12 | graphql_tag_1.disableFragmentWarnings();
|
13 | function 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 | }
|
28 | exports.withError = withError;
|
29 | describe('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 | });
|
677 | var 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 |
|
\ | No newline at end of file |