UNPKG

dla

Version:

node.js data loader with caching and support of lists

284 lines 9.56 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); require("source-map-support/register"); const assert = require("assert"); const __1 = require(".."); function initCollection(cache) { const result = { collection: new __1.Collection({ cache, extractId: (item) => item.id, loadFew: (ids) => { result.queryCounter++; result.objectsCounter += ids.length; return new Promise((resolve) => { setTimeout(() => { resolve(__1.index(ids.map((id) => ({ id, })), (item) => item.id)); }, 300); }); }, }), objectsCounter: 0, queryCounter: 0, }; return result; } function initListableCollection(cache) { const data = [{ id: '1', age: 28, sex: 'm', }, { id: '2', age: 25, sex: 'f', }, { id: '3', age: 16, sex: 'm', }, { id: '4', age: 52, sex: 'f', }]; const result = { collection: new __1.ListableCollection({ cache, extractId: (human) => human.id, loadOne: (id) => { result.objectsCounter++; return new Promise((resolve) => { setTimeout(() => { resolve(data.find((item) => item.id === id)); }, 300); }); }, loadList: (filter) => { result.listsCounter++; return { items: data.filter((item) => (!('minAge' in filter) || item.age >= filter.minAge) && (!('sex' in filter) || item.sex === filter.sex)), }; }, invalidationTags: (filter) => { const invalidators = []; if ('sex' in filter) { invalidators.push(`sex=${filter.sex}`); } return invalidators; }, }), listsCounter: 0, objectsCounter: 0, }; return result; } describe('cache', () => { it('get/set/remove', () => __awaiter(this, void 0, void 0, function* () { const cache = new __1.MemoryCache(); assert(!(yield cache.get('a'))); yield cache.set('a', { a: 55 }); assert.deepEqual(yield cache.get('a'), { a: 55 }); yield cache.remove('a'); assert(!(yield cache.get('a'))); })); it('objects cache', () => __awaiter(this, void 0, void 0, function* () { const cache = new __1.MemoryCache(); const test1 = initCollection(cache); assert.deepEqual(yield test1.collection.getFewAsArray(['5', '5', '6', '7']), [{ id: '5' }, { id: '5' }, { id: '6' }, { id: '7' }]); assert.equal(test1.queryCounter, 1); assert.equal(test1.objectsCounter, 3); const test2 = initCollection(cache); assert.deepEqual(yield test2.collection.getFewAsArray(['4', '6', '8']), [{ id: '4' }, { id: '6' }, { id: '8' }]); assert.equal(test2.queryCounter, 1); assert.equal(test2.objectsCounter, 2); yield test2.collection.clearCache('5'); yield test2.collection.clearCache(['6', '8']); assert.deepEqual(yield test2.collection.getFewAsArray(['4', '5', '6', '7', '8']), [{ id: '4' }, { id: '5' }, { id: '6' }, { id: '7' }, { id: '8' }]); assert.equal(test2.queryCounter, 2); assert.equal(test2.objectsCounter, 5); })); it('lists cache', () => __awaiter(this, void 0, void 0, function* () { const cache = new __1.MemoryCache(); const test1 = initListableCollection(cache); assert.deepEqual(yield test1.collection.getList({ minAge: 27, }), [{ id: '1', age: 28, sex: 'm', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test1.objectsCounter, 0); assert.equal(test1.listsCounter, 1); assert.deepEqual(yield test1.collection.getList({ minAge: 27, }), [{ id: '1', age: 28, sex: 'm', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test1.objectsCounter, 0); assert.equal(test1.listsCounter, 1); const test2 = initListableCollection(cache); assert.deepEqual(yield test2.collection.getList({ minAge: 27, }), [{ id: '1', age: 28, sex: 'm', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 0); assert.deepEqual(yield test2.collection.getList({ minAge: 29, }), [{ id: '4', age: 52, sex: 'f', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 1); yield test2.collection.clearCache('1'); assert.deepEqual(yield test2.collection.getList({ minAge: 27, }), [{ id: '1', age: 28, sex: 'm', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 2); assert.deepEqual(yield test2.collection.getList({ minAge: 29, }), [{ id: '4', age: 52, sex: 'f', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 2); })); it('invalidate list cache', () => __awaiter(this, void 0, void 0, function* () { const cache = new __1.MemoryCache(); const test1 = initListableCollection(cache); assert.deepEqual(yield test1.collection.getList({ sex: 'm', }), [{ id: '1', age: 28, sex: 'm', }, { id: '3', age: 16, sex: 'm', }]); assert.deepEqual(yield test1.collection.getList({ sex: 'f', }), [{ id: '2', age: 25, sex: 'f', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test1.objectsCounter, 0); assert.equal(test1.listsCounter, 2); yield test1.collection.invalidateCacheTag('sex=m'); assert.deepEqual(yield test1.collection.getList({ sex: 'm', }), [{ id: '1', age: 28, sex: 'm', }, { id: '3', age: 16, sex: 'm', }]); assert.equal(test1.objectsCounter, 0); assert.equal(test1.listsCounter, 3); assert.deepEqual(yield test1.collection.getList({ sex: 'f', }), [{ id: '2', age: 25, sex: 'f', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test1.objectsCounter, 0); assert.equal(test1.listsCounter, 3); const test2 = initListableCollection(cache); assert.deepEqual(yield test2.collection.getList({ sex: 'm', }), [{ id: '1', age: 28, sex: 'm', }, { id: '3', age: 16, sex: 'm', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 0); assert.deepEqual(yield test1.collection.getList({ sex: 'f', }), [{ id: '2', age: 25, sex: 'f', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 0); test2.collection.invalidateCacheTag('sex=f'); assert.deepEqual(yield test2.collection.getList({ sex: 'f', }), [{ id: '2', age: 25, sex: 'f', }, { id: '4', age: 52, sex: 'f', }]); assert.equal(test2.objectsCounter, 0); assert.equal(test2.listsCounter, 1); })); }); //# sourceMappingURL=cache.t.js.map