From 0ec188d843a07cb935e03c16044da709d1b74896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Thu, 24 Oct 2019 20:27:30 +0200 Subject: [PATCH] Fix(cache): Get multiple keys (#198) fix #187 --- package.json | 2 +- src/model.ts | 8 ++++- test/integration/cache.js | 61 ++++++++++++++++++++++++--------------- test/model-test.js | 14 ++++----- yarn.lock | 8 ++--- 5 files changed, 56 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index e919330..fbaf52a 100755 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "moment": "^2.24.0", - "nsql-cache": "^1.1.4", + "nsql-cache": "^1.1.5", "nsql-cache-datastore": "^1.1.6", "optional": "^0.1.4", "promised-hooks": "^3.1.0", diff --git a/src/model.ts b/src/model.ts index 5290973..b20154d 100755 --- a/src/model.ts +++ b/src/model.ts @@ -861,7 +861,13 @@ export const generateModel = ( } return dataloader.loadMany(keysArray).then((result: EntityData) => arrify(result)); } - return this.gstore.ds.get(keysArray).then(([result]: [any]) => arrify(result)); + + return this.gstore.ds.get(keys).then(([result]: [any]) => { + if (Array.isArray(keys)) { + return arrify(result); + } + return result; + }); }; if (this.__hasCache(options)) { diff --git a/test/integration/cache.js b/test/integration/cache.js index 6ba7f5c..2ac40ba 100644 --- a/test/integration/cache.js +++ b/test/integration/cache.js @@ -13,6 +13,22 @@ const { expect } = chai; const allKeys = []; +const gstore = new Gstore({ + cache: { + stores: [{ store: redisStore }], + config: { + ttl: { + keys: 600, + queries: 600, + }, + }, + }, +}); + +gstore.connect(ds); + +const uniqueId = () => chance.string({ pool: 'abcdefghijklmnopqrstuvwxyz0123456789' }); + const cleanUp = cb => { ds.delete(allKeys).then(cb); }; @@ -24,33 +40,11 @@ const addKey = key => { }; describe('Integration Tests (Cache)', () => { - let gstore; let schema; - let Schema; + const { Schema } = gstore; let Model; beforeEach(() => { - if (!gstore) { - gstore = new Gstore({ - cache: { - stores: [ - { - store: redisStore, - }, - ], - config: { - ttl: { - keys: 600, - queries: 600, - }, - }, - }, - }); - gstore.connect(ds); - } - - ({ Schema } = gstore); - gstore.models = {}; gstore.modelSchemas = {}; @@ -70,7 +64,7 @@ describe('Integration Tests (Cache)', () => { }); it('should set KEY symbol on query result', () => { - const id = chance.string({ pool: 'abcdefghijklmnopqrstuvwxyz0123456789' }); + const id = uniqueId(); const user = new Model({ email: 'test@test.com' }, id); return user.save().then(entity => { addKey(entity.entityKey); @@ -79,4 +73,23 @@ describe('Integration Tests (Cache)', () => { }); }); }); + + it('should get one or multiple entities fron the cache', async () => { + const id1 = uniqueId(); + const id2 = uniqueId(); + + const user1 = new Model({ email: 'test1@test.com' }, id1); + const user2 = new Model({ email: 'test2@test.com' }, id2); + + const result = await Promise.all([user1.save(), user2.save()]); + + result.forEach(entity => addKey(entity.entityKey)); + + const responseSingle = await Model.get(result[0].entityKey.name); + const responseMultiple = await Model.get([result[0].entityKey.name, result[1].entityKey.name]); + + expect(responseSingle.email).to.equal('test1@test.com'); + expect(responseMultiple[0].email).to.equal('test1@test.com'); + expect(responseMultiple[1].email).to.equal('test2@test.com'); + }); }); diff --git a/test/model-test.js b/test/model-test.js index 8f645ac..86cdfb2 100755 --- a/test/model-test.js +++ b/test/model-test.js @@ -310,7 +310,7 @@ describe('Model', () => { return GstoreModel.get(123).then(onEntity); function onEntity(_entity) { - expect(ds.get.getCall(0).args[0][0].constructor.name).equal('Key'); + expect(ds.get.getCall(0).args[0].constructor.name).equal('Key'); expect(_entity instanceof Entity.default).equal(true); } }); @@ -345,16 +345,16 @@ describe('Model', () => { it('not converting string with mix of number and non number', () => GstoreModel.get('123:456').then(() => { - expect(ds.get.getCall(0).args[0][0].name).equal('123:456'); + expect(ds.get.getCall(0).args[0].name).equal('123:456'); })); it('passing an ancestor path array', () => { const ancestors = ['Parent', 'keyname']; return GstoreModel.get(123, ancestors).then(() => { - expect(ds.get.getCall(0).args[0][0].constructor.name).equal('Key'); - expect(ds.get.getCall(0).args[0][0].parent.kind).equal(ancestors[0]); - expect(ds.get.getCall(0).args[0][0].parent.name).equal(ancestors[1]); + expect(ds.get.getCall(0).args[0].constructor.name).equal('Key'); + expect(ds.get.getCall(0).args[0].parent.kind).equal(ancestors[0]); + expect(ds.get.getCall(0).args[0].parent.name).equal(ancestors[1]); }); }); @@ -362,7 +362,7 @@ describe('Model', () => { const namespace = 'com.mydomain-dev'; return GstoreModel.get(123, null, namespace).then(() => { - expect(ds.get.getCall(0).args[0][0].namespace).equal(namespace); + expect(ds.get.getCall(0).args[0].namespace).equal(namespace); }); }); @@ -578,7 +578,7 @@ describe('Model', () => { GstoreModel.get(123).then(response => { assert.ok(ds.get.called); const { args } = ds.get.getCall(0); - expect(args[0][0].id).equal(123); + expect(args[0].id).equal(123); expect(response.entityData).include(entity); })); diff --git a/yarn.lock b/yarn.lock index a4c3616..5d5ff0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5006,10 +5006,10 @@ nsql-cache-datastore@^1.1.6: dependencies: arrify "1.0.1" -nsql-cache@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/nsql-cache/-/nsql-cache-1.1.4.tgz#8f408ce478b2f9338659ba27143435c1371405b9" - integrity sha512-E8LxBzf/Q6URAlkZZ6HIVTUGeiWYApf315pMfbPAE9FWHBB9rUzksm5XvrGDEYz/swUsEn4xvkayCgVvKpeKwg== +nsql-cache@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/nsql-cache/-/nsql-cache-1.1.5.tgz#10619d77fd711531a2e25e9992166797e40d39ec" + integrity sha512-QRJe7Z3fqUJc57NVTHsxRFXlCEIoLlb0FQMW5NOfWGMDq8Qcz4ampT2wnnvufT+T63uKgqvX4qwTAWMcQ3iuQw== dependencies: arrify "^1.0.1" cache-manager "^2.9.0"