mirror of
https://github.com/hanzoai/firebase-js-sdk.git
synced 2026-09-24 16:59:10 +00:00
249 lines
7.9 KiB
TypeScript
249 lines
7.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2017 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { DataSnapshot as ExpDataSnapshot } from '@firebase/database';
|
|
import { expect } from 'chai';
|
|
|
|
import { PRIORITY_INDEX } from '../../database/src/core/snap/indexes/PriorityIndex';
|
|
import { nodeFromJSON } from '../../database/src/core/snap/nodeFromJSON';
|
|
import { DataSnapshot, Reference } from '../src/api/Reference';
|
|
|
|
import { getRandomNode } from './helpers/util';
|
|
|
|
describe('DataSnapshot Tests', () => {
|
|
/** @returns {!DataSnapshot} */
|
|
const snapshotForJSON = function (json) {
|
|
const dummyRef = getRandomNode() as Reference;
|
|
return new DataSnapshot(
|
|
dummyRef.database,
|
|
new ExpDataSnapshot(
|
|
nodeFromJSON(json),
|
|
dummyRef._delegate,
|
|
PRIORITY_INDEX
|
|
)
|
|
);
|
|
};
|
|
|
|
it('DataSnapshot.hasChildren() works.', () => {
|
|
let snap = snapshotForJSON({});
|
|
expect(snap.hasChildren()).to.equal(false);
|
|
|
|
snap = snapshotForJSON(5);
|
|
expect(snap.hasChildren()).to.equal(false);
|
|
|
|
snap = snapshotForJSON({ x: 5 });
|
|
expect(snap.hasChildren()).to.equal(true);
|
|
});
|
|
|
|
it('DataSnapshot.exists() works.', () => {
|
|
let snap = snapshotForJSON({});
|
|
expect(snap.exists()).to.equal(false);
|
|
|
|
snap = snapshotForJSON({ '.priority': 1 });
|
|
expect(snap.exists()).to.equal(false);
|
|
|
|
snap = snapshotForJSON(null);
|
|
expect(snap.exists()).to.equal(false);
|
|
|
|
snap = snapshotForJSON(true);
|
|
expect(snap.exists()).to.equal(true);
|
|
|
|
snap = snapshotForJSON(5);
|
|
expect(snap.exists()).to.equal(true);
|
|
|
|
snap = snapshotForJSON({ x: 5 });
|
|
expect(snap.exists()).to.equal(true);
|
|
});
|
|
|
|
it('DataSnapshot.val() works.', () => {
|
|
let snap = snapshotForJSON(5);
|
|
expect(snap.val()).to.equal(5);
|
|
|
|
snap = snapshotForJSON({});
|
|
expect(snap.val()).to.equal(null);
|
|
|
|
const json = {
|
|
x: 5,
|
|
y: {
|
|
ya: 1,
|
|
yb: 2,
|
|
yc: { yca: 3 }
|
|
}
|
|
};
|
|
snap = snapshotForJSON(json);
|
|
expect(snap.val()).to.deep.equal(json);
|
|
});
|
|
|
|
it('DataSnapshot.child() works.', () => {
|
|
const snap = snapshotForJSON({ x: 5, y: { yy: 3, yz: 4 } });
|
|
expect(snap.child('x').val()).to.equal(5);
|
|
expect(snap.child('y').val()).to.deep.equal({ yy: 3, yz: 4 });
|
|
expect(snap.child('y').child('yy').val()).to.equal(3);
|
|
expect(snap.child('y/yz').val()).to.equal(4);
|
|
expect(snap.child('z').val()).to.equal(null);
|
|
expect(snap.child('x/y').val()).to.equal(null);
|
|
expect(snap.child('x').child('y').val()).to.equal(null);
|
|
});
|
|
|
|
it('DataSnapshot.hasChild() works.', () => {
|
|
const snap = snapshotForJSON({ x: 5, y: { yy: 3, yz: 4 } });
|
|
expect(snap.hasChild('x')).to.equal(true);
|
|
expect(snap.hasChild('y/yy')).to.equal(true);
|
|
expect(snap.hasChild('dinosaur')).to.equal(false);
|
|
expect(snap.child('x').hasChild('anything')).to.equal(false);
|
|
expect(snap.hasChild('x/anything/at/all')).to.equal(false);
|
|
});
|
|
|
|
it('DataSnapshot.key works.', () => {
|
|
const snap = snapshotForJSON({ a: { b: { c: 5 } } });
|
|
expect(snap.child('a').key).to.equal('a');
|
|
expect(snap.child('a/b/c').key).to.equal('c');
|
|
expect(snap.child('/a/b/c/').key).to.equal('c');
|
|
expect(snap.child('////a////b/c///').key).to.equal('c');
|
|
expect(snap.child('///').key).to.equal(snap.key);
|
|
|
|
// Should also work for nonexistent paths.
|
|
expect(snap.child('/z/q/r/v/m').key).to.equal('m');
|
|
});
|
|
|
|
it('DataSnapshot.forEach() works: no priorities.', () => {
|
|
const snap = snapshotForJSON({
|
|
a: 1,
|
|
z: 26,
|
|
m: 13,
|
|
n: 14,
|
|
c: 3,
|
|
b: 2,
|
|
e: 5
|
|
});
|
|
let out = '';
|
|
snap.forEach(child => {
|
|
out = out + child.key + ':' + child.val() + ':';
|
|
});
|
|
|
|
expect(out).to.equal('a:1:b:2:c:3:e:5:m:13:n:14:z:26:');
|
|
});
|
|
|
|
it('DataSnapshot.forEach() works: numeric priorities.', () => {
|
|
const snap = snapshotForJSON({
|
|
a: { '.value': 1, '.priority': 26 },
|
|
z: { '.value': 26, '.priority': 1 },
|
|
m: { '.value': 13, '.priority': 14 },
|
|
n: { '.value': 14, '.priority': 12 },
|
|
c: { '.value': 3, '.priority': 24 },
|
|
b: { '.value': 2, '.priority': 25 },
|
|
e: { '.value': 5, '.priority': 22 }
|
|
});
|
|
|
|
let out = '';
|
|
snap.forEach(child => {
|
|
out = out + child.key + ':' + child.val() + ':';
|
|
});
|
|
|
|
expect(out).to.equal('z:26:n:14:m:13:e:5:c:3:b:2:a:1:');
|
|
});
|
|
|
|
it('DataSnapshot.forEach() works: numeric priorities as strings.', () => {
|
|
const snap = snapshotForJSON({
|
|
a: { '.value': 1, '.priority': '26' },
|
|
z: { '.value': 26, '.priority': '1' },
|
|
m: { '.value': 13, '.priority': '14' },
|
|
n: { '.value': 14, '.priority': '12' },
|
|
c: { '.value': 3, '.priority': '24' },
|
|
b: { '.value': 2, '.priority': '25' },
|
|
e: { '.value': 5, '.priority': '22' }
|
|
});
|
|
|
|
let out = '';
|
|
snap.forEach(child => {
|
|
out = out + child.key + ':' + child.val() + ':';
|
|
});
|
|
|
|
expect(out).to.equal('z:26:n:14:m:13:e:5:c:3:b:2:a:1:');
|
|
});
|
|
|
|
it('DataSnapshot.forEach() works: alpha priorities.', () => {
|
|
const snap = snapshotForJSON({
|
|
a: { '.value': 1, '.priority': 'first' },
|
|
z: { '.value': 26, '.priority': 'second' },
|
|
m: { '.value': 13, '.priority': 'third' },
|
|
n: { '.value': 14, '.priority': 'fourth' },
|
|
c: { '.value': 3, '.priority': 'fifth' },
|
|
b: { '.value': 2, '.priority': 'sixth' },
|
|
e: { '.value': 5, '.priority': 'seventh' }
|
|
});
|
|
|
|
let out = '';
|
|
snap.forEach(child => {
|
|
out = out + child.key + ':' + child.val() + ':';
|
|
});
|
|
|
|
expect(out).to.equal('c:3:a:1:n:14:z:26:e:5:b:2:m:13:');
|
|
});
|
|
|
|
it('DataSnapshot.foreach() works: mixed alpha and numeric priorities', () => {
|
|
const json = {
|
|
alpha42: { '.value': 1, '.priority': 'zed' },
|
|
noPriorityC: { '.value': 1, '.priority': null },
|
|
num41: { '.value': 1, '.priority': 500 },
|
|
noPriorityB: { '.value': 1, '.priority': null },
|
|
num80: { '.value': 1, '.priority': 4000.1 },
|
|
num50: { '.value': 1, '.priority': 4000 },
|
|
num10: { '.value': 1, '.priority': 24 },
|
|
alpha41: { '.value': 1, '.priority': 'zed' },
|
|
alpha20: { '.value': 1, '.priority': 'horse' },
|
|
num20: { '.value': 1, '.priority': 123 },
|
|
num70: { '.value': 1, '.priority': 4000.01 },
|
|
noPriorityA: { '.value': 1, '.priority': null },
|
|
alpha30: { '.value': 1, '.priority': 'tree' },
|
|
num30: { '.value': 1, '.priority': 300 },
|
|
num60: { '.value': 1, '.priority': 4000.001 },
|
|
alpha10: { '.value': 1, '.priority': '0horse' },
|
|
num42: { '.value': 1, '.priority': 500 },
|
|
alpha40: { '.value': 1, '.priority': 'zed' },
|
|
num40: { '.value': 1, '.priority': 500 }
|
|
};
|
|
|
|
const snap = snapshotForJSON(json);
|
|
let out = '';
|
|
snap.forEach(child => {
|
|
out = out + child.key + ', ';
|
|
});
|
|
|
|
expect(out).to.equal(
|
|
'noPriorityA, noPriorityB, noPriorityC, num10, num20, num30, num40, num41, num42, num50, num60, num70, num80, alpha10, alpha20, alpha30, alpha40, alpha41, alpha42, '
|
|
);
|
|
});
|
|
|
|
it('.val() exports array-like data as arrays.', () => {
|
|
const array = ['bob', 'and', 'becky', 'seem', 'really', 'nice', 'yeah?'];
|
|
const snap = snapshotForJSON(array);
|
|
const snapVal = snap.val();
|
|
expect(snapVal).to.deep.equal(array);
|
|
expect(snapVal instanceof Array).to.equal(true); // to.equal doesn't verify type.
|
|
});
|
|
|
|
it('DataSnapshot can be JSON serialized', () => {
|
|
const json = {
|
|
foo: 'bar',
|
|
'.priority': 1
|
|
};
|
|
const snap = snapshotForJSON(json);
|
|
expect(JSON.parse(JSON.stringify(snap))).to.deep.equal(json);
|
|
});
|
|
});
|