Dapp visibility save/load tests (#4150)
* Start of tests to replicate issue * Expand visibility tests * Cleanups * typo * Extend saving tests as requested (pre-emptive) * tests for new setDisplayApps action * Address PR oversights
This commit is contained in:
parent
512612424c
commit
3d1162e3d9
@ -34,13 +34,17 @@ export default class Contracts {
|
||||
this._signaturereg = new SignatureReg(api, this._registry);
|
||||
this._tokenreg = new TokenReg(api, this._registry);
|
||||
this._githubhint = new GithubHint(api, this._registry);
|
||||
this.badgeReg = new BadgeReg(api, this._registry);
|
||||
this._badgeReg = new BadgeReg(api, this._registry);
|
||||
}
|
||||
|
||||
get registry () {
|
||||
return this._registry;
|
||||
}
|
||||
|
||||
get badgeReg () {
|
||||
return this._badgeReg;
|
||||
}
|
||||
|
||||
get dappReg () {
|
||||
return this._dappreg;
|
||||
}
|
||||
|
220
js/src/views/Dapps/dappStore.spec.js
Normal file
220
js/src/views/Dapps/dappStore.spec.js
Normal file
@ -0,0 +1,220 @@
|
||||
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity.
|
||||
|
||||
// Parity is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import BigNumber from 'bignumber.js';
|
||||
import sinon from 'sinon';
|
||||
import localStore from 'store';
|
||||
|
||||
import Contracts from '~/contracts';
|
||||
|
||||
import Store, { LS_KEY_DISPLAY } from './dappsStore';
|
||||
|
||||
const APPID_BASICCOIN = '0xf9f2d620c2e08f83e45555247146c62185e4ab7cf82a4b9002a265a0d020348f';
|
||||
const APPID_DAPPREG = '0x7bbc4f1a27628781b96213e781a1b8eec6982c1db8fac739af6e4c5a55862c03';
|
||||
const APPID_GHH = '0x058740ee9a5a3fb9f1cfa10752baec87e09cc45cd7027fd54708271aca300c75';
|
||||
const APPID_LOCALTX = '0xae74ad174b95cdbd01c88ac5b73a296d33e9088fc2a200e76bcedf3a94a7815d';
|
||||
const FETCH_OK = {
|
||||
ok: true,
|
||||
status: 200
|
||||
};
|
||||
|
||||
let globalContractsGet;
|
||||
let globalFetch;
|
||||
|
||||
function stubGlobals () {
|
||||
globalContractsGet = Contracts.get;
|
||||
globalFetch = global.fetch;
|
||||
|
||||
Contracts.get = () => {
|
||||
return {
|
||||
dappReg: {
|
||||
at: sinon.stub().resolves([[0, 1, 2, 3], 'appOwner']),
|
||||
count: sinon.stub().resolves(new BigNumber(1)),
|
||||
getContract: sinon.stub().resolves({}),
|
||||
getContent: sinon.stub().resolves([0, 1, 2, 3]),
|
||||
getImage: sinon.stub().resolves([0, 1, 2, 3]),
|
||||
getManifest: sinon.stub().resolves([0, 1, 2, 3])
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
global.fetch = (url) => {
|
||||
switch (url) {
|
||||
case '/api/apps':
|
||||
return Promise.resolve(Object.assign({}, FETCH_OK, {
|
||||
json: sinon.stub().resolves([]) // TODO: Local stubs in here
|
||||
}));
|
||||
|
||||
default:
|
||||
console.log('Unknown fetch stub endpoint', url);
|
||||
return Promise.reject();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function restoreGlobals () {
|
||||
Contracts.get = globalContractsGet;
|
||||
global.fetch = globalFetch;
|
||||
}
|
||||
|
||||
let api;
|
||||
let store;
|
||||
|
||||
function create () {
|
||||
api = {};
|
||||
store = new Store(api);
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
describe('views/Dapps/DappStore', () => {
|
||||
beforeEach(() => {
|
||||
stubGlobals();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
restoreGlobals();
|
||||
});
|
||||
|
||||
describe('@action', () => {
|
||||
const defaultViews = {
|
||||
[APPID_BASICCOIN]: { visible: false },
|
||||
[APPID_DAPPREG]: { visible: true }
|
||||
};
|
||||
|
||||
describe('setDisplayApps', () => {
|
||||
beforeEach(() => {
|
||||
create();
|
||||
store.setDisplayApps(defaultViews);
|
||||
});
|
||||
|
||||
it('sets from empty start', () => {
|
||||
expect(store.displayApps).to.deep.equal(defaultViews);
|
||||
});
|
||||
|
||||
it('overrides single keys, keeping existing', () => {
|
||||
store.setDisplayApps({ [APPID_BASICCOIN]: { visible: true } });
|
||||
|
||||
expect(store.displayApps).to.deep.equal(
|
||||
Object.assign({}, defaultViews, { [APPID_BASICCOIN]: { visible: true } })
|
||||
);
|
||||
});
|
||||
|
||||
it('extends with new keys, keeping existing', () => {
|
||||
store.setDisplayApps({ 'test': { visible: true } });
|
||||
|
||||
expect(store.displayApps).to.deep.equal(
|
||||
Object.assign({}, defaultViews, { 'test': { visible: true } })
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('hideApp/showApp', () => {
|
||||
beforeEach(() => {
|
||||
localStore.set(LS_KEY_DISPLAY, defaultViews);
|
||||
|
||||
create().readDisplayApps();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
localStore.set(LS_KEY_DISPLAY, {});
|
||||
});
|
||||
|
||||
it('disables visibility', () => {
|
||||
store.hideApp(APPID_DAPPREG);
|
||||
|
||||
expect(store.displayApps[APPID_DAPPREG].visible).to.be.false;
|
||||
expect(localStore.get(LS_KEY_DISPLAY)).to.deep.equal(
|
||||
Object.assign({}, defaultViews, { [APPID_DAPPREG]: { visible: false } })
|
||||
);
|
||||
});
|
||||
|
||||
it('enables visibility', () => {
|
||||
store.showApp(APPID_BASICCOIN);
|
||||
|
||||
expect(store.displayApps[APPID_BASICCOIN].visible).to.be.true;
|
||||
expect(localStore.get(LS_KEY_DISPLAY)).to.deep.equal(
|
||||
Object.assign({}, defaultViews, { [APPID_BASICCOIN]: { visible: true } })
|
||||
);
|
||||
});
|
||||
|
||||
it('keeps visibility state', () => {
|
||||
store.hideApp(APPID_BASICCOIN);
|
||||
store.showApp(APPID_DAPPREG);
|
||||
|
||||
expect(store.displayApps[APPID_BASICCOIN].visible).to.be.false;
|
||||
expect(store.displayApps[APPID_DAPPREG].visible).to.be.true;
|
||||
expect(localStore.get(LS_KEY_DISPLAY)).to.deep.equal(defaultViews);
|
||||
});
|
||||
});
|
||||
|
||||
describe('readDisplayApps/writeDisplayApps', () => {
|
||||
beforeEach(() => {
|
||||
localStore.set(LS_KEY_DISPLAY, defaultViews);
|
||||
|
||||
create().readDisplayApps();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
localStore.set(LS_KEY_DISPLAY, {});
|
||||
});
|
||||
|
||||
it('loads visibility from storage', () => {
|
||||
expect(store.displayApps).to.deep.equal(defaultViews);
|
||||
});
|
||||
|
||||
it('saves visibility to storage', () => {
|
||||
store.setDisplayApps({ [APPID_BASICCOIN]: { visible: true } });
|
||||
store.writeDisplayApps();
|
||||
|
||||
expect(localStore.get(LS_KEY_DISPLAY)).to.deep.equal(
|
||||
Object.assign({}, defaultViews, { [APPID_BASICCOIN]: { visible: true } })
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('saved views', () => {
|
||||
beforeEach(() => {
|
||||
localStore.set(LS_KEY_DISPLAY, {
|
||||
[APPID_BASICCOIN]: { visible: false },
|
||||
[APPID_DAPPREG]: { visible: true }
|
||||
});
|
||||
|
||||
return create().loadAllApps();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
localStore.set(LS_KEY_DISPLAY, {});
|
||||
});
|
||||
|
||||
it('disables based on saved keys', () => {
|
||||
expect(store.displayApps[APPID_BASICCOIN].visible).to.be.false;
|
||||
});
|
||||
|
||||
it('enables based on saved keys', () => {
|
||||
expect(store.displayApps[APPID_DAPPREG].visible).to.be.true;
|
||||
});
|
||||
|
||||
it('keeps non-sepcified disabled keys', () => {
|
||||
expect(store.displayApps[APPID_GHH].visible).to.be.false;
|
||||
});
|
||||
|
||||
it('keeps non-specified enabled keys', () => {
|
||||
expect(store.displayApps[APPID_LOCALTX].visible).to.be.true;
|
||||
});
|
||||
});
|
||||
});
|
@ -39,7 +39,6 @@ export default class DappsStore extends EventEmitter {
|
||||
|
||||
_api = null;
|
||||
_subscriptions = {};
|
||||
|
||||
_cachedApps = {};
|
||||
_manifests = {};
|
||||
_registryAppsIds = null;
|
||||
@ -246,12 +245,12 @@ export default class DappsStore extends EventEmitter {
|
||||
}
|
||||
|
||||
@action hideApp = (id) => {
|
||||
this.displayApps = Object.assign({}, this.displayApps, { [id]: { visible: false } });
|
||||
this.setDisplayApps({ [id]: { visible: false } });
|
||||
this.writeDisplayApps();
|
||||
}
|
||||
|
||||
@action showApp = (id) => {
|
||||
this.displayApps = Object.assign({}, this.displayApps, { [id]: { visible: true } });
|
||||
this.setDisplayApps({ [id]: { visible: true } });
|
||||
this.writeDisplayApps();
|
||||
}
|
||||
|
||||
@ -263,6 +262,10 @@ export default class DappsStore extends EventEmitter {
|
||||
store.set(LS_KEY_DISPLAY, this.displayApps);
|
||||
}
|
||||
|
||||
@action setDisplayApps = (displayApps) => {
|
||||
this.displayApps = Object.assign({}, this.displayApps, displayApps);
|
||||
};
|
||||
|
||||
@action addApps = (_apps = []) => {
|
||||
transaction(() => {
|
||||
const apps = _apps.filter((app) => app);
|
||||
@ -285,7 +288,11 @@ export default class DappsStore extends EventEmitter {
|
||||
}
|
||||
});
|
||||
|
||||
this.displayApps = Object.assign({}, this.displayApps, visibility);
|
||||
this.setDisplayApps(visibility);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
LS_KEY_DISPLAY
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user