From 18b714bbadbc3c68bd9878830bf2f4f1c93c0d7f Mon Sep 17 00:00:00 2001 From: Rich Hodgkins Date: Mon, 13 Jan 2025 13:54:24 +0000 Subject: [PATCH 1/3] Fixed issue calling DataSnapshot methods with null data (see firebase/firebase-functions-test#254) --- src/common/providers/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/providers/database.ts b/src/common/providers/database.ts index d73bb5503..a9883d852 100644 --- a/src/common/providers/database.ts +++ b/src/common/providers/database.ts @@ -128,7 +128,7 @@ export class DataSnapshot implements database.DataSnapshot { let source = this._data; if (parts.length) { for (const part of parts) { - if (source[part] === undefined) { + if (source[part] === undefined || source[part] === null) { return null; } source = source[part]; From c573ff7758e28fe61526990f7666ca7247ff7d3a Mon Sep 17 00:00:00 2001 From: Rich Hodgkins Date: Wed, 5 Feb 2025 12:38:50 +0000 Subject: [PATCH 2/3] Added test cases for fix --- spec/v1/providers/database.spec.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/v1/providers/database.spec.ts b/spec/v1/providers/database.spec.ts index 18d973b1d..c189ca4eb 100644 --- a/spec/v1/providers/database.spec.ts +++ b/spec/v1/providers/database.spec.ts @@ -494,20 +494,31 @@ describe("DataSnapshot", () => { it("should deal with null-values appropriately", () => { populate(null); expect(subject.val()).to.be.null; + expect(subject.child("a").val()).to.be.null; + expect(subject.child("a/b").val()).to.be.null; populate({ myKey: null }); expect(subject.val()).to.be.null; + expect(subject.child("myKey").val()).to.be.null; + expect(subject.child("myKey/a").val()).to.be.null; + expect(subject.child("myKey/a/b").val()).to.be.null; + expect(subject.child("a").val()).to.be.null; + expect(subject.child("a/b").val()).to.be.null; }); it("should deal with empty object values appropriately", () => { populate({}); expect(subject.val()).to.be.null; + expect(subject.child("a").val()).to.be.null; populate({ myKey: {} }); expect(subject.val()).to.be.null; + expect(subject.child("myKey").val()).to.be.null; populate({ myKey: { child: null } }); expect(subject.val()).to.be.null; + expect(subject.child("myKey").val()).to.be.null; + expect(subject.child("myKey/child").val()).to.be.null; }); it("should deal with empty array values appropriately", () => { From bd23462e948a3caaf8e05976a3b170b3d69aa3c6 Mon Sep 17 00:00:00 2001 From: Rich Hodgkins Date: Wed, 5 Feb 2025 12:41:11 +0000 Subject: [PATCH 3/3] Better fix for calling DataSnapshot#val() with null data --- src/common/providers/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/providers/database.ts b/src/common/providers/database.ts index a9883d852..7fd4da89b 100644 --- a/src/common/providers/database.ts +++ b/src/common/providers/database.ts @@ -128,7 +128,7 @@ export class DataSnapshot implements database.DataSnapshot { let source = this._data; if (parts.length) { for (const part of parts) { - if (source[part] === undefined || source[part] === null) { + if (typeof source === "undefined" || source === null) { return null; } source = source[part];