Skip to content

Commit 8882819

Browse files
committed
fix: infinite re-renders of useAggregateFromServer
1 parent 37efeef commit 8882819

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

src/firestore/internal.spec.ts

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import {
2+
average,
3+
count,
24
DocumentReference,
35
getDoc,
46
getDocFromCache,
@@ -10,18 +12,23 @@ import {
1012
} from "firebase/firestore";
1113
import { beforeEach, describe, expect, it, vi } from "vitest";
1214
import { newSymbol } from "../__testfixtures__";
13-
import { getDocFromSource, getDocsFromSource, isDocRefEqual, isQueryEqual } from "./internal";
14-
15-
vi.mock("firebase/firestore", () => ({
16-
getDoc: vi.fn(),
17-
getDocFromServer: vi.fn(),
18-
getDocFromCache: vi.fn(),
19-
getDocs: vi.fn(),
20-
getDocsFromServer: vi.fn(),
21-
getDocsFromCache: vi.fn(),
22-
queryEqual: Object.is,
23-
refEqual: Object.is,
24-
}));
15+
import { getDocFromSource, getDocsFromSource, isAggregateSpecEqual, isDocRefEqual, isQueryEqual } from "./internal";
16+
17+
vi.mock("firebase/firestore", async () => {
18+
const mod = await vi.importActual<typeof import("firebase/firestore")>("firebase/firestore");
19+
20+
return {
21+
...mod,
22+
getDoc: vi.fn(),
23+
getDocFromServer: vi.fn(),
24+
getDocFromCache: vi.fn(),
25+
getDocs: vi.fn(),
26+
getDocsFromServer: vi.fn(),
27+
getDocsFromCache: vi.fn(),
28+
queryEqual: Object.is,
29+
refEqual: Object.is,
30+
};
31+
});
2532

2633
beforeEach(() => {
2734
vi.resetAllMocks();
@@ -110,3 +117,29 @@ describe("isQueryEqual", () => {
110117
expect(isQueryEqual(queryA, queryB)).toBe(false);
111118
});
112119
});
120+
121+
describe("isAggregateSpecEqual", () => {
122+
it("different key count", () => {
123+
const spec1 = { count: count() };
124+
const spec2 = {};
125+
expect(isAggregateSpecEqual(spec1, spec2)).toBe(false);
126+
});
127+
128+
it("different aggregations", () => {
129+
const spec1 = { value: count() };
130+
const spec2 = { value: average("abc") };
131+
expect(isAggregateSpecEqual(spec1, spec2)).toBe(false);
132+
});
133+
134+
it("identical, single aggregate", () => {
135+
const spec1 = { count: count() };
136+
const spec2 = { count: count() };
137+
expect(isAggregateSpecEqual(spec1, spec2)).toBe(true);
138+
});
139+
140+
it("identical, multiple aggregates", () => {
141+
const spec1 = { count: count(), avg: average("123") };
142+
const spec2 = { count: count(), avg: average("123") };
143+
expect(isAggregateSpecEqual(spec1, spec2)).toBe(true);
144+
});
145+
});

src/firestore/internal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export function isQueryEqual<AppModelType = DocumentData, DbModelType extends Do
7979
* @internal
8080
*/
8181
export function isAggregateSpecEqual<T extends AggregateSpec>(a: T, b: T): boolean {
82-
if (Object.keys(a).length === Object.keys(b).length) {
82+
if (Object.keys(a).length !== Object.keys(b).length) {
8383
return false;
8484
}
8585

0 commit comments

Comments
 (0)