diff --git a/js/src/contracts/githubhint.js b/js/src/contracts/githubhint.js index 6cc16a266..dfc3d5fb7 100644 --- a/js/src/contracts/githubhint.js +++ b/js/src/contracts/githubhint.js @@ -18,6 +18,7 @@ export default class GithubHint { constructor (api, registry) { this._api = api; this._registry = registry; + this._instance = null; this.getInstance(); } @@ -27,6 +28,19 @@ export default class GithubHint { } getInstance () { - return this.getContract().instance; + if (this._instance) { + return Promise.resolve(this._instance); + } + + return this.getContract().then((contract) => { + this._instance = contract.instance; + return this._instance; + }); + } + + getEntry (entryId) { + return this.getInstance().then((instance) => { + return instance.entries.call({}, [entryId]); + }); } } diff --git a/js/src/contracts/githubhint.spec.js b/js/src/contracts/githubhint.spec.js new file mode 100644 index 000000000..f33850782 --- /dev/null +++ b/js/src/contracts/githubhint.spec.js @@ -0,0 +1,66 @@ +// Copyright 2015-2017 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 . + +import sinon from 'sinon'; + +import GithubHint from './githubhint'; + +let githubHint; +let instance; +let registry; + +function create () { + instance = { + __id: 'testInstance', + entries: { + call: sinon.stub().resolves('testValue') + } + }; + registry = { + getContract: sinon.stub().resolves({ instance }) + }; + githubHint = new GithubHint({}, registry); + + return githubHint; +} + +describe('contracts/GithubHint', () => { + beforeEach(() => { + create(); + + return githubHint.getInstance(); + }); + + it('instantiates successfully', () => { + expect(githubHint).to.be.ok; + }); + + it('attaches the instance on create', () => { + expect(githubHint._instance.__id).to.equal('testInstance'); + }); + + describe('interface', () => { + describe('getEntry', () => { + beforeEach(() => { + return githubHint.getEntry('testId'); + }); + + it('calls entries on the instance', () => { + expect(instance.entries.call).to.have.been.calledWith({}, ['testId']); + }); + }); + }); +}); diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index d8ea15df2..80f54ea03 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -89,16 +89,30 @@ export default class Registry { .then((contract) => contract.instance); } - lookupAddress (_name) { + _createGetParams (_name, key) { const name = _name.toLowerCase(); const sha3 = this._api.util.sha3.text(name); - return this.getInstance().then((instance) => { - return instance.getAddress.call({}, [sha3, 'A']); - }) - .then((address) => { - console.log('[lookupAddress]', `(${sha3}) ${name}: ${address}`); - return address; - }); + return [sha3, key]; + } + + lookupAddress (name) { + return this + .getInstance() + .then((instance) => { + return instance.getAddress.call({}, this._createGetParams(name, 'A')); + }) + .then((address) => { + console.log('[lookupAddress]', `${name}: ${address}`); + return address; + }); + } + + lookupMeta (name, key) { + return this + .getInstance() + .then((instance) => { + return instance.get.call({}, this._createGetParams(name, key)); + }); } } diff --git a/js/src/contracts/registry.spec.js b/js/src/contracts/registry.spec.js new file mode 100644 index 000000000..7cec52e94 --- /dev/null +++ b/js/src/contracts/registry.spec.js @@ -0,0 +1,83 @@ +// Copyright 2015-2017 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 . + +import sinon from 'sinon'; + +import apiutil from '~/api/util'; + +import Registry from './registry'; + +const GHH_NAME = 'githubhint'; +const GHH_SHA3 = '0x058740ee9a5a3fb9f1cfa10752baec87e09cc45cd7027fd54708271aca300c75'; + +let api; +let instance; +let registry; + +function create () { + instance = { + __id: 'testInstance', + get: { + call: sinon.stub().resolves('testGet') + } + }; + api = { + parity: { + registryAddress: sinon.stub().resolves('testRegistryAddress') + }, + util: apiutil, + newContract: sinon.stub().returns({ instance }) + }; + registry = new Registry(api); + + return registry; +} + +describe('contracts/Registry', () => { + beforeEach(() => { + create(); + + return registry.getInstance(); + }); + + it('instantiates successfully', () => { + expect(registry).to.be.ok; + }); + + it('retrieves the registry on create', () => { + expect(api.parity.registryAddress).to.have.been.called; + }); + + it('attaches the instance on create', () => { + expect(registry._instance.__id).to.equal('testInstance'); + }); + + describe('interface', () => { + describe('lookupMeta', () => { + it('calls get on the contract', () => { + return registry.lookupMeta(GHH_NAME, 'key').then(() => { + expect(instance.get.call).to.have.been.calledWith({}, [GHH_SHA3, 'key']); + }); + }); + + it('converts names to lowercase', () => { + return registry.lookupMeta(GHH_NAME.toUpperCase(), 'key').then(() => { + expect(instance.get.call).to.have.been.calledWith({}, [GHH_SHA3, 'key']); + }); + }); + }); + }); +});