UNPKG

firesage

Version:

🔥 Extremely High Precision Typescript Wrapper for Firestore Web, Providing Unparalleled Type Safe and Dev Experience

186 lines (185 loc) • 9.31 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.writeThenReadTest = exports.readThenCompareWithWriteData = exports.compareWriteDataWithDocSnapData = exports.generateRandomData = exports.userRefCreator = exports.initializeApp = void 0; var _1 = require("."); var firestore_1 = require("firebase/firestore"); var app_1 = require("firebase/app"); var pick_random_1 = __importDefault(require("pick-random")); var betwin_1 = __importDefault(require("betwin")); var operations_1 = require("./operations"); var utils_1 = require("./utils"); var lodash_1 = require("lodash"); var equal_1 = require("./equal"); var fieldValue_1 = require("./fieldValue"); var initializeApp = function () { var env = process.env; var config = { projectId: env.PROJECT_ID, }; return (0, app_1.initializeApp)(config); }; exports.initializeApp = initializeApp; var userRefCreator = function (arg) { if (arg === void 0) { arg = 'FirelordTest'; } return (0, _1.getFirelord)()("topLevel/".concat(arg, "/Users")); }; exports.userRefCreator = userRefCreator; var generateRandomData = function () { var beenTo = ((0, pick_random_1.default)([[{ China: ['Guangdong'] }], [{ US: ['california'] }]], { count: (0, pick_random_1.default)([1, 2])[0], })[0] || []); var name = (0, pick_random_1.default)(['abc', 'efg'])[0] || 'jkl'; var role = ((0, pick_random_1.default)(['admin', 'editor', 'visitor'])[0] || 'admin'); var age = Math.random(); var a = { b: { c: Math.random(), f: [{ g: !(0, pick_random_1.default)([true, false])[0], h: new Date(), m: 2 }], }, e: fieldValue_1.arrayUnion.apply(void 0, (0, pick_random_1.default)(__spreadArray(__spreadArray(['a'], (0, betwin_1.default)('a', 'z'), true), ['z'], false), { count: (0, pick_random_1.default)(__spreadArray(__spreadArray([0], (0, betwin_1.default)(0, 9), true), [9], false))[0], })), i: { j: (0, fieldValue_1.increment)(1), l: new Date() }, k: (0, fieldValue_1.serverTimestamp)(), }; return { beenTo: beenTo, name: name, role: role, age: age, a: a }; }; exports.generateRandomData = generateRandomData; var compareWriteDataWithDocSnapData = function (writeData, docSnap) { var data = (0, lodash_1.cloneDeep)(writeData); var readData = docSnap.data(); var exists = docSnap.exists(); expect(exists).toBe(true); expect(readData).not.toBe(undefined); if (readData) { // convert date data.a.b.f = data.a.b.f.map(function (item) { item.h = firestore_1.Timestamp.fromDate(item.h); return item; }); // convert field value data.a.i.l = firestore_1.Timestamp.fromDate(data.a.i.l); data.a.e = docSnap.get('a.e'); data.a.i.j = docSnap.get('a.i.j'); data.a.k = docSnap.get('a.k'); expect(readData).toEqual(data); var fieldPaths = [ 'age', 'beenTo', 'name', 'role', 'a.e', 'a.k', 'a.b.c', 'a.b.f', 'a.i.j', 'a.i.l', ]; var flattenData_1 = (0, utils_1.flatten)(readData); fieldPaths.forEach(function (fieldPath) { expect({ data: docSnap.get(fieldPath), fieldPath: fieldPath }).toEqual({ data: flattenData_1[fieldPath], fieldPath: fieldPath, }); }); } }; exports.compareWriteDataWithDocSnapData = compareWriteDataWithDocSnapData; var readThenCompareWithWriteData = function (writeData, ref) { return __awaiter(void 0, void 0, void 0, function () { var docSnap, docSnapServer, arr; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, operations_1.getDoc)(ref)]; case 1: docSnap = _a.sent(); return [4 /*yield*/, (0, operations_1.getDocFromServer)(ref)]; case 2: docSnapServer = _a.sent(); expect((0, equal_1.snapshotEqual)(docSnapServer, docSnap)).toBe(true); arr = [docSnap, docSnapServer]; arr.forEach(function (dSnap) { return (0, exports.compareWriteDataWithDocSnapData)((0, lodash_1.cloneDeep)(writeData), dSnap); }); // https://stackoverflow.com/questions/70315073/firestore-web-version-9-modular-getdocsfromcache-seems-not-working // persistence are disable by default for web // cannot enable persistence without browser indexedDB // unable to test with cache, will error for getDoc // expect async throw https://stackoverflow.com/a/54585620/5338829 return [4 /*yield*/, expect((0, operations_1.getDocFromCache)(ref)).rejects.toThrow()]; case 3: // https://stackoverflow.com/questions/70315073/firestore-web-version-9-modular-getdocsfromcache-seems-not-working // persistence are disable by default for web // cannot enable persistence without browser indexedDB // unable to test with cache, will error for getDoc // expect async throw https://stackoverflow.com/a/54585620/5338829 _a.sent(); return [2 /*return*/]; } }); }); }; exports.readThenCompareWithWriteData = readThenCompareWithWriteData; var writeThenReadTest = function (writeCallback) { return __awaiter(void 0, void 0, void 0, function () { var data, ref; return __generator(this, function (_a) { switch (_a.label) { case 0: data = (0, exports.generateRandomData)(); return [4 /*yield*/, writeCallback(data)]; case 1: ref = _a.sent(); return [4 /*yield*/, (0, exports.readThenCompareWithWriteData)(data, ref)]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; exports.writeThenReadTest = writeThenReadTest;