@@ -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