Skip to content

Commit 5405703

Browse files
authored
LDS: Improve Error Handling (#803)
* LDS: Improve Error Handling Fixes: #773 Should we log key, values? Console.log vs warn vs error? * test fix * test debug * test mock localstorage * final test before I give up * remove mock * cleanup
1 parent 1fe021b commit 5405703

File tree

3 files changed

+28
-57
lines changed

3 files changed

+28
-57
lines changed

src/LocalDatastoreController.browser.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ const LocalDatastoreController = {
4242
const key = localStorage.key(i);
4343
if (isLocalDatastoreKey(key)) {
4444
const value = localStorage.getItem(key);
45-
LDS[key] = JSON.parse(value);
45+
try {
46+
LDS[key] = JSON.parse(value);
47+
} catch (error) {
48+
console.error('Error getAllContents: ', error);
49+
}
4650
}
4751
}
4852
return LDS;

src/__tests__/LocalDatastore-test.js

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* LICENSE file in the root directory of this source tree. An additional grant
77
* of patent rights can be found in the PATENTS file in the same directory.
88
*/
9+
/* global window */
910

1011
jest.autoMockOff();
1112
jest.unmock('../LocalDatastoreUtils');
@@ -103,10 +104,6 @@ const RNDatastoreController = require('../LocalDatastoreController.react-native'
103104
const BrowserDatastoreController = require('../LocalDatastoreController.browser');
104105
const DefaultDatastoreController = require('../LocalDatastoreController.default');
105106

106-
const mockLocalStorage = require('./test_helpers/mockLocalStorage');
107-
108-
global.localStorage = mockLocalStorage;
109-
110107
const item1 = new ParseObject('Item');
111108
const item2 = new ParseObject('Item');
112109
const item3 = new ParseObject('Item');
@@ -657,7 +654,6 @@ describe('LocalDatastore', () => {
657654
user._localId = null;
658655

659656
const USER_KEY = LocalDatastore.getKeyForObject(user);
660-
console.log(USER_KEY);
661657
const LDS = {
662658
[USER_KEY]: [user._toFullJSON()],
663659
[`${PIN_PREFIX}_testPinName`]: [USER_KEY],
@@ -872,20 +868,30 @@ describe('LocalDatastore (BrowserDatastoreController)', () => {
872868
expect(await LocalDatastore._getRawStorage()).toEqual({});
873869
});
874870

871+
it('can handle getAllContent error', async () => {
872+
await LocalDatastore.pinWithName('_default', [{ value: 'WILL_BE_MOCKED' }]);
873+
const windowSpy = jest.spyOn(Object.getPrototypeOf(window.localStorage), 'getItem')
874+
.mockImplementationOnce(() => {
875+
return '[1, ]';
876+
});
877+
const spy = jest.spyOn(console, 'error').mockImplementationOnce(() => {});
878+
const LDS = await LocalDatastore._getAllContents();
879+
expect(LDS).toEqual({});
880+
expect(spy).toHaveBeenCalled();
881+
spy.mockRestore();
882+
windowSpy.mockRestore();
883+
});
884+
875885
it('can handle store error', async () => {
876-
const mockStorageError = {
877-
setItem() {
886+
const windowSpy = jest.spyOn(Object.getPrototypeOf(window.localStorage), 'setItem')
887+
.mockImplementationOnce(() => {
878888
throw new Error('error thrown');
879-
},
880-
};
881-
Object.defineProperty(window, 'localStorage', { // eslint-disable-line
882-
value: mockStorageError
883-
});
884-
try {
885-
await LocalDatastore.pinWithName('myKey', [{ name: 'test' }]);
886-
} catch (e) {
887-
expect(e.message).toBe('error thrown');
888-
}
889+
});
890+
const consoleSpy = jest.spyOn(console, 'log').mockImplementationOnce(() => {});
891+
await LocalDatastore.pinWithName('myKey', [{ name: 'test' }]);
892+
expect(consoleSpy).toHaveBeenCalled();
893+
consoleSpy.mockRestore();
894+
windowSpy.mockRestore();
889895
});
890896
});
891897

src/__tests__/test_helpers/mockLocalStorage.js

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)