From a12060f0c5e3f9bb654ba6dd492928a779cda747 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Fri, 1 Jul 2022 13:45:38 +0100 Subject: [PATCH 1/7] add mergeCollectionToUpdate --- lib/Onyx.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/Onyx.js b/lib/Onyx.js index 1ed4db16..2abe7e83 100644 --- a/lib/Onyx.js +++ b/lib/Onyx.js @@ -833,6 +833,9 @@ function update(data) { case 'merge': merge(key, value); break; + case 'mergeCollection': + mergeCollection(key, value); + break; default: break; } From 93958908e69733872c4a43e1b9fe05c03627098c Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 4 Jul 2022 18:31:05 +0100 Subject: [PATCH 2/7] add mergeCollection as a valid Onyx update method --- API.md | 2 +- lib/Onyx.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/API.md b/API.md index 62582f78..1fd4e621 100644 --- a/API.md +++ b/API.md @@ -220,7 +220,7 @@ Insert API responses and lifecycle data into Onyx | Param | Type | Description | | --- | --- | --- | -| data | Array | An array of objects with shape {onyxMethod: oneOf('set', 'merge'), key: string, value: *} | +| data | Array | An array of objects with shape {onyxMethod: oneOf('set', 'merge', 'mergeCollection'), key: string, value: *} | diff --git a/lib/Onyx.js b/lib/Onyx.js index 2abe7e83..1720367c 100644 --- a/lib/Onyx.js +++ b/lib/Onyx.js @@ -812,12 +812,12 @@ function mergeCollection(collectionKey, collection) { /** * Insert API responses and lifecycle data into Onyx * - * @param {Array} data An array of objects with shape {onyxMethod: oneOf('set', 'merge'), key: string, value: *} + * @param {Array} data An array of objects with shape {onyxMethod: oneOf('set', 'merge', 'mergeCollection'), key: string, value: *} */ function update(data) { // First, validate the Onyx object is in the format we expect _.each(data, ({onyxMethod, key}) => { - if (!_.contains(['set', 'merge'], onyxMethod)) { + if (!_.contains(['set', 'merge', 'mergeCollection'], onyxMethod)) { throw new Error(`Invalid onyxMethod ${onyxMethod} in Onyx update.`); } if (!_.isString(key)) { From 0bf39b3abc5f9d7b5274555fa99d7521c6380989 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 4 Jul 2022 18:31:26 +0100 Subject: [PATCH 3/7] add mergeCollection case to the Onyx.update test --- tests/unit/onyxTest.js | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tests/unit/onyxTest.js b/tests/unit/onyxTest.js index 670dafe9..e28e0356 100644 --- a/tests/unit/onyxTest.js +++ b/tests/unit/onyxTest.js @@ -325,16 +325,39 @@ describe('Onyx', () => { }, }); + let valuesReceived = {}; + connectionID = Onyx.connect({ + key: ONYX_KEYS.COLLECTION.TEST_KEY, + initWithStoredValues: false, + callback: (data, key) => valuesReceived[key] = data, + }); + return waitForPromisesToResolve() .then(() => { // GIVEN the initial Onyx state: {test: true, otherTest: {test1: 'test1'}} Onyx.set(ONYX_KEYS.TEST_KEY, true); Onyx.set(ONYX_KEYS.OTHER_TEST, {test1: 'test1'}); + Onyx.multiSet({ + test_1: { + existingData: 'test', + }, + test_2: { + existingData: 'test', + }, + }); return waitForPromisesToResolve(); }) .then(() => { expect(testKeyValue).toBe(true); expect(otherTestKeyValue).toEqual({test1: 'test1'}); + expect(valuesReceived).toEqual({ + test_1: { + existingData: 'test', + }, + test_2: { + existingData: 'test', + }, + }); // WHEN we pass a data object to Onyx.update Onyx.update([ @@ -348,6 +371,20 @@ describe('Onyx', () => { key: ONYX_KEYS.OTHER_TEST, value: {test2: 'test2'}, }, + { + onyxMethod: 'mergeCollection', + key: ONYX_KEYS.OTHER_TEST, + value: { + test_1: { + ID: 123, + value: 'one', + }, + test_2: { + ID: 234, + value: 'two', + }, + }, + }, ]); return waitForPromisesToResolve(); }) @@ -355,6 +392,16 @@ describe('Onyx', () => { // THEN the final Onyx state should be {test: 'one', otherTest: {test1: 'test1', test2: 'test2'}} expect(testKeyValue).toBe('one'); expect(otherTestKeyValue).toEqual({test1: 'test1', test2: 'test2'}); + expect(valuesReceived).toEqual({ + test_1: { + ID: 123, + value: 'one', + }, + test_2: { + ID: 234, + value: 'two', + }, + }); }); }); From 104c191199f941f36c80bb697418980a802be27b Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 4 Jul 2022 18:36:27 +0100 Subject: [PATCH 4/7] modified object should be const --- tests/unit/onyxTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/onyxTest.js b/tests/unit/onyxTest.js index e28e0356..1e7d7c0a 100644 --- a/tests/unit/onyxTest.js +++ b/tests/unit/onyxTest.js @@ -325,7 +325,7 @@ describe('Onyx', () => { }, }); - let valuesReceived = {}; + const valuesReceived = {}; connectionID = Onyx.connect({ key: ONYX_KEYS.COLLECTION.TEST_KEY, initWithStoredValues: false, From c14ca06bc3f48814cd0cc993be3272263873729e Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 4 Jul 2022 19:23:45 +0100 Subject: [PATCH 5/7] remove mergeCollection from set/merge update test --- tests/unit/onyxTest.js | 47 ------------------------------------------ 1 file changed, 47 deletions(-) diff --git a/tests/unit/onyxTest.js b/tests/unit/onyxTest.js index 1e7d7c0a..670dafe9 100644 --- a/tests/unit/onyxTest.js +++ b/tests/unit/onyxTest.js @@ -325,39 +325,16 @@ describe('Onyx', () => { }, }); - const valuesReceived = {}; - connectionID = Onyx.connect({ - key: ONYX_KEYS.COLLECTION.TEST_KEY, - initWithStoredValues: false, - callback: (data, key) => valuesReceived[key] = data, - }); - return waitForPromisesToResolve() .then(() => { // GIVEN the initial Onyx state: {test: true, otherTest: {test1: 'test1'}} Onyx.set(ONYX_KEYS.TEST_KEY, true); Onyx.set(ONYX_KEYS.OTHER_TEST, {test1: 'test1'}); - Onyx.multiSet({ - test_1: { - existingData: 'test', - }, - test_2: { - existingData: 'test', - }, - }); return waitForPromisesToResolve(); }) .then(() => { expect(testKeyValue).toBe(true); expect(otherTestKeyValue).toEqual({test1: 'test1'}); - expect(valuesReceived).toEqual({ - test_1: { - existingData: 'test', - }, - test_2: { - existingData: 'test', - }, - }); // WHEN we pass a data object to Onyx.update Onyx.update([ @@ -371,20 +348,6 @@ describe('Onyx', () => { key: ONYX_KEYS.OTHER_TEST, value: {test2: 'test2'}, }, - { - onyxMethod: 'mergeCollection', - key: ONYX_KEYS.OTHER_TEST, - value: { - test_1: { - ID: 123, - value: 'one', - }, - test_2: { - ID: 234, - value: 'two', - }, - }, - }, ]); return waitForPromisesToResolve(); }) @@ -392,16 +355,6 @@ describe('Onyx', () => { // THEN the final Onyx state should be {test: 'one', otherTest: {test1: 'test1', test2: 'test2'}} expect(testKeyValue).toBe('one'); expect(otherTestKeyValue).toEqual({test1: 'test1', test2: 'test2'}); - expect(valuesReceived).toEqual({ - test_1: { - ID: 123, - value: 'one', - }, - test_2: { - ID: 234, - value: 'two', - }, - }); }); }); From 24428d17f0ea5b83c5afc70dc262939164fe2156 Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 4 Jul 2022 19:24:12 +0100 Subject: [PATCH 6/7] create new Onyx.update test for mergeCollection --- tests/unit/onyxTest.js | 83 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/tests/unit/onyxTest.js b/tests/unit/onyxTest.js index 670dafe9..b59bb4de 100644 --- a/tests/unit/onyxTest.js +++ b/tests/unit/onyxTest.js @@ -358,6 +358,89 @@ describe('Onyx', () => { }); }); + it('should use update data object to merge a collection of keys', () => { + const valuesReceived = {}; + const mockCallback = jest.fn(data => valuesReceived[data.ID] = data.value); + connectionID = Onyx.connect({ + key: ONYX_KEYS.COLLECTION.TEST_KEY, + initWithStoredValues: false, + callback: mockCallback, + }); + + return waitForPromisesToResolve() + .then(() => { + // GIVEN the initial Onyx state: {test_1: {existingData: 'test',},test_2: {existingData: 'test',}} + Onyx.multiSet({ + test_1: { + existingData: 'test', + }, + test_2: { + existingData: 'test', + }, + }); + return waitForPromisesToResolve(); + }) + .then(() => { + expect(mockCallback.mock.calls[0][0]).toEqual({existingData: 'test'}); + expect(mockCallback.mock.calls[0][1]).toEqual('test_1'); + + expect(mockCallback.mock.calls[1][0]).toEqual({existingData: 'test'}); + expect(mockCallback.mock.calls[1][1]).toEqual('test_2'); + + // WHEN we pass a mergeCollection data object to Onyx.update + Onyx.update([ + { + onyxMethod: 'mergeCollection', + key: ONYX_KEYS.COLLECTION.TEST_KEY, + value: { + test_1: { + ID: 123, + value: 'one', + }, + test_2: { + ID: 234, + value: 'two', + }, + test_3: { + ID: 345, + value: 'three', + }, + }, + }, + ]); + return waitForPromisesToResolve(); + }) + .then(() => { + /* THEN the final Onyx state should be: + { + test_1: { + existingData: 'test' + ID: 123, + value: 'one', + }, + test_2: { + existingData: 'test' + ID: 234, + value: 'two', + }, + test_3: { + ID: 345, + value: 'three', + }, + } + */ + + expect(mockCallback.mock.calls[2][0]).toEqual({ID: 123, value: 'one', existingData: 'test'}); + expect(mockCallback.mock.calls[2][1]).toEqual('test_1'); + + expect(mockCallback.mock.calls[3][0]).toEqual({ID: 234, value: 'two', existingData: 'test'}); + expect(mockCallback.mock.calls[3][1]).toEqual('test_2'); + + expect(mockCallback.mock.calls[4][0]).toEqual({ID: 345, value: 'three'}); + expect(mockCallback.mock.calls[4][1]).toEqual('test_3'); + }); + }); + it('should throw an error when the data object is incorrect in Onyx.update', () => { // GIVEN the invalid data object with onyxMethod='multiSet' const data = [ From 4241687b7258c82ba7ed4f61349ea043fee98d3a Mon Sep 17 00:00:00 2001 From: Jules Rosser Date: Mon, 4 Jul 2022 21:25:51 +0100 Subject: [PATCH 7/7] add missing space --- tests/unit/onyxTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/onyxTest.js b/tests/unit/onyxTest.js index b59bb4de..48772a81 100644 --- a/tests/unit/onyxTest.js +++ b/tests/unit/onyxTest.js @@ -369,7 +369,7 @@ describe('Onyx', () => { return waitForPromisesToResolve() .then(() => { - // GIVEN the initial Onyx state: {test_1: {existingData: 'test',},test_2: {existingData: 'test',}} + // GIVEN the initial Onyx state: {test_1: {existingData: 'test',}, test_2: {existingData: 'test',}} Onyx.multiSet({ test_1: { existingData: 'test',