From 90d449e19855b46a1ec35a128cc15aa2244fa641 Mon Sep 17 00:00:00 2001 From: milaGGL <107142260+milaGGL@users.noreply.github.com> Date: Thu, 16 Feb 2023 13:47:08 -0800 Subject: [PATCH 1/6] add integration test --- .../test/integration/api/query.test.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index f76baf19b9f..df2f7e86cf3 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -47,6 +47,7 @@ import { Query, query, QuerySnapshot, + runTransaction, setDoc, startAfter, startAt, @@ -1614,6 +1615,30 @@ apiDescribe('Queries', (persistence: boolean) => { }); }); }); + + it('can handle existence filter', () => { + const testDocs = {}; + for (let i = 1; i <= 100; i++) { + Object.assign(testDocs, { ['doc' + i]: { key: i } }); + } + return withTestCollection(persistence, testDocs, async (coll, db) => { + const snapshot1 = await getDocs(coll); + expect(snapshot1.size).to.equal(100); + // Delete 50 docs in transaction so that it doesn't affect local cache. + await runTransaction(db, async txn => { + for (let i = 1; i <= 50; i++) { + txn.delete(doc(coll, 'doc' + i)); + } + }); + // Wait 10 seconds, during which the watch will stop tracking the query + // and will send an existence filter rather than "delete" events. + await (function () { + return new Promise(resolve => setTimeout(resolve, 10000)); + })(); + const snapshot2 = await getDocs(coll); + expect(snapshot2.size).to.equal(50); + }); + }).timeout('15s'); }); function verifyDocumentChange( From d53dddc5afedbfcfcfb4d3c647c13c315a29bdd7 Mon Sep 17 00:00:00 2001 From: milaGGL <107142260+milaGGL@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:07:03 -0800 Subject: [PATCH 2/6] rename test --- packages/firestore/test/integration/api/query.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index df2f7e86cf3..9fc6b82e348 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -1616,7 +1616,7 @@ apiDescribe('Queries', (persistence: boolean) => { }); }); - it('can handle existence filter', () => { + it('can raise expected snapshot when resume query after deleting docs', () => { const testDocs = {}; for (let i = 1; i <= 100; i++) { Object.assign(testDocs, { ['doc' + i]: { key: i } }); From 5eb19a18dea35d778f310edc59d092992c92c97c Mon Sep 17 00:00:00 2001 From: milaGGL <107142260+milaGGL@users.noreply.github.com> Date: Thu, 16 Feb 2023 17:22:07 -0800 Subject: [PATCH 3/6] skip test if persistence is enabled --- .../test/integration/api/query.test.ts | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index 9fc6b82e348..c0ff42b3d5a 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -1615,30 +1615,34 @@ apiDescribe('Queries', (persistence: boolean) => { }); }); }); - - it('can raise expected snapshot when resume query after deleting docs', () => { - const testDocs = {}; - for (let i = 1; i <= 100; i++) { - Object.assign(testDocs, { ['doc' + i]: { key: i } }); - } - return withTestCollection(persistence, testDocs, async (coll, db) => { - const snapshot1 = await getDocs(coll); - expect(snapshot1.size).to.equal(100); - // Delete 50 docs in transaction so that it doesn't affect local cache. - await runTransaction(db, async txn => { - for (let i = 1; i <= 50; i++) { - txn.delete(doc(coll, 'doc' + i)); - } + + // eslint-disable-next-line no-restricted-properties + (persistence ? it.skip: it)( + 'can raise expected snapshot when resume query after deleting docs', + () => { + const testDocs = {}; + for (let i = 1; i <= 100; i++) { + Object.assign(testDocs, { ['doc' + i]: { key: i } }); + } + return withTestCollection(persistence, testDocs, async (coll, db) => { + const snapshot1 = await getDocs(coll); + expect(snapshot1.size).to.equal(100); + // Delete 50 docs in transaction so that it doesn't affect local cache. + await runTransaction(db, async txn => { + for (let i = 1; i <= 50; i++) { + txn.delete(doc(coll, 'doc' + i)); + } + }); + // Wait 10 seconds, during which the watch will stop tracking the query + // and will send an existence filter rather than "delete" events. + await (function () { + return new Promise(resolve => setTimeout(resolve, 10000)); + })(); + const snapshot2 = await getDocs(coll); + expect(snapshot2.size).to.equal(50); }); - // Wait 10 seconds, during which the watch will stop tracking the query - // and will send an existence filter rather than "delete" events. - await (function () { - return new Promise(resolve => setTimeout(resolve, 10000)); - })(); - const snapshot2 = await getDocs(coll); - expect(snapshot2.size).to.equal(50); - }); - }).timeout('15s'); + } + ).timeout('20s'); }); function verifyDocumentChange( From 5f40f6961ecabed5212e7acfb2bcee853b03c87c Mon Sep 17 00:00:00 2001 From: milaGGL <107142260+milaGGL@users.noreply.github.com> Date: Thu, 16 Feb 2023 18:12:29 -0800 Subject: [PATCH 4/6] format --- packages/firestore/test/integration/api/query.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index c0ff42b3d5a..ff453896e36 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -1615,9 +1615,9 @@ apiDescribe('Queries', (persistence: boolean) => { }); }); }); - + // eslint-disable-next-line no-restricted-properties - (persistence ? it.skip: it)( + (persistence ? it.skip : it)( 'can raise expected snapshot when resume query after deleting docs', () => { const testDocs = {}; From 53703fd3265af46625e80dbf2dc9521cc30bf512 Mon Sep 17 00:00:00 2001 From: milaGGL <107142260+milaGGL@users.noreply.github.com> Date: Thu, 16 Feb 2023 18:30:47 -0800 Subject: [PATCH 5/6] resolve comments --- packages/firestore/test/integration/api/query.test.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index ff453896e36..6f756014990 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -1618,7 +1618,7 @@ apiDescribe('Queries', (persistence: boolean) => { // eslint-disable-next-line no-restricted-properties (persistence ? it.skip : it)( - 'can raise expected snapshot when resume query after deleting docs', + 'resuming a query should remove deleted documents indicated by existence filter', () => { const testDocs = {}; for (let i = 1; i <= 100; i++) { @@ -1633,11 +1633,9 @@ apiDescribe('Queries', (persistence: boolean) => { txn.delete(doc(coll, 'doc' + i)); } }); - // Wait 10 seconds, during which the watch will stop tracking the query + // Wait 10 seconds, during which Watch will stop tracking the query // and will send an existence filter rather than "delete" events. - await (function () { - return new Promise(resolve => setTimeout(resolve, 10000)); - })(); + await new Promise(resolve => setTimeout(resolve, 10000)); const snapshot2 = await getDocs(coll); expect(snapshot2.size).to.equal(50); }); From 4cb8e3f1ec00de37cf87863fb2bcbdb66d400712 Mon Sep 17 00:00:00 2001 From: milaGGL <107142260+milaGGL@users.noreply.github.com> Date: Thu, 16 Feb 2023 18:49:42 -0800 Subject: [PATCH 6/6] Update query.test.ts --- packages/firestore/test/integration/api/query.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index 6f756014990..f6aa9781d75 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -1620,9 +1620,9 @@ apiDescribe('Queries', (persistence: boolean) => { (persistence ? it.skip : it)( 'resuming a query should remove deleted documents indicated by existence filter', () => { - const testDocs = {}; + const testDocs: { [key: string]: object } = {}; for (let i = 1; i <= 100; i++) { - Object.assign(testDocs, { ['doc' + i]: { key: i } }); + testDocs['doc' + i] = { key: i }; } return withTestCollection(persistence, testDocs, async (coll, db) => { const snapshot1 = await getDocs(coll);