diff --git a/platform/persistence/local/src/LocalStoragePersistenceProvider.js b/platform/persistence/local/src/LocalStoragePersistenceProvider.js index 972b35eb6c..0f87b46a45 100644 --- a/platform/persistence/local/src/LocalStoragePersistenceProvider.js +++ b/platform/persistence/local/src/LocalStoragePersistenceProvider.js @@ -20,7 +20,7 @@ * at runtime from the About dialog for additional information. *****************************************************************************/ -/*global define,localStorage*/ +/*global define,window*/ define( [], @@ -42,6 +42,7 @@ define( this.$q = $q; this.space = space; this.spaces = space ? [space] : []; + this.localStorage = window.localStorage; } /** @@ -49,7 +50,7 @@ define( * @private */ LocalStoragePersistenceProvider.prototype.setValue = function (key, value) { - localStorage[key] = JSON.stringify(value); + this.localStorage[key] = JSON.stringify(value); }; /** @@ -57,7 +58,8 @@ define( * @private */ LocalStoragePersistenceProvider.prototype.getValue = function (key) { - return localStorage[key] ? JSON.parse(localStorage[key]) : {}; + return this.localStorage[key] ? + JSON.parse(this.localStorage[key]) : {}; }; LocalStoragePersistenceProvider.prototype.listSpaces = function () { diff --git a/platform/persistence/local/test/LocalStoragePersistenceProviderSpec.js b/platform/persistence/local/test/LocalStoragePersistenceProviderSpec.js new file mode 100644 index 0000000000..5d42117164 --- /dev/null +++ b/platform/persistence/local/test/LocalStoragePersistenceProviderSpec.js @@ -0,0 +1,120 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise,describe,it,expect,beforeEach,afterEach,waitsFor,jasmine*/ + + +define( + ["../src/LocalStoragePersistenceProvider"], + function (LocalStoragePersistenceProvider) { + "use strict"; + + describe("The local storage persistence provider", function () { + var mockQ, + testSpace = "testSpace", + mockCallback, + testLocalStorage, + provider; + + function mockPromise(value) { + return (value || {}).then ? value : { + then: function (callback) { + return mockPromise(callback(value)); + } + }; + } + + beforeEach(function () { + testLocalStorage = {}; + + mockQ = jasmine.createSpyObj("$q", ["when", "reject"]); + mockCallback = jasmine.createSpy('callback'); + + mockQ.when.andCallFake(mockPromise); + + provider = new LocalStoragePersistenceProvider( + mockQ, + testSpace, + testLocalStorage + ); + + // White-boxy: Can't effectively mock window.localStorage, + // so override the provider's local reference to it. + provider.localStorage = testLocalStorage; + }); + + it("reports available spaces", function () { + provider.listSpaces().then(mockCallback); + expect(mockCallback).toHaveBeenCalledWith([testSpace]); + }); + + it("lists all available documents", function () { + provider.listObjects(testSpace).then(mockCallback); + expect(mockCallback.mostRecentCall.args[0]).toEqual([]); + provider.createObject(testSpace, 'abc', { a: 42 }); + provider.listObjects(testSpace).then(mockCallback); + expect(mockCallback.mostRecentCall.args[0]).toEqual(['abc']); + }); + + it("allows object creation", function () { + var model = { someKey: "some value" }; + provider.createObject(testSpace, "abc", model) + .then(mockCallback); + expect(JSON.parse(testLocalStorage[testSpace]).abc) + .toEqual(model); + expect(mockCallback.mostRecentCall.args[0]).toBeTruthy(); + }); + + it("allows object models to be read back", function () { + var model = { someKey: "some other value" }; + testLocalStorage[testSpace] = JSON.stringify({ abc: model }); + provider.readObject(testSpace, "abc").then(mockCallback); + expect(mockCallback).toHaveBeenCalledWith(model); + }); + + it("allows object update", function () { + var model = { someKey: "some new value" }; + testLocalStorage[testSpace] = JSON.stringify({ + abc: { somethingElse: 42 } + }); + provider.updateObject(testSpace, "abc", model) + .then(mockCallback); + expect(JSON.parse(testLocalStorage[testSpace]).abc) + .toEqual(model); + }); + + it("allows object deletion", function () { + testLocalStorage[testSpace] = JSON.stringify({ + abc: { somethingElse: 42 } + }); + provider.deleteObject(testSpace, "abc").then(mockCallback); + expect(testLocalStorage[testSpace].abc) + .toBeUndefined(); + }); + + it("returns undefined when objects are not found", function () { + provider.readObject("testSpace", "abc").then(mockCallback); + expect(mockCallback).toHaveBeenCalledWith(undefined); + }); + + }); + } +); diff --git a/platform/persistence/local/test/suite.json b/platform/persistence/local/test/suite.json new file mode 100644 index 0000000000..5df8f84695 --- /dev/null +++ b/platform/persistence/local/test/suite.json @@ -0,0 +1,3 @@ +[ + "LocalStoragePersistenceProvider" +]