mirror of
https://github.com/hanzoai/firebase-js-sdk.git
synced 2026-09-24 16:59:10 +00:00
* Split storage and storage-compat (#5271) * separate storage-compat from storage * commit * fix tests * wat? * build storage-compat * save * fixing some compat tests * format * update import path * format * get compat tests to work * format * update package json * cleanup * format * address comments * Update packages/storage-compat/test/unit/service.test.ts Co-authored-by: Christina Holland <[email protected]> * add missing dev dep * Update packages/storage-compat/package.json * Update packages/storage-compat/package.json * Update deps after v8 release * update compat version * Split database and database-compat (#5276) * compile database * pass database tests * compile and test database-compat * pass all tests * prettier * cleanup * fix lint * address comments * what is going on with ci * use correct case in import path * uppercase * rename * fix component name * Repo refactoring for v9 (#5325) * rename folders * rename folders * migrate app and app-compat * migrate installations and analytics * migrate app check * migrate auth * migrate functions * migrate messaging * migrate performance * migrate remoteconfig * remove v8 code * update versions * migrate firebase * fix merge issues * save * fix firebase builds * update changeset config * update build scripts * update release script * fix functions typings * remove redundant typings * update path * treat external dependencies correctly * fix lint * remove firestore-compat references * fix build issues * update build scripts * update pkg json * fix test * fix some tests * fix some tests * fix integration tests * fixes * fix dep * update ci tests * resolve todos * remove exp references * docgen build * export FirebaseError (#5349) * firebase packaging update (#5348) * Fei v9 main firestore (#5319) * compile firestore * update typings path * compile firestore compat * lint compat * make test work * get most tests work * build * remove special paths * update firestore-compat pkg json * fix merge issues * Simplify bundles * Prettier * Fix Bundle compile * Fix build * address comments * console build * Fix all tests * Prettier * fix merge issues * fix typo * update paths * app-exp * fix lint * correct path * fix * fix compat lint * fix firestore integration * fix workflow * update dep * Always block on Auth (#5340) * Always block on Auth * Don't block on token if already recevied * fix lint * build firestore * remove memory only tests * fix firebase integration tests * enable more build and tests * add firestore-compat to firebase dep * fix auth compat class * enable auth test * auth package doc * Update API reports Co-authored-by: Sebastian Schmidt <[email protected]> Co-authored-by: Feiyang1 <[email protected]> * rebasing * Create registerMessagingCompat.ts * Add changeset for v9 (#5350) * add changeset * publish messaging interop * add firestore bumps * update changeset * Revert "Create registerMessagingCompat.ts" This reverts commit 0b95a5167e403ffc0dbcd9dd7dcb7cda754e510d. * Revert "rebasing" This reverts commit a8bf697157aaa29e8450acb626aae81ad5b542e1. * Update index.d.ts (#5355) * Fix Context Check in `Messaging-Compat` (#5353) * Add Rules Unit Testing v2 skeleton for v9 release (#5352) * Reset package for next major version. * Switch emulator script to node-fetch. * Migrate the other request call to fetch. * Update packages/rules-unit-testing/package.json Co-authored-by: Feiyang <[email protected]> * Create stale-ducks-live.md * Revert version change. Co-authored-by: Feiyang <[email protected]> * fix import path (#5356) * Add new types and function stubs for RUT vNext. (#5316) * Add new types and function stubs. * Fix types for testEnv.emulators. * Add util functions. * Add withFunctionTriggersDisabled overloads. * Improve typing for EmulatorConfig. * Fix tests. * Rename test_environment.ts to initialize.ts. * Add a dummy test to make CI pass. * Implement emulators discovery in RUTv2. (#5334) * Add new types and function stubs. * Fix types for testEnv.emulators. * Add util functions. * Add withFunctionTriggersDisabled overloads. * Improve typing for EmulatorConfig. * Fix tests. * Rename test_environment.ts to initialize.ts. * Add a dummy test to make CI pass. * Implement emulators discovery. * Use URL object from global. * Fix unreachable error code. * Implement most of RUTv2 features. (#5343) * Implement most of RUTv2 features. * Switch to compat instances. * Remove legacy code. * Use public typings for release (#5358) * use public typings for storage * use public typings for database * Implement rest of RUTv2 features. (#5360) * Implement loading rules and withFunctionTriggersDisabled. * Implement clearFirestore and storage. * Add missing await. * Add default bucketUrl. * Use alternative method to clear bucket. * Use default param (review feedback). * Storage typing updates (#5359) * rename to StorageError * more type safety * Update API reports * update api report Co-authored-by: Feiyang1 <[email protected]> * correct component name * fix installtions-compat typing * remove rules-unit-testing from ignore list * reenable things * support mjs files * correct matching pattern * transform only @firebase/util * use public types for database doc * transform all but compat packages Co-authored-by: Sebastian Schmidt <[email protected]> Co-authored-by: Feiyang1 <[email protected]> Co-authored-by: kai <[email protected]> Co-authored-by: Yuchen Shi <[email protected]> Co-authored-by: Kai Wu <[email protected]>
153 lines
4.1 KiB
TypeScript
153 lines
4.1 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2019 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 { expect } from 'chai';
|
|
|
|
import { Database } from '../src/api/Database';
|
|
import { Reference } from '../src/api/Reference';
|
|
|
|
import { getRandomNode } from './helpers/util';
|
|
|
|
describe('ServerValue tests', () => {
|
|
it('resolves timestamps locally', async () => {
|
|
const node = getRandomNode() as Reference;
|
|
const start = Date.now();
|
|
const values: number[] = [];
|
|
node.on('value', snap => {
|
|
expect(typeof snap.val()).to.equal('number');
|
|
values.push(snap.val() as number);
|
|
});
|
|
await node.set(Database.ServerValue.TIMESTAMP);
|
|
node.off('value');
|
|
|
|
// By the time the write is acknowledged, we should have a local and
|
|
// server version of the timestamp.
|
|
expect(values.length).to.equal(2);
|
|
values.forEach(serverTime => {
|
|
const delta = Math.abs(serverTime - start);
|
|
expect(delta).to.be.lessThan(1000);
|
|
});
|
|
});
|
|
|
|
it('handles increments without listeners', async () => {
|
|
// Ensure that increments don't explode when the SyncTree must return a null
|
|
// node (i.e. ChildrenNode.EMPTY_NODE) because there is not yet any synced
|
|
// data.
|
|
const node = getRandomNode() as Reference;
|
|
await node.set(Database.ServerValue.increment(1));
|
|
});
|
|
|
|
describe('handles increments', () => {
|
|
for (const mode of ['offline', 'online']) {
|
|
const maybeAwait = async (p: Promise<any>) => {
|
|
if (mode === 'online') {
|
|
await p;
|
|
}
|
|
};
|
|
|
|
it(mode, async () => {
|
|
const node = getRandomNode() as Reference;
|
|
if (mode === 'offline') {
|
|
node.database.goOffline();
|
|
}
|
|
|
|
const addOne = Database.ServerValue.increment(1);
|
|
|
|
const values: any = [];
|
|
const expected: any = [];
|
|
node.on('value', snap => values.push(snap.val()));
|
|
|
|
// null -> increment(x) = x
|
|
maybeAwait(node.set(addOne));
|
|
expected.push(1);
|
|
|
|
// x -> increment(y) = x + y
|
|
maybeAwait(node.set(5));
|
|
maybeAwait(node.set(addOne));
|
|
expected.push(5);
|
|
expected.push(6);
|
|
|
|
// str -> increment(x) = x
|
|
maybeAwait(node.set('hello'));
|
|
maybeAwait(node.set(addOne));
|
|
expected.push('hello');
|
|
expected.push(1);
|
|
|
|
// obj -> increment(x) = x
|
|
maybeAwait(node.set({ 'hello': 'world' }));
|
|
maybeAwait(node.set(addOne));
|
|
expected.push({ 'hello': 'world' });
|
|
expected.push(1);
|
|
|
|
node.off('value');
|
|
expect(values).to.deep.equal(expected);
|
|
node.database.goOnline();
|
|
});
|
|
}
|
|
});
|
|
|
|
it('handles sparse updates', async () => {
|
|
const node = getRandomNode() as Reference;
|
|
|
|
let value: any = null;
|
|
let events = 0;
|
|
node.on('value', snap => {
|
|
value = snap.val();
|
|
events++;
|
|
});
|
|
|
|
await node.update({
|
|
'child/increment': Database.ServerValue.increment(1),
|
|
'literal': 5
|
|
});
|
|
expect(value).to.deep.equal({
|
|
'literal': 5,
|
|
'child': {
|
|
'increment': 1
|
|
}
|
|
});
|
|
|
|
await node.update({
|
|
'child/increment': Database.ServerValue.increment(41)
|
|
});
|
|
expect(value).to.deep.equal({
|
|
'literal': 5,
|
|
'child': {
|
|
'increment': 42
|
|
}
|
|
});
|
|
|
|
node.off('value');
|
|
|
|
expect(events).to.equal(2);
|
|
});
|
|
|
|
it('handles races', async () => {
|
|
const node = getRandomNode() as Reference;
|
|
const all: Array<Promise<any>> = [];
|
|
const racers = 100;
|
|
|
|
for (let i = 0; i < racers; i++) {
|
|
all.push(node.set(Database.ServerValue.increment(1)));
|
|
}
|
|
await Promise.all(all);
|
|
|
|
const snap = await node.once('value');
|
|
expect(snap.val()).to.equal(racers);
|
|
});
|
|
});
|