From aaa34db44fa3dff2ca622a16762281b295386b17 Mon Sep 17 00:00:00 2001 From: Manuel Trezza Date: Fri, 6 Sep 2019 01:05:24 +0200 Subject: [PATCH 1/7] added master-key-only option when saving config --- integration/test/ParseConfigTest.js | 12 +++--------- src/ParseConfig.js | 12 ++++++++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/integration/test/ParseConfigTest.js b/integration/test/ParseConfigTest.js index 344897276..96353091d 100644 --- a/integration/test/ParseConfigTest.js +++ b/integration/test/ParseConfigTest.js @@ -5,15 +5,9 @@ const clear = require('./clear'); const Parse = require('../../node'); function testConfig() { - const data = { - params: { internal: 'i', public: 'p' }, - masterKeyOnly: { internal: true }, - }; - return Parse.CoreManager.getRESTController().request( - 'PUT', - 'config', - data, - { useMasterKey: true } + return Parse.Config.save( + { internal: "i", public: "p" }, + { internal: true } ); } diff --git a/src/ParseConfig.js b/src/ParseConfig.js index fcfccd484..76d3a05b4 100644 --- a/src/ParseConfig.js +++ b/src/ParseConfig.js @@ -95,10 +95,10 @@ class ParseConfig { * @return {Promise} A promise that is resolved with a newly-created * configuration object or with the current with the update. */ - static save(attrs: { [key: string]: any }) { + static save(attrs: { [key: string]: any }, masterKeyOnly: { [key: string]: any }) { const controller = CoreManager.getConfigController(); //To avoid a mismatch with the local and the cloud config we get a new version - return controller.save(attrs).then(() => { + return controller.save(attrs, masterKeyOnly).then(() => { return controller.get(); },(error) => { return Promise.reject(error); @@ -184,16 +184,20 @@ const DefaultController = { }); }, - save(attrs: { [key: string]: any }) { + save(attrs: { [key: string]: any }, masterKeyOnly: { [key: string]: any }) { const RESTController = CoreManager.getRESTController(); const encodedAttrs = {}; + const encodedMasterKeyOnly = {}; for(const key in attrs){ encodedAttrs[key] = encode(attrs[key]) } + for(const key in masterKeyOnly){ + encodedMasterKeyOnly[key] = encode(masterKeyOnly[key]) + } return RESTController.request( 'PUT', 'config', - { params: encodedAttrs }, + { params: encodedAttrs, masterKeyOnly: encodedMasterKeyOnly }, { useMasterKey: true } ).then(response => { if(response && response.result){ From 8b2afadf8709fedb46dcaf65d2c00abac6fa15ca Mon Sep 17 00:00:00 2001 From: Manuel Trezza Date: Fri, 6 Sep 2019 02:06:33 +0200 Subject: [PATCH 2/7] added docs; removed unnecessary encoding --- src/ParseConfig.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/ParseConfig.js b/src/ParseConfig.js index 76d3a05b4..de9e31777 100644 --- a/src/ParseConfig.js +++ b/src/ParseConfig.js @@ -92,14 +92,20 @@ class ParseConfig { /** * Save value keys to the server. * @static + * @param {Object} attrs The config parameters and values. + * @param {Object} masterKeyOnlyFlags The flags that define whether config parameters listed + * in `attrs` should be retrievable only by using the master key. + * For example: `param1: true` makes `param1` only retrievable by using the master key. + * If a parameter is not provided or set to `false`, it can be retrieved without + * using the master key. * @return {Promise} A promise that is resolved with a newly-created * configuration object or with the current with the update. */ - static save(attrs: { [key: string]: any }, masterKeyOnly: { [key: string]: any }) { + static save(attrs: { [key: string]: any }, masterKeyOnlyFlags: { [key: string]: any }) { const controller = CoreManager.getConfigController(); //To avoid a mismatch with the local and the cloud config we get a new version - return controller.save(attrs, masterKeyOnly).then(() => { - return controller.get(); + return controller.save(attrs, masterKeyOnlyFlags).then(() => { + return controller.get({useMasterKey: true}); },(error) => { return Promise.reject(error); }); @@ -184,20 +190,16 @@ const DefaultController = { }); }, - save(attrs: { [key: string]: any }, masterKeyOnly: { [key: string]: any }) { + save(attrs: { [key: string]: any }, masterKeyOnlyFlags: { [key: string]: any }) { const RESTController = CoreManager.getRESTController(); const encodedAttrs = {}; - const encodedMasterKeyOnly = {}; for(const key in attrs){ encodedAttrs[key] = encode(attrs[key]) } - for(const key in masterKeyOnly){ - encodedMasterKeyOnly[key] = encode(masterKeyOnly[key]) - } return RESTController.request( 'PUT', 'config', - { params: encodedAttrs, masterKeyOnly: encodedMasterKeyOnly }, + { params: encodedAttrs, masterKeyOnly: masterKeyOnlyFlags }, { useMasterKey: true } ).then(response => { if(response && response.result){ From e5c9786ee63d62855678629c82ecbcd37bc6c073 Mon Sep 17 00:00:00 2001 From: Manuel Trezza Date: Fri, 6 Sep 2019 02:07:12 +0200 Subject: [PATCH 3/7] generalized test config; added test case for retrieving config afer saving --- integration/test/ParseConfigTest.js | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/integration/test/ParseConfigTest.js b/integration/test/ParseConfigTest.js index 96353091d..a6b1a7960 100644 --- a/integration/test/ParseConfigTest.js +++ b/integration/test/ParseConfigTest.js @@ -6,7 +6,7 @@ const Parse = require('../../node'); function testConfig() { return Parse.Config.save( - { internal: "i", public: "p" }, + { internal: "i", string: "s", number: 12 }, { internal: true } ); } @@ -22,22 +22,21 @@ describe('Parse Config', () => { }); it('can create a config', async () => { - const config = await Parse.Config.save({ - str: 'hello', - num: 42 - }); - assert.equal(config.get('str'), 'hello'); - assert.equal(config.get('num'), 42); + const config = await testConfig(); + + assert.notStrictEqual(config, undefined); + assert.strictEqual(config.get('string'), 's'); + assert.strictEqual(config.get('internal'), 'i'); + assert.strictEqual(config.get('number'), 12); }); it('can get a config', async () => { - await Parse.Config.save({ - str: 'hello', - num: 42 - }); + await testConfig(); + const config = await Parse.Config.get(); - assert.equal(config.get('str'), 'hello'); - assert.equal(config.get('num'), 42); + assert.notStrictEqual(config, undefined); + assert.strictEqual(config.get('string'), 's'); + assert.strictEqual(config.get('number'), 12); }); it('can get internal config parameter with masterkey', async () => { @@ -45,7 +44,7 @@ describe('Parse Config', () => { const config = await Parse.Config.get({ useMasterKey: true }); assert.equal(config.get('internal'), 'i'); - assert.equal(config.get('public'), 'p'); + assert.equal(config.get('string'), 's'); }); it('cannot get internal config parameter without masterkey', async () => { @@ -53,6 +52,6 @@ describe('Parse Config', () => { const config = await Parse.Config.get(); assert.equal(config.get('internal'), undefined); - assert.equal(config.get('public'), 'p'); + assert.equal(config.get('string'), 's'); }); }); From 04152dcbc0f7cf05e900d87a58d6280550f55143 Mon Sep 17 00:00:00 2001 From: Manuel Trezza Date: Fri, 6 Sep 2019 02:07:25 +0200 Subject: [PATCH 4/7] Update package-lock.json --- package-lock.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d23ce5f1a..5930b4032 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6201,7 +6201,6 @@ "version": "14.5.4", "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.4.tgz", "integrity": "sha512-dPLvHoxy5m9FrkqWczPPRnH0X80CyvRE6e7Fa5AWEqEAzg9LpxHvKh24po/482E6VWHigOkAmb4xCp6P9yT9gw==", - "dev": true, "requires": { "iterall": "^1.2.2" } @@ -7543,8 +7542,7 @@ "iterall": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", - "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==", - "dev": true + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" }, "jasmine": { "version": "3.4.0", @@ -10052,7 +10050,7 @@ "dev": true }, "parse-server": { - "version": "github:parse-community/parse-server#ac40bf66f7cdeeb578fd716a8e3dd540470209ca", + "version": "github:parse-community/parse-server#bde96a9002a3286c417efaae79856264b8788cb1", "from": "github:parse-community/parse-server#master", "dev": true, "requires": { @@ -10376,8 +10374,7 @@ "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" }, "pn": { "version": "1.1.0", From 693ff905769b2745601c465c0e14da66d3609af0 Mon Sep 17 00:00:00 2001 From: Manuel Trezza Date: Fri, 6 Sep 2019 02:16:35 +0200 Subject: [PATCH 5/7] Revert "Update package-lock.json" This reverts commit 04152dcbc0f7cf05e900d87a58d6280550f55143. --- package-lock.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5930b4032..d23ce5f1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6201,6 +6201,7 @@ "version": "14.5.4", "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.4.tgz", "integrity": "sha512-dPLvHoxy5m9FrkqWczPPRnH0X80CyvRE6e7Fa5AWEqEAzg9LpxHvKh24po/482E6VWHigOkAmb4xCp6P9yT9gw==", + "dev": true, "requires": { "iterall": "^1.2.2" } @@ -7542,7 +7543,8 @@ "iterall": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", - "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==", + "dev": true }, "jasmine": { "version": "3.4.0", @@ -10050,7 +10052,7 @@ "dev": true }, "parse-server": { - "version": "github:parse-community/parse-server#bde96a9002a3286c417efaae79856264b8788cb1", + "version": "github:parse-community/parse-server#ac40bf66f7cdeeb578fd716a8e3dd540470209ca", "from": "github:parse-community/parse-server#master", "dev": true, "requires": { @@ -10374,7 +10376,8 @@ "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true }, "pn": { "version": "1.1.0", From c8664f9a8a3fb9708f9019ec92f4b8207fac0b60 Mon Sep 17 00:00:00 2001 From: Manuel Trezza Date: Fri, 6 Sep 2019 03:48:41 +0200 Subject: [PATCH 6/7] added unit test --- package-lock.json | 7 ++----- src/__tests__/ParseConfig-test.js | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d23ce5f1a..fd39a7e7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6201,7 +6201,6 @@ "version": "14.5.4", "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.4.tgz", "integrity": "sha512-dPLvHoxy5m9FrkqWczPPRnH0X80CyvRE6e7Fa5AWEqEAzg9LpxHvKh24po/482E6VWHigOkAmb4xCp6P9yT9gw==", - "dev": true, "requires": { "iterall": "^1.2.2" } @@ -7543,8 +7542,7 @@ "iterall": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", - "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==", - "dev": true + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" }, "jasmine": { "version": "3.4.0", @@ -10376,8 +10374,7 @@ "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" }, "pn": { "version": "1.1.0", diff --git a/src/__tests__/ParseConfig-test.js b/src/__tests__/ParseConfig-test.js index be8836148..59268cc9c 100644 --- a/src/__tests__/ParseConfig-test.js +++ b/src/__tests__/ParseConfig-test.js @@ -126,6 +126,31 @@ describe('ParseConfig', () => { }); }); + it('can save a config object that be retrieved with masterkey only', async () => { + CoreManager.setRESTController({ + request(method, path, body, options) { + expect(method).toBe('PUT'); + expect(path).toBe('config'); + expect(body).toEqual({ + params: {internal: 'i', number: 12}, + masterKeyOnly: {internal: true} }); + expect(options).toEqual({ useMasterKey: true }); + return Promise.resolve({ + params: { + internal: 'i', + number: 12 + } + }); + }, + ajax() {} + }); + const config = await ParseConfig.save( + {internal: 'i', number: 12}, + {internal: true}); + expect(config.get('internal')).toBe('i'); + expect(config.get('number')).toBe(12); + }); + it('rejects save on invalid response', (done) => { CoreManager.setRESTController({ request() { From 1ca016292d3faf5b378cec18c57d80942cac9c34 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Thu, 5 Sep 2019 21:07:59 -0500 Subject: [PATCH 7/7] fix test --- src/ParseConfig.js | 2 +- src/__tests__/ParseConfig-test.js | 68 +++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/ParseConfig.js b/src/ParseConfig.js index de9e31777..096057871 100644 --- a/src/ParseConfig.js +++ b/src/ParseConfig.js @@ -105,7 +105,7 @@ class ParseConfig { const controller = CoreManager.getConfigController(); //To avoid a mismatch with the local and the cloud config we get a new version return controller.save(attrs, masterKeyOnlyFlags).then(() => { - return controller.get({useMasterKey: true}); + return controller.get({ useMasterKey: true }); },(error) => { return Promise.reject(error); }); diff --git a/src/__tests__/ParseConfig-test.js b/src/__tests__/ParseConfig-test.js index 59268cc9c..a3fab0ab2 100644 --- a/src/__tests__/ParseConfig-test.js +++ b/src/__tests__/ParseConfig-test.js @@ -9,6 +9,7 @@ jest.dontMock('../CoreManager'); jest.dontMock('../decode'); +jest.dontMock('../encode'); jest.dontMock('../escape'); jest.dontMock('../ParseConfig'); jest.dontMock('../ParseError'); @@ -129,28 +130,71 @@ describe('ParseConfig', () => { it('can save a config object that be retrieved with masterkey only', async () => { CoreManager.setRESTController({ request(method, path, body, options) { - expect(method).toBe('PUT'); + console.log(method, path, body, options); + if (method === 'PUT') { + expect(method).toBe('PUT'); + expect(path).toBe('config'); + expect(body).toEqual({ + params: { internal: 'i', number: 12 }, + masterKeyOnly: { internal: true }, + }); + expect(options).toEqual({ useMasterKey: true }); + return Promise.resolve({ + params: { + internal: 'i', + number: 12 + }, + result: true, + }); + } else if (method === 'GET') { + expect(method).toBe('GET'); + expect(path).toBe('config'); + expect(body).toEqual({}); + expect(options).toEqual({ useMasterKey: true }); + return Promise.resolve({ + params: { + internal: 'i', + number: 12 + }, + }); + } + }, + ajax() {} + }); + const config = await ParseConfig.save( + { internal: 'i', number: 12 }, + { internal: true } + ); + expect(config.get('internal')).toBe('i'); + expect(config.get('number')).toBe(12); + }); + + it('can get a config object with master key', async () => { + CoreManager.setRESTController({ + request(method, path, body, options) { + expect(method).toBe('GET'); expect(path).toBe('config'); - expect(body).toEqual({ - params: {internal: 'i', number: 12}, - masterKeyOnly: {internal: true} }); + expect(body).toEqual({}); expect(options).toEqual({ useMasterKey: true }); return Promise.resolve({ params: { - internal: 'i', - number: 12 + str: 'hello', + num: 45 } }); }, ajax() {} }); - const config = await ParseConfig.save( - {internal: 'i', number: 12}, - {internal: true}); - expect(config.get('internal')).toBe('i'); - expect(config.get('number')).toBe(12); + const config = await ParseConfig.get({ useMasterKey: true }); + expect(config.get('str')).toBe('hello'); + expect(config.get('num')).toBe(45); + const path = Storage.generatePath('currentConfig'); + expect(JSON.parse(Storage.getItem(path))).toEqual({ + str: 'hello', + num: 45, + }); }); - + it('rejects save on invalid response', (done) => { CoreManager.setRESTController({ request() {