Skip to content

Commit eb65fd8

Browse files
test: edge cases for aggregate queries
1 parent 97124c9 commit eb65fd8

File tree

1 file changed

+322
-27
lines changed

1 file changed

+322
-27
lines changed

packages/firestore/e2e/Aggregate/AggregateQuery.e2e.js

Lines changed: 322 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -101,29 +101,6 @@ describe('getAggregateFromServer()', function () {
101101
});
102102

103103
describe('count(), average() & sum()', function () {
104-
it('no existing collection responses for average(), sum() & count()', async function () {
105-
const { getAggregateFromServer, collection, getFirestore, count, average, sum } =
106-
firestoreModular;
107-
const firestore = getFirestore();
108-
109-
const colRefNoDocs = collection(firestore, `${COLLECTION}/aggregate-count/no-docs`);
110-
111-
const aggregateSpecNoDocuments = {
112-
countCollection: count(),
113-
averageBar: average('bar'),
114-
sumBaz: sum('baz'),
115-
};
116-
117-
const resultNoDocs = await getAggregateFromServer(colRefNoDocs, aggregateSpecNoDocuments);
118-
119-
const dataNoDocs = resultNoDocs.data();
120-
121-
// average returns null, whilst sum and count return 0
122-
dataNoDocs.countCollection.should.eql(0);
123-
should(dataNoDocs.averageBar).be.null();
124-
dataNoDocs.sumBaz.should.eql(0);
125-
});
126-
127104
it('single path using `string`', async function () {
128105
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, count, average, sum } =
129106
firestoreModular;
@@ -132,9 +109,9 @@ describe('getAggregateFromServer()', function () {
132109
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/collection`);
133110

134111
await Promise.all([
135-
setDoc(doc(colRef, 'one'), { bar: 0.4, baz: 0.1 }),
136-
setDoc(doc(colRef, 'two'), { bar: 0.5, baz: 0.1 }),
137-
setDoc(doc(colRef, 'three'), { bar: 0.6, baz: 0.1 }),
112+
setDoc(doc(colRef, 'one'), { bar: 0.4, baz: 3 }),
113+
setDoc(doc(colRef, 'two'), { bar: 0.5, baz: 3 }),
114+
setDoc(doc(colRef, 'three'), { bar: 0.6, baz: 3 }),
138115
]);
139116

140117
const aggregateSpec = {
@@ -150,7 +127,7 @@ describe('getAggregateFromServer()', function () {
150127

151128
data.countCollection.should.eql(3);
152129
data.averageBar.should.eql(0.5);
153-
data.sumBaz.should.eql(0.3);
130+
data.sumBaz.should.eql(9);
154131
// should only return the aggregate field requests
155132
data.should.not.have.property('ignoreThisProperty');
156133
});
@@ -268,5 +245,323 @@ describe('getAggregateFromServer()', function () {
268245
// should only return the aggregate field requests
269246
data.should.not.have.property('ignoreThisProperty');
270247
});
248+
249+
describe('edge cases for aggregate query', function () {
250+
it('no existing collection responses for average(), sum() & count()', async function () {
251+
const { getAggregateFromServer, collection, getFirestore, count, average, sum } =
252+
firestoreModular;
253+
const firestore = getFirestore();
254+
255+
const colRefNoDocs = collection(firestore, `${COLLECTION}/aggregate-count/no-docs`);
256+
257+
const aggregateSpecNoDocuments = {
258+
countCollection: count(),
259+
averageBar: average('bar'),
260+
sumBaz: sum('baz'),
261+
};
262+
263+
const resultNoDocs = await getAggregateFromServer(colRefNoDocs, aggregateSpecNoDocuments);
264+
265+
const dataNoDocs = resultNoDocs.data();
266+
267+
// average returns null, whilst sum and count return 0
268+
dataNoDocs.countCollection.should.eql(0);
269+
should(dataNoDocs.averageBar).be.null();
270+
dataNoDocs.sumBaz.should.eql(0);
271+
});
272+
273+
it('sum of `0.3`', async function () {
274+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
275+
firestoreModular;
276+
const firestore = getFirestore();
277+
278+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/sum-0-3`);
279+
280+
await Promise.all([
281+
setDoc(doc(colRef, 'one'), { bar: 0.4, baz: 0.1 }),
282+
setDoc(doc(colRef, 'two'), { bar: 0.5, baz: 0.1 }),
283+
setDoc(doc(colRef, 'three'), { bar: 0.6, baz: 0.1 }),
284+
]);
285+
286+
const aggregateSpec = {
287+
sumBaz: sum('baz'),
288+
};
289+
290+
const result = await getAggregateFromServer(colRef, aggregateSpec);
291+
292+
const data = result.data();
293+
294+
data.sumBaz.should.eql(0.30000000000000004);
295+
});
296+
297+
it('return JavaScript single max safe integer for `sum()`', async function () {
298+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
299+
firestoreModular;
300+
const MAX_INT = Number.MAX_SAFE_INTEGER;
301+
const firestore = getFirestore();
302+
303+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/max-int`);
304+
305+
await Promise.all([setDoc(doc(colRef, 'one'), { baz: MAX_INT })]);
306+
307+
const aggregateSpec = {
308+
sumBaz: sum('baz'),
309+
};
310+
311+
const result = await getAggregateFromServer(colRef, aggregateSpec);
312+
313+
const data = result.data();
314+
315+
data.sumBaz.should.eql(MAX_INT);
316+
});
317+
318+
it('return JavaScript nine max safe integers for `sum()`', async function () {
319+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
320+
firestoreModular;
321+
const MAX_INT = Number.MAX_SAFE_INTEGER;
322+
const firestore = getFirestore();
323+
324+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/max-int-2`);
325+
326+
await Promise.all([
327+
setDoc(doc(colRef, 'one'), { baz: MAX_INT }),
328+
setDoc(doc(colRef, 'two'), { baz: MAX_INT }),
329+
setDoc(doc(colRef, 'three'), { baz: MAX_INT }),
330+
setDoc(doc(colRef, 'four'), { baz: MAX_INT }),
331+
setDoc(doc(colRef, 'five'), { baz: MAX_INT }),
332+
setDoc(doc(colRef, 'six'), { baz: MAX_INT }),
333+
setDoc(doc(colRef, 'seven'), { baz: MAX_INT }),
334+
setDoc(doc(colRef, 'eight'), { baz: MAX_INT }),
335+
setDoc(doc(colRef, 'nine'), { baz: MAX_INT }),
336+
]);
337+
338+
const aggregateSpec = {
339+
sumBaz: sum('baz'),
340+
};
341+
342+
const result = await getAggregateFromServer(colRef, aggregateSpec);
343+
344+
const data = result.data();
345+
346+
data.sumBaz.should.eql(MAX_INT * 9);
347+
});
348+
349+
it('return JavaScript single max safe number for `sum()`', async function () {
350+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
351+
firestoreModular;
352+
const MAX_NUMBER = Number.MAX_VALUE;
353+
const firestore = getFirestore();
354+
355+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/max-number`);
356+
357+
await Promise.all([setDoc(doc(colRef, 'one'), { baz: MAX_NUMBER })]);
358+
359+
const aggregateSpec = {
360+
sumBaz: sum('baz'),
361+
};
362+
363+
const result = await getAggregateFromServer(colRef, aggregateSpec);
364+
365+
const data = result.data();
366+
367+
data.sumBaz.should.eql(MAX_NUMBER);
368+
});
369+
370+
it('returns `Infinity` for JavaScript max safe number + 1 for `sum()`', async function () {
371+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
372+
firestoreModular;
373+
const MAX_NUMBER = Number.MAX_VALUE;
374+
const firestore = getFirestore();
375+
376+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/max-number`);
377+
378+
await Promise.all([
379+
setDoc(doc(colRef, 'one'), { baz: MAX_NUMBER }),
380+
setDoc(doc(colRef, 'two'), { baz: 1 }),
381+
]);
382+
383+
const aggregateSpec = {
384+
sumBaz: sum('baz'),
385+
};
386+
387+
const result = await getAggregateFromServer(colRef, aggregateSpec);
388+
389+
const data = result.data();
390+
// Doesn't add 1, just returns MAX_NUMBER
391+
data.sumBaz.should.eql(MAX_NUMBER);
392+
});
393+
394+
it('returns `Infinity` for JavaScript max safe number + 100 for `sum()`', async function () {
395+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
396+
firestoreModular;
397+
const MAX_NUMBER = Number.MAX_VALUE;
398+
const firestore = getFirestore();
399+
400+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/max-number-2`);
401+
402+
await Promise.all([
403+
setDoc(doc(colRef, 'one'), { baz: MAX_NUMBER }),
404+
setDoc(doc(colRef, 'two'), { baz: 100 }),
405+
]);
406+
407+
const aggregateSpec = {
408+
sumBaz: sum('baz'),
409+
};
410+
411+
const result = await getAggregateFromServer(colRef, aggregateSpec);
412+
413+
const data = result.data();
414+
// Doesn't add 100, just returns MAX_NUMBER
415+
data.sumBaz.should.eql(MAX_NUMBER);
416+
});
417+
418+
it('returns `Infinity` for JavaScript two max safe numbers for `sum()`', async function () {
419+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, sum } =
420+
firestoreModular;
421+
const MAX_NUMBER = Number.MAX_VALUE;
422+
const firestore = getFirestore();
423+
424+
const colRef = collection(firestore, `${COLLECTION}/aggregate-count/max-number-3`);
425+
426+
await Promise.all([
427+
setDoc(doc(colRef, 'one'), { baz: MAX_NUMBER }),
428+
setDoc(doc(colRef, 'two'), { baz: MAX_NUMBER }),
429+
]);
430+
431+
const aggregateSpec = {
432+
sumBaz: sum('baz'),
433+
};
434+
435+
const result = await getAggregateFromServer(colRef, aggregateSpec);
436+
437+
const data = result.data();
438+
// Returns Infinity
439+
data.sumBaz.should.eql(Infinity);
440+
});
441+
442+
it('returns `0` for properties with `0` for `average()`', async function () {
443+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, average } =
444+
firestoreModular;
445+
const firestore = getFirestore();
446+
447+
const colRef = collection(firestore, `${COLLECTION}/aggregate-average/0-values`);
448+
449+
await Promise.all([
450+
setDoc(doc(colRef, 'one'), { baz: 0 }),
451+
setDoc(doc(colRef, 'two'), { baz: 0 }),
452+
]);
453+
454+
const aggregateSpec = {
455+
averageBaz: average('baz'),
456+
};
457+
458+
const result = await getAggregateFromServer(colRef, aggregateSpec);
459+
460+
const data = result.data();
461+
462+
data.averageBaz.should.eql(0);
463+
});
464+
465+
it('returns `-1` for properties with `-1` for `average()`', async function () {
466+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, average } =
467+
firestoreModular;
468+
const firestore = getFirestore();
469+
470+
const colRef = collection(firestore, `${COLLECTION}/aggregate-average/minus-one-values`);
471+
472+
await Promise.all([
473+
setDoc(doc(colRef, 'one'), { baz: -1 }),
474+
setDoc(doc(colRef, 'two'), { baz: -1 }),
475+
]);
476+
477+
const aggregateSpec = {
478+
averageBaz: average('baz'),
479+
};
480+
481+
const result = await getAggregateFromServer(colRef, aggregateSpec);
482+
483+
const data = result.data();
484+
485+
data.averageBaz.should.eql(-1);
486+
});
487+
488+
it('returns `-3` for properties with `-3` for `average()`', async function () {
489+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, average } =
490+
firestoreModular;
491+
const firestore = getFirestore();
492+
493+
const colRef = collection(firestore, `${COLLECTION}/aggregate-average/minus-three-values`);
494+
495+
await Promise.all([
496+
setDoc(doc(colRef, 'one'), { baz: -3 }),
497+
setDoc(doc(colRef, 'two'), { baz: -3 }),
498+
setDoc(doc(colRef, 'three'), { baz: -3 }),
499+
]);
500+
501+
const aggregateSpec = {
502+
averageBaz: average('baz'),
503+
};
504+
505+
const result = await getAggregateFromServer(colRef, aggregateSpec);
506+
507+
const data = result.data();
508+
509+
data.averageBaz.should.eql(-3);
510+
});
511+
512+
it('returns `-2` for properties with `-1`, `-2`,`-3` for `average()`', async function () {
513+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, average } =
514+
firestoreModular;
515+
const firestore = getFirestore();
516+
517+
const colRef = collection(
518+
firestore,
519+
`${COLLECTION}/aggregate-average/minus-various-values`,
520+
);
521+
522+
await Promise.all([
523+
setDoc(doc(colRef, 'one'), { baz: -1 }),
524+
setDoc(doc(colRef, 'two'), { baz: -2 }),
525+
setDoc(doc(colRef, 'three'), { baz: -3 }),
526+
]);
527+
528+
const aggregateSpec = {
529+
averageBaz: average('baz'),
530+
};
531+
532+
const result = await getAggregateFromServer(colRef, aggregateSpec);
533+
534+
const data = result.data();
535+
536+
data.averageBaz.should.eql(-2);
537+
});
538+
539+
it.only('returns `WHAT` for properties with `-1`, `-2`,`-3` for `average()`', async function () {
540+
const { getAggregateFromServer, doc, setDoc, collection, getFirestore, average } =
541+
firestoreModular;
542+
const firestore = getFirestore();
543+
544+
const colRef = collection(
545+
firestore,
546+
`${COLLECTION}/aggregate-average/minus-various-float-values`,
547+
);
548+
549+
await Promise.all([
550+
setDoc(doc(colRef, 'one'), { baz: -0.1 }),
551+
setDoc(doc(colRef, 'two'), { baz: -0.2 }),
552+
setDoc(doc(colRef, 'three'), { baz: -0.3 }),
553+
]);
554+
555+
const aggregateSpec = {
556+
averageBaz: average('baz'),
557+
};
558+
559+
const result = await getAggregateFromServer(colRef, aggregateSpec);
560+
561+
const data = result.data();
562+
563+
data.averageBaz.should.eql(-0.19999999999999998);
564+
});
565+
});
271566
});
272567
});

0 commit comments

Comments
 (0)