diff --git a/__mocks__/__tests__/gatsby-plugin-firebase.test.js b/__mocks__/__tests__/gatsby-plugin-firebase.test.js index cb979bcc..84e0a9ca 100644 --- a/__mocks__/__tests__/gatsby-plugin-firebase.test.js +++ b/__mocks__/__tests__/gatsby-plugin-firebase.test.js @@ -74,17 +74,31 @@ describe('FirebaseStub', () => { expect(database1.uuid).toEqual(database2.uuid); }); - it('reuses existing Reference instance', () => { - const ref1 = FirebaseStub.database().ref( - `${DatabaseConstants.resumesPath}/123`, - ); - const ref2 = FirebaseStub.database().ref( - `${DatabaseConstants.resumesPath}/123`, - ); + describe('ref function', () => { + it('reuses existing Reference instance', () => { + const ref1 = FirebaseStub.database().ref( + `${DatabaseConstants.resumesPath}/123`, + ); + const ref2 = FirebaseStub.database().ref( + `${DatabaseConstants.resumesPath}/123`, + ); - expect(ref1.uuid).toBeTruthy(); - expect(ref2.uuid).toBeTruthy(); - expect(ref1.uuid).toEqual(ref2.uuid); + expect(ref1).toBeTruthy(); + expect(ref2).toBeTruthy(); + expect(ref1).toEqual(ref2); + }); + + it('leading slash in reference path is ignored', () => { + const path = `${DatabaseConstants.resumesPath}/123`; + + const ref1 = FirebaseStub.database().ref(path); + expect(ref1).toBeTruthy(); + expect(ref1.path).toEqual(path); + + const ref2 = FirebaseStub.database().ref(`/${path}`); + expect(ref2).toBeTruthy(); + expect(ref2).toEqual(ref1); + }); }); it('ServerValue.TIMESTAMP returns current time in milliseconds', () => { diff --git a/__mocks__/gatsby-plugin-firebase/constants/database.js b/__mocks__/gatsby-plugin-firebase/constants/database.js index 6ea40ad8..6f4fbe5d 100644 --- a/__mocks__/gatsby-plugin-firebase/constants/database.js +++ b/__mocks__/gatsby-plugin-firebase/constants/database.js @@ -5,7 +5,7 @@ const childRemovedEventType = 'child_removed'; const resumesPath = 'resumes'; const usersPath = 'users'; -const connectedPath = '/.info/connected'; +const connectedPath = '.info/connected'; const demoStateResume1Id = 'demo_1'; const demoStateResume2Id = 'demo_2'; diff --git a/__mocks__/gatsby-plugin-firebase/database/database.js b/__mocks__/gatsby-plugin-firebase/database/database.js index b6fcbdcb..69125d2d 100644 --- a/__mocks__/gatsby-plugin-firebase/database/database.js +++ b/__mocks__/gatsby-plugin-firebase/database/database.js @@ -135,18 +135,19 @@ class Database { } ref(referencePath) { - const existingRef = this._getReference(referencePath); - if (existingRef) { - existingRef.initializeQueryParameters(); - return existingRef; - } - const newRef = new Reference( referencePath, (dataPath) => this._getData(dataPath), (dataPath, value) => this._setData(dataPath, value), (refPath) => this._getReference(refPath), ); + + const existingRef = this._getReference(newRef.path); + if (existingRef) { + existingRef.initializeQueryParameters(); + return existingRef; + } + this._references[newRef.path] = newRef; return newRef; } diff --git a/__mocks__/gatsby-plugin-firebase/database/reference.js b/__mocks__/gatsby-plugin-firebase/database/reference.js index 8d7d5c74..18e5d75c 100644 --- a/__mocks__/gatsby-plugin-firebase/database/reference.js +++ b/__mocks__/gatsby-plugin-firebase/database/reference.js @@ -5,15 +5,25 @@ import { debounce } from 'lodash'; import DatabaseConstants from '../constants/database'; import DataSnapshot from './dataSnapshot'; +const parsePath = (path) => { + if (!path) { + throw new Error('path must be provided.'); + } else if (typeof path !== 'string') { + throw new Error('path should be a string.'); + } else { + let parsedPath = path.trim(); + + if (parsedPath[0] === '/') { + parsedPath = parsedPath.substring(1); + } + + return parsedPath; + } +}; + class Reference { constructor(path, getDatabaseData, setDatabaseData, getReference) { - if (!path) { - throw new Error('path must be provided.'); - } else if (typeof path !== 'string') { - throw new Error('path should be a string.'); - } else { - this._path = path; - } + this._path = parsePath(path); this._uuid = uuidv4();