jest.unmock('../src/app/stores/Persist'); import React from 'react'; import ReactDOM from 'react-dom'; import TU from 'react-testutils-additions'; let origAddEventListener = window.addEventListener; let storageListener; /** * Mock local storage */ class LocalStorage { /** * Sets up storage variable */ constructor() { this.ls = {}; } /** * Retrieves a value from local storage * @param {String} key Storage key * @return {*} Storage value */ getItem(key) { return this.ls[key]; } /** * Writes a value to local storage * @param {String} key Storage key * @param {*} value Storage value */ setItem(key, value) { this.ls[key] = value; } /** * Clears a value from local storage * @param {String} key Storage key */ removeItem(key) { delete this.ls[key]; } /** * Clears local storage */ clear() { this.ls = {}; } } const LOCAL_STORAGE = new LocalStorage(); window.addEventListener = function(eventName, listener) { if(eventName == 'storage') { storageListener = listener; // Keep track of latest storage listener } else { origAddEventListener.apply(arguments); } }; describe('Persist', function() { const Persist = require('../src/app/stores/Persist').Persist; describe('Multi tab/window', function() { it("syncs builds", function() { window.localStorage = localStorage; localStorage.clear(); let p = new Persist(); let newBuilds = { anaconda: { test: '1234' } }; storageListener({ key: 'builds', newValue: JSON.stringify(newBuilds) }); expect(p.getBuild('anaconda', 'test')).toBe('1234'); }); }); describe('General and Settings', function() { it("has defaults", function() { window.localStorage = localStorage; localStorage.clear(); let p = new Persist(); expect(p.getLangCode()).toBe('en'); expect(p.showTooltips()).toBe(true); expect(p.getInsurance()).toBe('standard'); expect(p.getShipDiscount()).toBe(0); expect(p.getModuleDiscount()).toBe(0); expect(p.getSizeRatio()).toBe(1); }); it("loads from localStorage correctly", function() { window.localStorage = LOCAL_STORAGE; let savedData = require('./fixtures/valid-backup'); LOCAL_STORAGE.clear(); LOCAL_STORAGE.setItem('builds', JSON.stringify(savedData.builds)); LOCAL_STORAGE.setItem('NG_TRANSLATE_LANG_KEY', 'de'); LOCAL_STORAGE.setItem('insurance', 'Standard'); LOCAL_STORAGE.setItem('shipDiscount', 0.25); LOCAL_STORAGE.setItem('moduleDiscount', 0.15); let p = new Persist(); expect(p.getInsurance()).toBe('standard'); expect(p.getShipDiscount()).toBe(0.25); expect(p.getModuleDiscount()).toBe(0.15); expect(p.getLangCode()).toEqual('de'); expect(p.getBuilds('anaconda')).toEqual(savedData.builds.anaconda); expect(p.getBuilds('python')).toEqual(savedData.builds.python); expect(p.getBuildsNamesFor('imperial_clipper')).toEqual(['Cargo', 'Current', 'Dream', 'Multi-purpose']); expect(p.getBuild('type_7_transport', 'Cargo')).toEqual('02A5D5A4D3D3D5C--------0505040403480101'); }); it("uses defaults from a corrupted localStorage", function() { window.localStorage = LOCAL_STORAGE; LOCAL_STORAGE.clear(); LOCAL_STORAGE.setItem('builds', 'not valid json'); LOCAL_STORAGE.setItem('comparisons', '1, 3, 4'); LOCAL_STORAGE.setItem('insurance', 'this insurance does not exist'); LOCAL_STORAGE.setItem('shipDiscount', 'this is not a number'); LOCAL_STORAGE.setItem('moduleDiscount', 10); // Way to big let p = new Persist(); expect(p.getLangCode()).toBe('en'); expect(p.showTooltips()).toBe(true); expect(p.getInsurance()).toBe('standard'); expect(p.getShipDiscount()).toBe(0); expect(p.getModuleDiscount()).toBe(0); expect(p.getBuilds()).toEqual({}); expect(p.getComparisons()).toEqual({}); }); it("works without localStorage", function() { window.localStorage = null; let p = new Persist(); expect(p.getLangCode()).toBe('en'); expect(p.showTooltips()).toBe(true); expect(p.getInsurance()).toBe('standard'); expect(p.getShipDiscount()).toBe(0); expect(p.getModuleDiscount()).toBe(0); expect(p.getSizeRatio()).toBe(1); p.saveBuild('anaconda', 'test', '12345'); expect(p.getBuild('anaconda', 'test')).toBe('12345'); p.deleteBuild('anaconda', 'test'); expect(p.hasBuilds()).toBe(false); }); it("generates the backup", function() { window.localStorage = LOCAL_STORAGE; let savedData = require('./fixtures/valid-backup'); LOCAL_STORAGE.clear(); LOCAL_STORAGE.setItem('builds', JSON.stringify(savedData.builds)); LOCAL_STORAGE.setItem('insurance', 'Beta'); LOCAL_STORAGE.setItem('shipDiscount', 0.25); LOCAL_STORAGE.setItem('moduleDiscount', 0.15); let p = new Persist(); let backup = p.getAll(); expect(backup.insurance).toBe('beta'); expect(backup.shipDiscount).toBe(0.25); expect(backup.moduleDiscount).toBe(0.15); expect(backup.builds).toEqual(savedData.builds); expect(backup.comparisons).toEqual({}); }); }); });