From 3d433852fd47bc61fc5f789c3160c81095fe3917 Mon Sep 17 00:00:00 2001 From: Alex Kwiatkowski Date: Wed, 1 Aug 2018 13:51:44 -0700 Subject: [PATCH] Add util methods to get/set session storage --- gui/__tests__/utils/sessionStorage.test.js | 21 +++++++++++++++ gui/__tests__/utils/storage.test.js | 30 ++++++++++++++++++++++ gui/src/utils/sessionStorage.js | 5 ++++ gui/src/utils/storage.js | 14 ++++++++++ jest.setup.js | 1 + package.json | 1 + yarn.lock | 13 +++++++++- 7 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 gui/__tests__/utils/sessionStorage.test.js create mode 100644 gui/__tests__/utils/storage.test.js create mode 100644 gui/src/utils/sessionStorage.js create mode 100644 gui/src/utils/storage.js diff --git a/gui/__tests__/utils/sessionStorage.test.js b/gui/__tests__/utils/sessionStorage.test.js new file mode 100644 index 00000000000..80440f6de85 --- /dev/null +++ b/gui/__tests__/utils/sessionStorage.test.js @@ -0,0 +1,21 @@ +import { get, set } from 'utils/sessionStorage' + +describe('utils/sessionStorage', () => { + beforeEach(() => { + global.localStorage.clear() + }) + + describe('get', () => { + it('returns a JS object for JSON stored as "chainlink.session" in localStorage', () => { + global.localStorage.setItem('chainlink.session', '{"foo":"FOO"}') + expect(get()).toEqual({foo: 'FOO'}) + }) + }) + + describe('set', () => { + it('saves the JS object as JSON under the key "chainlink.session" in localStorage', () => { + set({foo: 'FOO'}) + expect(global.localStorage.getItem('chainlink.session')).toEqual('{"foo":"FOO"}') + }) + }) +}) diff --git a/gui/__tests__/utils/storage.test.js b/gui/__tests__/utils/storage.test.js new file mode 100644 index 00000000000..57fd77608e8 --- /dev/null +++ b/gui/__tests__/utils/storage.test.js @@ -0,0 +1,30 @@ +import { get, set } from 'utils/storage' + +describe('utils/storage', () => { + beforeEach(() => { + global.localStorage.clear() + }) + + describe('get', () => { + it('returns a JS object for JSON keyed under "chainlink." in localStorage', () => { + global.localStorage.setItem('chainlink.foo', '{"foo":"FOO"}') + expect(get('foo')).toEqual({foo: 'FOO'}) + }) + + it('returns an empty JS object when not valid JSON', () => { + global.localStorage.setItem('chainlink.foo', '{"foo"}') + expect(get('foo')).toEqual({}) + }) + + it('returns an empty JS object when the key does not exist', () => { + expect(get('foo')).toEqual({}) + }) + }) + + describe('set', () => { + it('saves the JS object as JSON keyed under "chainlink." in localStorage', () => { + set('foo', {foo: 'FOO'}) + expect(global.localStorage.getItem('chainlink.foo')).toEqual('{"foo":"FOO"}') + }) + }) +}) diff --git a/gui/src/utils/sessionStorage.js b/gui/src/utils/sessionStorage.js new file mode 100644 index 00000000000..1bf9c69dc78 --- /dev/null +++ b/gui/src/utils/sessionStorage.js @@ -0,0 +1,5 @@ +import * as storage from 'utils/storage' + +export const get = () => storage.get('session') + +export const set = obj => storage.set('session', obj) diff --git a/gui/src/utils/storage.js b/gui/src/utils/storage.js new file mode 100644 index 00000000000..e8fa8f2acd0 --- /dev/null +++ b/gui/src/utils/storage.js @@ -0,0 +1,14 @@ +export const get = key => { + const localStorageItem = global.localStorage.getItem(`chainlink.${key}`) + let obj = {} + + if (localStorageItem) { + try { return JSON.parse(localStorageItem) } catch (e) {} + } + + return obj +} + +export const set = (key, obj) => { + global.localStorage.setItem(`chainlink.${key}`, JSON.stringify(obj)) +} diff --git a/jest.setup.js b/jest.setup.js index 2bc969104e3..c14bf5cfedc 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,5 +1,6 @@ import { configure } from 'enzyme' import Adapter from 'enzyme-adapter-react-16' +import 'mock-local-storage' configure({ adapter: new Adapter() }) diff --git a/package.json b/package.json index 81510eee115..8c227eccb40 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "jest-environment-enzyme": "^6.0.0", "jest-silent-reporter": "^0.0.4", "json-pretty-html": "^1.1.2", + "mock-local-storage": "^1.0.5", "moment": "^2.20.1", "numeral": "^2.0.6", "query-string": "^6.1.0", diff --git a/yarn.lock b/yarn.lock index af94fa7c684..05e74c7d0f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2811,6 +2811,10 @@ copy-to-clipboard@^3: dependencies: toggle-selection "^1.0.3" +core-js@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-0.8.4.tgz#c22665f1e0d1b9c3c5e1b08dabd1f108695e4fcf" + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -5167,7 +5171,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -global@^4.3.0, global@~4.3.0: +global@^4.3.0, global@^4.3.2, global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" dependencies: @@ -7804,6 +7808,13 @@ mock-fs@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.5.0.tgz#75245b966f7e3defe197b03454af9c5b355594b7" +mock-local-storage@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/mock-local-storage/-/mock-local-storage-1.0.5.tgz#899ff300027cefed47816e6dc539bb059fcce489" + dependencies: + core-js "^0.8.3" + global "^4.3.2" + moment@^2.15.2, moment@^2.20.1: version "2.22.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad"