From c5414aadd122a69bfe1441a16de33c944327deda Mon Sep 17 00:00:00 2001 From: Dick Choi Date: Fri, 26 Aug 2016 10:26:22 +0900 Subject: [PATCH] extract renameStorage, removeStorage methods and tests for each of them --- browser/main/lib/dataApi/init.js | 9 +++++ browser/main/lib/dataApi/removeStorage.js | 28 ++++++++++++++ browser/main/lib/dataApi/renameStorage.js | 33 ++++++++++++++++ .../modals/PreferencesModal/StoragesTab.js | 1 - tests/dataApi/removeStorage.js | 36 ++++++++++++++++++ tests/dataApi/renameStorage.js | 38 +++++++++++++++++++ 6 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 browser/main/lib/dataApi/removeStorage.js create mode 100644 browser/main/lib/dataApi/renameStorage.js create mode 100644 tests/dataApi/removeStorage.js create mode 100644 tests/dataApi/renameStorage.js diff --git a/browser/main/lib/dataApi/init.js b/browser/main/lib/dataApi/init.js index 316ea56d..c30b4a98 100644 --- a/browser/main/lib/dataApi/init.js +++ b/browser/main/lib/dataApi/init.js @@ -3,6 +3,15 @@ const _ = require('lodash') const sander = require('sander') const path = require('path') +/** + * @return {Object} all storages and notes + * ``` + * { + * storages: [...], + * notes: [...] + * } + * ``` + */ function init () { let fetchStorages = function () { let rawStorages diff --git a/browser/main/lib/dataApi/removeStorage.js b/browser/main/lib/dataApi/removeStorage.js new file mode 100644 index 00000000..3ada7227 --- /dev/null +++ b/browser/main/lib/dataApi/removeStorage.js @@ -0,0 +1,28 @@ +const _ = require('lodash') + +/** + * @param {String} key + * @return {key} + */ +function removeStorage (key) { + let rawStorages + + try { + rawStorages = JSON.parse(localStorage.getItem('storages')) + if (!_.isArray(rawStorages)) throw new Error('invalid storages') + } catch (e) { + console.warn(e) + rawStorages = [] + } + + rawStorages = rawStorages + .filter(function excludeTargetStorage (rawStorage) { + return rawStorage.key !== key + }) + + localStorage.setItem('storages', JSON.stringify(rawStorages)) + + return Promise.resolve(key) +} + +module.exports = removeStorage diff --git a/browser/main/lib/dataApi/renameStorage.js b/browser/main/lib/dataApi/renameStorage.js new file mode 100644 index 00000000..fde14ac6 --- /dev/null +++ b/browser/main/lib/dataApi/renameStorage.js @@ -0,0 +1,33 @@ +const _ = require('lodash') + +/** + * @param {String} key + * @param {String} name + * @return {Object} Storage meta data + */ +function renameStorage (key, name) { + if (!_.isString(name)) return Promise.reject(new Error('Name must be a string.')) + + let rawStorages + try { + rawStorages = JSON.parse(localStorage.getItem('storages')) + if (!_.isArray(rawStorages)) throw new Error('invalid storages') + } catch (e) { + console.warn(e) + rawStorages = [] + } + + let targetStorage + for (let i = 0; i < rawStorages.length; i++) { + if (rawStorages[i].key === key) { + rawStorages[i].name = name + targetStorage = rawStorages[i] + } + } + + localStorage.setItem('storages', JSON.stringify(rawStorages)) + + return Promise.resolve(targetStorage) +} + +module.exports = renameStorage diff --git a/browser/main/modals/PreferencesModal/StoragesTab.js b/browser/main/modals/PreferencesModal/StoragesTab.js index ead759ba..1f45c476 100644 --- a/browser/main/modals/PreferencesModal/StoragesTab.js +++ b/browser/main/modals/PreferencesModal/StoragesTab.js @@ -58,7 +58,6 @@ class StoragesTab extends React.Component { return }) diff --git a/tests/dataApi/removeStorage.js b/tests/dataApi/removeStorage.js new file mode 100644 index 00000000..09c8473a --- /dev/null +++ b/tests/dataApi/removeStorage.js @@ -0,0 +1,36 @@ +const test = require('ava') +const removeStorage = require('browser/main/lib/dataApi/removeStorage') + +global.document = require('jsdom').jsdom('') +global.window = document.defaultView +global.navigator = window.navigator + +const Storage = require('dom-storage') +const localStorage = window.localStorage = global.localStorage = new Storage(null, { strict: true }) +const path = require('path') +const crypto = require('crypto') + +test('Remove a storage', (t) => { + const dummyStoragePath = path.join(__dirname, '..', 'dummy/dummyStorage') + const dummyStorageKey = crypto.randomBytes(6).toString('hex') + const dummyRawStorage = { + name: 'test1', + key: dummyStorageKey, + path: dummyStoragePath + } + + return Promise.resolve() + .then(function before () { + localStorage.setItem('storages', JSON.stringify([dummyRawStorage])) + }) + .then(function test () { + return removeStorage(dummyStorageKey) + }) + .then(function assert (data) { + t.is(JSON.parse(localStorage.getItem('storages')).length, 0) + }) +}) + +test.after(function after () { + localStorage.clear() +}) diff --git a/tests/dataApi/renameStorage.js b/tests/dataApi/renameStorage.js new file mode 100644 index 00000000..d54f767c --- /dev/null +++ b/tests/dataApi/renameStorage.js @@ -0,0 +1,38 @@ +const test = require('ava') +const renameStorage = require('browser/main/lib/dataApi/renameStorage') + +global.document = require('jsdom').jsdom('') +global.window = document.defaultView +global.navigator = window.navigator + +const Storage = require('dom-storage') +const localStorage = window.localStorage = global.localStorage = new Storage(null, { strict: true }) +const path = require('path') +const crypto = require('crypto') +const _ = require('lodash') + +test('Rename a storage', (t) => { + const dummyStoragePath = path.join(__dirname, '..', 'dummy/dummyStorage') + const dummyStorageKey = crypto.randomBytes(6).toString('hex') + const dummyRawStorage = { + name: 'test1', + key: dummyStorageKey, + path: dummyStoragePath + } + + return Promise.resolve() + .then(function before () { + localStorage.setItem('storages', JSON.stringify([dummyRawStorage])) + }) + .then(function test () { + return renameStorage(dummyStorageKey, 'test2') + }) + .then(function assert (data) { + let rawStorages = JSON.parse(localStorage.getItem('storages')) + t.true(_.find(rawStorages, {key: dummyStorageKey}).name === 'test2') + }) +}) + +test.after(function after () { + localStorage.clear() +})