diff --git a/Gruntfile.js b/Gruntfile.js index b821fdd..af1aee3 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -10,35 +10,42 @@ module.exports = function(grunt) { grunt.initConfig({ karma: { options: { - autowatch: false, + autowatch: true, browsers: [ 'PhantomJS' ], configFile: 'test/karma.conf.js', - reporters: [ 'dots' ], - singleRun: true + reporters: ['dots'], + singleRun: false }, unit: {} }, jshint: { grunt: { - src: [ 'Gruntfile.js' ], + src: ['Gruntfile.js'], options: { node: true } }, dev: { - src: [ 'angular-local-storage.js' ], + src: ['angular-local-storage.js'], options: { jshintrc: '.jshintrc', } }, test: { - src: [ 'test/spec/**/*.js' ], + src: ['test/spec/**/*.js'], options: { jshintrc: 'test/.jshintrc', } } + }, + uglify: { + dist: { + files: { + 'angular-local-storage.min.js': 'angular-local-storage.js' + } + } } }); @@ -50,4 +57,8 @@ module.exports = function(grunt) { 'jshint', 'test' ]); + + grunt.registerTask('dist', [ + 'uglify' + ]); }; diff --git a/angular-local-storage.js b/angular-local-storage.js index 9ad211e..abbfbd8 100644 --- a/angular-local-storage.js +++ b/angular-local-storage.js @@ -1,277 +1,313 @@ (function() { /* Start angularLocalStorage */ - +'use strict'; var angularLocalStorage = angular.module('LocalStorageModule', []); -// You should set a prefix to avoid overwriting any local storage variables from the rest of your app -// e.g. angularLocalStorage.constant('prefix', 'youAppName'); -angularLocalStorage.value('prefix', 'ls'); -// Cookie options (usually in case of fallback) -// expiry = Number of days before cookies expire // 0 = Does not expire -// path = The web path the cookie represents -angularLocalStorage.constant('cookie', { expiry:30, path: '/'}); -angularLocalStorage.constant('notify', { setItem: true, removeItem: false} ); - -angularLocalStorage.service('localStorageService', [ - '$rootScope', - 'prefix', - 'cookie', - 'notify', - function($rootScope, prefix, cookie, notify) { - - // If there is a prefix set in the config lets use that with an appended period for readability - //var prefix = angularLocalStorage.constant; - if (prefix.substr(-1)!=='.') { - prefix = !!prefix ? prefix + '.' : ''; - } - - // Checks the browser to see if local storage is supported - var browserSupportsLocalStorage = function () { - try { - return ('localStorage' in window && window['localStorage'] !== null); - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); - return false; - } +angularLocalStorage.provider('localStorageService', function(){ + // You should set a prefix to avoid overwriting any local storage variables from the rest of your app + // e.g. angularLocalStorage.constant('prefix', 'youAppName'); + this.prefix = 'ls'; + // Cookie options (usually in case of fallback) + // expiry = Number of days before cookies expire // 0 = Does not expire + // path = The web path the cookie represents + this.cookie = { + expiry: 30, + path: '/' + }; + this.notify = { + setItem: true, + removeItem: false + }; + this.setPrefix = function(prefix){ + this.prefix = prefix; + }; + this.setStorageCookie = function(exp, path){ + this.cookie = { + expiry: exp, + path: path + }; + }; + this.setNotify = function(itemSet, itemRemove){ + this.notify = { + setItem: itemSet, + removeItem: itemRemove + }; }; - // Directly adds a value to local storage - // If local storage is not available in the browser use cookies - // Example use: localStorageService.add('library','angular'); - var addToLocalStorage = function (key, value) { + this.$get = ['$rootScope', function($rootScope){ - // If this browser does not support local storage use cookies - if (!browserSupportsLocalStorage()) { - $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED'); - if (notify.setItem) { - $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: 'cookie'}); - } - return addToCookies(key, value); + var prefix = this.prefix; + // If there is a prefix set in the config lets use that with an appended period for readability + if (prefix.substr(-1) !== '.') { + prefix = !!prefix ? prefix + '.' : ''; } - // Let's convert undefined values to null to get the value consistent - if (typeof value == "undefined") { - value = null; - } + // Checks the browser to see if local storage is supported + var browserSupportsLocalStorage = function () { + try { + var supported = ('localStorage' in window && window['localStorage'] !== null); + + // When Safari (OS X or iOS) is in private browsing mode, it appears as though localStorage + // is available, but trying to call .setItem throws an exception. + // + // "QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage + // that exceeded the quota." + var key = prefix + '__' + Math.round(Math.random() * 1e7); + if (supported) { + localStorage.setItem(key, ''); + localStorage.removeItem(key); + } - try { - if (angular.isObject(value) || angular.isArray(value)) { - value = angular.toJson(value); + return true; + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error', e.message); + return false; } - localStorage.setItem(prefix+key, value); - if (notify.setItem) { - $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: 'localStorage'}); + }; + + // Directly adds a value to local storage + // If local storage is not available in the browser use cookies + // Example use: localStorageService.add('library','angular'); + var addToLocalStorage = function (key, value) { + + // If this browser does not support local storage use cookies + if (!browserSupportsLocalStorage()) { + $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED'); + if (notify.setItem) { + $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: 'cookie'}); + } + return addToCookies(key, value); } - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); - return addToCookies(key, value); - } - return true; - }; - // Directly get a value from local storage - // Example use: localStorageService.get('library'); // returns 'angular' - var getFromLocalStorage = function (key) { - if (!browserSupportsLocalStorage()) { - $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED'); - return getFromCookies(key); - } + // Let's convert undefined values to null to get the value consistent + if (typeof value === "undefined") { + value = null; + } - var item = localStorage.getItem(prefix+key); - // angular.toJson will convert null to 'null', so a proper conversion is needed - // FIXME not a perfect solution, since a valid 'null' string can't be stored - if (!item || item === 'null') return null; + try { + if (angular.isObject(value) || angular.isArray(value)) { + value = angular.toJson(value); + } + localStorage.setItem(prefix + key, value); + if (notify.setItem) { + $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: 'localStorage'}); + } + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error', e.message); + return addToCookies(key, value); + } + return true; + }; - if (item.charAt(0) === "{" || item.charAt(0) === "[") { - return angular.fromJson(item); - } - return item; - }; + // Directly get a value from local storage + // Example use: localStorageService.get('library'); // returns 'angular' + var getFromLocalStorage = function (key) { - // Remove an item from local storage - // Example use: localStorageService.remove('library'); // removes the key/value pair of library='angular' - var removeFromLocalStorage = function (key) { - if (!browserSupportsLocalStorage()) { - $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED'); - if (notify.removeItem) { - $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {key: key, storageType: 'cookie'}); + if (!browserSupportsLocalStorage()) { + $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED'); + return getFromCookies(key); } - return removeFromCookies(key); - } - try { - localStorage.removeItem(prefix+key); - if (notify.removeItem) { - $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {key: key, storageType: 'localStorage'}); + var item = localStorage.getItem(prefix + key); + // angular.toJson will convert null to 'null', so a proper conversion is needed + // FIXME not a perfect solution, since a valid 'null' string can't be stored + if (!item || item === 'null') { + return null; } - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); - return removeFromCookies(key); - } - return true; - }; - // Return array of keys for local storage - // Example use: var keys = localStorageService.keys() - var getKeysForLocalStorage = function () { + if (item.charAt(0) === "{" || item.charAt(0) === "[") { + return angular.fromJson(item); + } - if (!browserSupportsLocalStorage()) { - $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED'); - return false; - } + return item; + }; - var prefixLength = prefix.length; - var keys = []; - for (var key in localStorage) { - // Only return keys that are for this app - if (key.substr(0,prefixLength) === prefix) { - try { - keys.push(key.substr(prefixLength)); - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.Description); - return []; + // Remove an item from local storage + // Example use: localStorageService.remove('library'); // removes the key/value pair of library='angular' + var removeFromLocalStorage = function (key) { + if (!browserSupportsLocalStorage()) { + $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED'); + if (notify.removeItem) { + $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {key: key, storageType: 'cookie'}); } + return removeFromCookies(key); } - } - return keys; - }; - // Remove all data for this app from local storage - // Also takes a regular expression string and removes the matching keys-value pairs - // Example use: localStorageService.clearAll(); - // Should be used mostly for development purposes - var clearAllFromLocalStorage = function (regular_expression) { - - var regular_expression = regular_expression || ""; - //accounting for the '.' in the prefix when creating a regex - var temp_prefix = prefix.slice(0, -1) + "\."; - //regex to test the local storage keys against - var testregex = RegExp(temp_prefix + regular_expression); - - if (!browserSupportsLocalStorage()) { - $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED'); - return clearAllFromCookies(); - } - - var prefixLength = prefix.length; - - for (var key in localStorage) { - // Only remove items that are for this app and match the regular expression - if (testregex.test(key)) { - try { - removeFromLocalStorage(key.substr(prefixLength)); - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); - return clearAllFromCookies(); + try { + localStorage.removeItem(prefix+key); + if (notify.removeItem) { + $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {key: key, storageType: 'localStorage'}); } + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error', e.message); + return removeFromCookies(key); } - } - return true; - }; + return true; + }; - // Checks the browser to see if cookies are supported - var browserSupportsCookies = function() { - try { - return navigator.cookieEnabled || - ("cookie" in document && (document.cookie.length > 0 || - (document.cookie = "test").indexOf.call(document.cookie, "test") > -1)); - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); - return false; - } - }; + // Return array of keys for local storage + // Example use: var keys = localStorageService.keys() + var getKeysForLocalStorage = function () { - // Directly adds a value to cookies - // Typically used as a fallback is local storage is not available in the browser - // Example use: localStorageService.cookie.add('library','angular'); - var addToCookies = function (key, value) { - - if (typeof value == "undefined") { - return false; - } + if (!browserSupportsLocalStorage()) { + $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED'); + return false; + } - if (!browserSupportsCookies()) { - $rootScope.$broadcast('LocalStorageModule.notification.error','COOKIES_NOT_SUPPORTED'); - return false; - } + var prefixLength = prefix.length; + var keys = []; + for (var key in localStorage) { + // Only return keys that are for this app + if (key.substr(0,prefixLength) === prefix) { + try { + keys.push(key.substr(prefixLength)); + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error', e.Description); + return []; + } + } + } + return keys; + }; + + // Remove all data for this app from local storage + // Also optionally takes a regular expression string and removes the matching key-value pairs + // Example use: localStorageService.clearAll(); + // Should be used mostly for development purposes + var clearAllFromLocalStorage = function (regularExpression) { + + var regularExpression = regularExpression || ""; + //accounting for the '.' in the prefix when creating a regex + var tempPrefix = prefix.slice(0, -1) + "\."; + var testRegex = RegExp(tempPrefix + regularExpression); + + if (!browserSupportsLocalStorage()) { + $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED'); + return clearAllFromCookies(); + } - try { - var expiry = '', expiryDate = new Date(); - if (value === null) { - // Mark that the cookie has expired one day ago - expiryDate.setTime(expiryDate.getTime() + (-1 * 24*60*60*1000)); - expiry = "; expires="+expiryDate.toGMTString(); - - value = ''; - } else if (cookie.expiry !== 0) { - expiryDate.setTime(expiryDate.getTime() + (cookie.expiry*24*60*60*1000)); - expiry = "; expires="+expiryDate.toGMTString(); + var prefixLength = prefix.length; + + for (var key in localStorage) { + // Only remove items that are for this app and match the regular expression + if (testRegex.test(key)) { + try { + removeFromLocalStorage(key.substr(prefixLength)); + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); + return clearAllFromCookies(); + } + } } - if (!!key) { - document.cookie = prefix + key + "=" + encodeURIComponent(value) + expiry + "; path="+cookie.path; + return true; + }; + + // Checks the browser to see if cookies are supported + var browserSupportsCookies = function() { + try { + return navigator.cookieEnabled || + ("cookie" in document && (document.cookie.length > 0 || + (document.cookie = "test").indexOf.call(document.cookie, "test") > -1)); + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error', e.message); + return false; } - } catch (e) { - $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); - return false; - } - return true; - }; + }; - // Directly get a value from a cookie - // Example use: localStorageService.cookie.get('library'); // returns 'angular' - var getFromCookies = function (key) { - if (!browserSupportsCookies()) { - $rootScope.$broadcast('LocalStorageModule.notification.error','COOKIES_NOT_SUPPORTED'); - return false; - } + // Directly adds a value to cookies + // Typically used as a fallback is local storage is not available in the browser + // Example use: localStorageService.cookie.add('library','angular'); + var addToCookies = function (key, value) { - var cookies = document.cookie.split(';'); - for(var i=0;i < cookies.length;i++) { - var thisCookie = cookies[i]; - while (thisCookie.charAt(0)==' ') { - thisCookie = thisCookie.substring(1,thisCookie.length); - } - if (thisCookie.indexOf(prefix+key+'=') === 0) { - return decodeURIComponent(thisCookie.substring(prefix.length+key.length+1,thisCookie.length)); + if (typeof value === "undefined") { + return false; } - } - return null; - }; - var removeFromCookies = function (key) { - addToCookies(key,null); - }; + if (!browserSupportsCookies()) { + $rootScope.$broadcast('LocalStorageModule.notification.error', 'COOKIES_NOT_SUPPORTED'); + return false; + } - var clearAllFromCookies = function () { - var thisCookie = null, thisKey = null; - var prefixLength = prefix.length; - var cookies = document.cookie.split(';'); - for(var i=0;i < cookies.length;i++) { - thisCookie = cookies[i]; - while (thisCookie.charAt(0)==' ') { - thisCookie = thisCookie.substring(1,thisCookie.length); + try { + var expiry = '', + expiryDate = new Date(); + + if (value === null) { + // Mark that the cookie has expired one day ago + expiryDate.setTime(expiryDate.getTime() + (-1 * 24 * 60 * 60 * 1000)); + expiry = "; expires=" + expiryDate.toGMTString(); + value = ''; + } else if (cookie.expiry !== 0) { + expiryDate.setTime(expiryDate.getTime() + (cookie.expiry * 24 * 60 * 60 * 1000)); + expiry = "; expires=" + expiryDate.toGMTString(); + } + if (!!key) { + document.cookie = prefix + key + "=" + encodeURIComponent(value) + expiry + "; path="+cookie.path; + } + } catch (e) { + $rootScope.$broadcast('LocalStorageModule.notification.error',e.message); + return false; + } + return true; + }; + + // Directly get a value from a cookie + // Example use: localStorageService.cookie.get('library'); // returns 'angular' + var getFromCookies = function (key) { + if (!browserSupportsCookies()) { + $rootScope.$broadcast('LocalStorageModule.notification.error', 'COOKIES_NOT_SUPPORTED'); + return false; } - key = thisCookie.substring(prefixLength,thisCookie.indexOf('=')); - removeFromCookies(key); - } - }; - return { - isSupported: browserSupportsLocalStorage, - set: addToLocalStorage, - add: addToLocalStorage, //DEPRECATED - get: getFromLocalStorage, - keys: getKeysForLocalStorage, - remove: removeFromLocalStorage, - clearAll: clearAllFromLocalStorage, - cookie: { - set: addToCookies, - add: addToCookies, //DEPRECATED - get: getFromCookies, - remove: removeFromCookies, - clearAll: clearAllFromCookies - } - }; + var cookies = document.cookie.split(';'); + for(var i=0;i < cookies.length;i++) { + var thisCookie = cookies[i]; + while (thisCookie.charAt(0)===' ') { + thisCookie = thisCookie.substring(1,thisCookie.length); + } + if (thisCookie.indexOf(prefix + key + '=') === 0) { + return decodeURIComponent(thisCookie.substring(prefix.length + key.length + 1, thisCookie.length)); + } + } + return null; + }; + + var removeFromCookies = function (key) { + addToCookies(key,null); + }; + + var clearAllFromCookies = function () { + var thisCookie = null, thisKey = null; + var prefixLength = prefix.length; + var cookies = document.cookie.split(';'); + for(var i = 0; i < cookies.length; i++) { + thisCookie = cookies[i]; + + while (thisCookie.charAt(0) === ' ') { + thisCookie = thisCookie.substring(1, thisCookie.length); + } -}]); + key = thisCookie.substring(prefixLength, thisCookie.indexOf('=')); + removeFromCookies(key); + } + }; + + return { + isSupported: browserSupportsLocalStorage, + set: addToLocalStorage, + add: addToLocalStorage, //DEPRECATED + get: getFromLocalStorage, + keys: getKeysForLocalStorage, + remove: removeFromLocalStorage, + clearAll: clearAllFromLocalStorage, + cookie: { + set: addToCookies, + add: addToCookies, //DEPRECATED + get: getFromCookies, + remove: removeFromCookies, + clearAll: clearAllFromCookies + } + }; + }] +}); }).call(this); diff --git a/angular-local-storage.min.js b/angular-local-storage.min.js new file mode 100644 index 0000000..d1ec506 --- /dev/null +++ b/angular-local-storage.min.js @@ -0,0 +1 @@ +(function(){"use strict";var a=angular.module("LocalStorageModule",[]);a.provider("localStorageService",function(){this.prefix="ls",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){this.prefix=a},this.setStorageCookie=function(a,b){this.cookie={expiry:a,path:b}},this.setNotify=function(a,b){this.notify={setItem:a,removeItem:b}},this.$get=["$rootScope",function(a){var b=this.prefix;"."!==b.substr(-1)&&(b=b?b+".":"");var c=function(){try{var c="localStorage"in window&&null!==window.localStorage,d=b+"__"+Math.round(1e7*Math.random());return c&&(localStorage.setItem(d,""),localStorage.removeItem(d)),!0}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.message),!1}},d=function(d,e){if(!c())return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),notify.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:d,newvalue:e,storageType:"cookie"}),j(d,e);"undefined"==typeof e&&(e=null);try{(angular.isObject(e)||angular.isArray(e))&&(e=angular.toJson(e)),localStorage.setItem(b+d,e),notify.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:d,newvalue:e,storageType:"localStorage"})}catch(f){return a.$broadcast("LocalStorageModule.notification.error",f.message),j(d,e)}return!0},e=function(d){if(!c())return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),k(d);var e=localStorage.getItem(b+d);return e&&"null"!==e?"{"===e.charAt(0)||"["===e.charAt(0)?angular.fromJson(e):e:null},f=function(d){if(!c())return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),notify.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:d,storageType:"cookie"}),l(d);try{localStorage.removeItem(b+d),notify.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:d,storageType:"localStorage"})}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.message),l(d)}return!0},g=function(){if(!c())return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),!1;var d=b.length,e=[];for(var f in localStorage)if(f.substr(0,d)===b)try{e.push(f.substr(d))}catch(g){return a.$broadcast("LocalStorageModule.notification.error",g.Description),[]}return e},h=function(d){var d=d||"",e=b.slice(0,-1)+".",g=RegExp(e+d);if(!c())return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),m();var h=b.length;for(var i in localStorage)if(g.test(i))try{f(i.substr(h))}catch(j){return a.$broadcast("LocalStorageModule.notification.error",j.message),m()}return!0},i=function(){try{return navigator.cookieEnabled||"cookie"in document&&(document.cookie.length>0||(document.cookie="test").indexOf.call(document.cookie,"test")>-1)}catch(b){return a.$broadcast("LocalStorageModule.notification.error",b.message),!1}},j=function(c,d){if("undefined"==typeof d)return!1;if(!i())return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var e="",f=new Date;null===d?(f.setTime(f.getTime()+-864e5),e="; expires="+f.toGMTString(),d=""):0!==cookie.expiry&&(f.setTime(f.getTime()+24*cookie.expiry*60*60*1e3),e="; expires="+f.toGMTString()),c&&(document.cookie=b+c+"="+encodeURIComponent(d)+e+"; path="+cookie.path)}catch(g){return a.$broadcast("LocalStorageModule.notification.error",g.message),!1}return!0},k=function(c){if(!i())return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var d=document.cookie.split(";"),e=0;e" @@ -21,6 +21,6 @@ ], "devDependencies": { "angularjs": "*", - "angular-mocks": "~1.0.8" + "angular-mocks": "~1.2.1" } } diff --git a/package.json b/package.json index e065a85..058aed5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-local-storage", - "version": "0.0.1", + "version": "0.0.2", "description": "An Angular module that gives you access to the browsers local storage", "main": "angular-local-storage.js", "scripts": { @@ -27,7 +27,8 @@ "devDependencies": { "time-grunt": "~0.1.1", "load-grunt-tasks": "~0.1.0", - "grunt-karma": "~0.6.2", - "grunt-contrib-jshint": "~0.6.4" + "grunt-contrib-jshint": "~0.6.4", + "grunt": "~0.4.2", + "grunt-contrib-uglify": "~0.2.7" } } diff --git a/test/spec/test.js b/test/spec/test.js index 08cefc6..2a3af0a 100644 --- a/test/spec/test.js +++ b/test/spec/test.js @@ -1,12 +1,55 @@ -describe('Module: LocalStorageModule', function() { - 'use strict'; +describe('Tests functionality of the localStorage module', function(){ + beforeEach(module('LocalStorageModule', function(localStorageServiceProvider){ + p = localStorageServiceProvider; + })); + var ls, store = []; + beforeEach(inject(function(_localStorageService_){ + ls = _localStorageService_; + spyOn(ls, 'get').andCallFake(function(key){ + if(store[key].charAt(0) === "{" || store[key].charAt(0) === "["){ + return angular.fromJson(store[key]); + }else{ + return store[key]; + } + }); - // Load the Angular module - beforeEach(module('LocalStorageModule')); + spyOn(ls, 'set').andCallFake(function(key, val){ + if(angular.isObject(val) || angular.isArray(val)){ + val = angular.toJson(val); + } + if(angular.isNumber(val)){ + val = val.toString(); + } + return store[key] = val; + }); - describe('constants', function() { - it('reads the constants', function() { - expect(true).toBe(true); + spyOn(ls, 'clearAll').andCallFake(function(){ + store = {}; + return store; + }); + })); + + it("Should add a value to my local storage", function(){ + var n = 234; + ls.set('test', n); + //Since localStorage makes the value a string, we look for the '234' and not 234 + expect(ls.get('test')).toBe('234'); + + var obj = { key: 'val' }; + ls.set('object', obj); + var res = ls.get('object'); + expect(res.key).toBe('val'); + + }); + + it('Should allow me to set a prefix', function(){ + p.setPrefix("myPref"); + expect(p.prefix).toBe("myPref"); + }); + + it('Should allow me to set the cookie values', function(){ + p.setStorageCookie(60, '/path'); + expect(p.cookie.expiry).toBe(60); + expect(p.cookie.path).toBe('/path'); }); - }); -}); +}); \ No newline at end of file