diff --git a/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.spec.js b/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.spec.js index b78b9b4c60..9e793ac65e 100644 --- a/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.spec.js +++ b/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.spec.js @@ -99,7 +99,7 @@ describe('TransactionConfirmBridgechainRegistration', () => { expect(wrapper.vm.apiPort).toBe(4003) }) - it('should return placeholder if no core-api port', () => { + it('should return null if no core-api port', () => { createWrapper(null, { asset: { bridgechainRegistration: { @@ -115,7 +115,7 @@ describe('TransactionConfirmBridgechainRegistration', () => { } }) - expect(wrapper.vm.apiPort).toBe('-') + expect(wrapper.vm.apiPort).toBe(null) }) }) }) diff --git a/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.spec.js b/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.spec.js index cf1caf60c1..3867c781fe 100644 --- a/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.spec.js +++ b/__tests__/unit/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.spec.js @@ -84,7 +84,7 @@ describe('TransactionConfirmBridgechainUpdate', () => { expect(wrapper.vm.apiPort).toBe(4003) }) - it('should return placeholder if no core-api port', () => { + it('should return null if no core-api port', () => { createWrapper(null, { asset: { bridgechainUpdate: { @@ -100,7 +100,7 @@ describe('TransactionConfirmBridgechainUpdate', () => { } }) - expect(wrapper.vm.apiPort).toBe('-') + expect(wrapper.vm.apiPort).toBe(null) }) }) }) diff --git a/__tests__/unit/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.spec.js b/__tests__/unit/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.spec.js index d1c0ff3dd0..6103956174 100644 --- a/__tests__/unit/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.spec.js +++ b/__tests__/unit/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.spec.js @@ -588,45 +588,26 @@ describe.each([ }) }) - describe('seedNodeError', () => { - it('should return null if valid', () => { - wrapper.vm.$v.seedNode.$model = '5.5.5.5' - - expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) - expect(wrapper.vm.$v.seedNode.$invalid).toBe(false) - expect(wrapper.vm.seedNodeError).toBe(null) - }) - - it('should return null if not dirty', () => { - wrapper.vm.$v.seedNode.$model = '' - wrapper.vm.$v.seedNode.$reset() - - expect(wrapper.vm.$v.seedNode.$dirty).toBe(false) - expect(wrapper.vm.$v.seedNode.$invalid).toBe(false) - expect(wrapper.vm.seedNodeError).toBe(null) - }) - - it('should return error if invalid', () => { - wrapper.vm.$v.seedNode.$model = 'invalid seed node' + describe('hasSeedNodesError', () => { + it('should be true if there is an invalid seed node', () => { + wrapper.vm.invalidSeeds = [ + { ip: '0.5.5.5', isInvalid: true } + ] - expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) - expect(wrapper.vm.$v.seedNode.$invalid).toBe(true) - expect(wrapper.vm.seedNodeError).toBe('VALIDATION.INVALID_SEED') + expect(wrapper.vm.hasSeedNodesError).toBe(true) }) - it('should return error if duplicate', () => { + it('should be false if there are less than maximum seed nodes', () => { wrapper.vm.$v.form.seedNodes.$model = [ - { ip: '5.5.5.5', isInvalid: false } + { ip: '0.5.5.5', isInvalid: false } ] - wrapper.vm.$v.seedNode.$model = '5.5.5.5' - expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) - expect(wrapper.vm.$v.seedNode.$invalid).toBe(true) - expect(wrapper.vm.seedNodeError).toBe('TRANSACTION.BRIDGECHAIN.ERROR_DUPLICATE') + expect(wrapper.vm.hasSeedNodesError).toBe(false) }) - it('should return error if too many', () => { + it('should be true if there are more than maximum seed nodes', () => { wrapper.vm.$v.form.seedNodes.$model = [ + { ip: '0.5.5.5', isInvalid: false }, { ip: '1.5.5.5', isInvalid: false }, { ip: '2.5.5.5', isInvalid: false }, { ip: '3.5.5.5', isInvalid: false }, @@ -638,59 +619,46 @@ describe.each([ { ip: '9.5.5.5', isInvalid: false }, { ip: '10.5.5.5', isInvalid: false } ] - wrapper.vm.$v.seedNode.$model = '6.6.6.6' - expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) - expect(wrapper.vm.$v.seedNode.$invalid).toBe(true) - expect(wrapper.vm.seedNodeError).toBe('VALIDATION.TOO_MANY') + expect(wrapper.vm.hasSeedNodesError).toBe(true) }) }) - describe('seedNodesError', () => { + describe('seedNodeError', () => { it('should return null if valid', () => { - wrapper.vm.$v.form.seedNodes.$model = [ - { ip: '5.5.5.5', isInvalid: false } - ] + wrapper.vm.$v.seedNode.$model = '5.5.5.5' - expect(wrapper.vm.$v.form.seedNodes.$dirty).toBe(true) - expect(wrapper.vm.$v.form.seedNodes.$invalid).toBe(false) - expect(wrapper.vm.seedNodesError).toBe(null) + expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) + expect(wrapper.vm.$v.seedNode.$invalid).toBe(false) + expect(wrapper.vm.seedNodeError).toBe(null) }) it('should return null if not dirty', () => { - wrapper.vm.$v.form.seedNodes.$model = [] - wrapper.vm.$v.form.seedNodes.$reset() + wrapper.vm.$v.seedNode.$model = '' + wrapper.vm.$v.seedNode.$reset() - expect(wrapper.vm.$v.form.seedNodes.$dirty).toBe(false) - expect(wrapper.vm.$v.form.seedNodes.$invalid).toBe(true) - expect(wrapper.vm.seedNodesError).toBe(null) + expect(wrapper.vm.$v.seedNode.$dirty).toBe(false) + expect(wrapper.vm.$v.seedNode.$invalid).toBe(false) + expect(wrapper.vm.seedNodeError).toBe(null) }) - it('should return error if empty', () => { - wrapper.vm.$v.form.seedNodes.$model = [] + it('should return error if invalid', () => { + wrapper.vm.$v.seedNode.$model = 'invalid seed node' - expect(wrapper.vm.$v.form.seedNodes.$dirty).toBe(true) - expect(wrapper.vm.$v.form.seedNodes.$invalid).toBe(true) - expect(wrapper.vm.seedNodesError).toBe('VALIDATION.REQUIRED') + expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) + expect(wrapper.vm.$v.seedNode.$invalid).toBe(true) + expect(wrapper.vm.seedNodeError).toBe('VALIDATION.INVALID_SEED') }) - it('should return error if too many', () => { + it('should return error if duplicate', () => { wrapper.vm.$v.form.seedNodes.$model = [ - { ip: '1.5.5.5', isInvalid: false }, - { ip: '2.5.5.5', isInvalid: false }, - { ip: '3.5.5.5', isInvalid: false }, - { ip: '4.5.5.5', isInvalid: false }, - { ip: '5.5.5.5', isInvalid: false }, - { ip: '6.5.5.5', isInvalid: false }, - { ip: '7.5.5.5', isInvalid: false }, - { ip: '8.5.5.5', isInvalid: false }, - { ip: '9.5.5.5', isInvalid: false }, - { ip: '10.5.5.5', isInvalid: false } + { ip: '5.5.5.5', isInvalid: false } ] + wrapper.vm.$v.seedNode.$model = '5.5.5.5' - expect(wrapper.vm.$v.form.seedNodes.$dirty).toBe(true) - expect(wrapper.vm.$v.form.seedNodes.$invalid).toBe(true) - expect(wrapper.vm.seedNodesError).toBe('VALIDATION.TOO_MANY') + expect(wrapper.vm.$v.seedNode.$dirty).toBe(true) + expect(wrapper.vm.$v.seedNode.$invalid).toBe(true) + expect(wrapper.vm.seedNodeError).toBe('TRANSACTION.BRIDGECHAIN.ERROR_DUPLICATE') }) }) @@ -743,7 +711,12 @@ describe.each([ wrapper.vm.$v.form.asset.bridgechainRepository.$reset() expect(wrapper.vm.$v.form.asset.bridgechainRepository.$dirty).toBe(false) - expect(wrapper.vm.$v.form.asset.bridgechainRepository.$invalid).toBe(true) + if (componentName === 'TransactionFormBridgechainRegistration') { + expect(wrapper.vm.$v.form.asset.bridgechainRepository.$invalid).toBe(true) + } else { + expect(wrapper.vm.$v.form.asset.bridgechainRepository.$invalid).toBe(false) + } + expect(wrapper.vm.bridgechainRepositoryError).toBe(null) }) @@ -892,7 +865,7 @@ describe.each([ wrapper.vm.$v.form.asset.bridgechainRepository.$model = 'https://github.com/arkecosystem/core.git' wrapper.vm.$v.form.asset.bridgechainAssetRepository.$model = 'https://github.com/arkecosystem/core-assets.git' - const expectedAsset = { + let expectedAsset = { name: 'bridgechain', seedNodes: [ '1.1.1.1', @@ -907,8 +880,9 @@ describe.each([ } if (componentName === 'TransactionFormBridgechainUpdate') { - wrapper.vm.form.asset.bridgechainId = '2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867' - expectedAsset.bridgechainId = '2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867' + expectedAsset = { + bridgechainId: '2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867' + } } expect(wrapper.vm.getTransactionData()).toEqual({ @@ -944,7 +918,7 @@ describe.each([ wrapper.vm.$v.form.asset.bridgechainRepository.$model = 'https://github.com/arkecosystem/core.git' wrapper.vm.$v.form.asset.bridgechainAssetRepository.$model = 'https://github.com/arkecosystem/core-assets.git' - const expectedAsset = { + let expectedAsset = { name: 'bridgechain', seedNodes: [ '1.1.1.1', @@ -959,8 +933,9 @@ describe.each([ } if (componentName === 'TransactionFormBridgechainUpdate') { - wrapper.vm.form.asset.bridgechainId = '2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867' - expectedAsset.bridgechainId = '2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867' + expectedAsset = { + bridgechainId: '2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867' + } } expect(wrapper.vm.getTransactionData()).toEqual({ diff --git a/src/renderer/components/Input/InputEditableList.vue b/src/renderer/components/Input/InputEditableList.vue index bdd1b88cb3..98cb542830 100644 --- a/src/renderer/components/Input/InputEditableList.vue +++ b/src/renderer/components/Input/InputEditableList.vue @@ -33,7 +33,7 @@
{{ noItemsMessage }}
diff --git a/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.vue b/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.vue index 513f9c2e4b..71e9919048 100644 --- a/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.vue +++ b/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainRegistration.vue @@ -64,6 +64,14 @@ > {{ transaction.asset.bridgechainRegistration.bridgechainRepository }} + + + {{ transaction.asset.bridgechainRegistration.bridgechainAssetRepository }} + @@ -91,8 +99,14 @@ export default { }, apiPort () { - if (!this.transaction.asset.bridgechainRegistration.ports['@arkecosystem/core-api']) { - return '-' + if ( + !this.transaction.asset.bridgechainRegistration.ports || + ( + this.transaction.asset.bridgechainRegistration.ports && + !this.transaction.asset.bridgechainRegistration.ports['@arkecosystem/core-api'] + ) + ) { + return null } return this.transaction.asset.bridgechainRegistration.ports['@arkecosystem/core-api'] diff --git a/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.vue b/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.vue index adda2bae59..155caebea7 100644 --- a/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.vue +++ b/src/renderer/components/Transaction/TransactionConfirm/TransactionConfirmBridgechain/TransactionConfirmBridgechainUpdate.vue @@ -17,6 +17,23 @@ + {{ transaction.asset.bridgechainUpdate.bridgechainRepository }} + + + + {{ transaction.asset.bridgechainUpdate.bridgechainAssetRepository }} + + + @@ -29,6 +46,7 @@ @@ -61,8 +79,14 @@ export default { }, apiPort () { - if (!this.transaction.asset.bridgechainUpdate.ports['@arkecosystem/core-api']) { - return '-' + if ( + !this.transaction.asset.bridgechainUpdate.ports || + ( + this.transaction.asset.bridgechainUpdate.ports && + !this.transaction.asset.bridgechainUpdate.ports['@arkecosystem/core-api'] + ) + ) { + return null } return this.transaction.asset.bridgechainUpdate.ports['@arkecosystem/core-api'] diff --git a/src/renderer/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.vue b/src/renderer/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.vue index 59a0fa935b..a4573449aa 100644 --- a/src/renderer/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.vue +++ b/src/renderer/components/Transaction/TransactionForm/TransactionFormBridgechain/mixin.vue @@ -41,8 +41,10 @@ @@ -234,6 +236,10 @@ export default { }), computed: { + maxSeedNodes () { + return maxSeedNodes + }, + isUpdate () { return !!this.bridgechain }, @@ -243,9 +249,38 @@ export default { return !this.$v.form.seedNodes.$invalid } + if (this.step === 2 && this.isUpdate) { + return !this.$v.form.$invalid && !( + this.hasSameRepository && + this.hasSameAssetRepository && + this.hasSameSeedNodes && + this.hasSamePorts + ) + } + return !this.$v.form.$invalid }, + hasSameRepository () { + return this.form.asset.bridgechainRepository === this.bridgechain.bridgechainRepository + }, + + hasSameAssetRepository () { + return this.form.asset.bridgechainAssetRepository === this.bridgechain.bridgechainAssetRepository + }, + + hasSameSeedNodes () { + return ( + this.form.seedNodes.length === this.bridgechain.seedNodes.length && + this.form.seedNodes.every(seedNode => this.bridgechain.seedNodes.includes(seedNode.ip)) + ) + }, + + // will have to be adjusted when multiple ports are supported in the wallet + hasSamePorts () { + return parseInt(this.form.apiPort) === this.bridgechain.ports['@arkecosystem/core-api'] + }, + nameError () { if (this.$v.form.asset.name.$dirty && this.$v.form.asset.name.$invalid) { if (!this.$v.form.asset.name.required) { @@ -264,26 +299,16 @@ export default { return !this.$v.seedNode.$model.length || !!this.seedNodeError }, + hasSeedNodesError () { + return this.invalidSeeds.length > 0 || this.form.seedNodes.length > this.maxSeedNodes + }, + seedNodeError () { if (this.$v.seedNode.$dirty && this.$v.seedNode.$invalid) { if (!this.$v.seedNode.isValidSeed) { return this.$t('VALIDATION.INVALID_SEED') } else if (!this.$v.seedNode.isUnique) { return this.$t('TRANSACTION.BRIDGECHAIN.ERROR_DUPLICATE') - } else if (!this.$v.seedNode.belowMax) { - return this.$t('VALIDATION.TOO_MANY', [this.$t('TRANSACTION.BRIDGECHAIN.SEED_NODES')]) - } - } - - return null - }, - - seedNodesError () { - if (this.$v.form.seedNodes.$dirty && this.$v.form.seedNodes.$invalid) { - if (!this.$v.form.seedNodes.required) { - return this.$t('VALIDATION.REQUIRED', [this.$t('TRANSACTION.BRIDGECHAIN.SEED_NODES')]) - } else if (!this.$v.form.seedNodes.belowMax) { - return this.$t('VALIDATION.TOO_MANY', [this.$t('TRANSACTION.BRIDGECHAIN.SEED_NODES')]) } } @@ -292,7 +317,9 @@ export default { genesisHashError () { if (this.$v.form.asset.genesisHash.$dirty && this.$v.form.asset.genesisHash.$invalid) { - if (!this.$v.form.asset.genesisHash.isValidHash) { + if (!this.$v.form.asset.genesisHash.required) { + return this.$t('VALIDATION.REQUIRED', [this.$t('TRANSACTION.BRIDGECHAIN.GENESIS_HASH')]) + } else if (!this.$v.form.asset.genesisHash.isValidHash) { return this.$t('VALIDATION.NOT_VALID', [this.$t('TRANSACTION.BRIDGECHAIN.GENESIS_HASH')]) } } @@ -302,7 +329,9 @@ export default { bridgechainRepositoryError () { if (this.$v.form.asset.bridgechainRepository.$dirty && this.$v.form.asset.bridgechainRepository.$invalid) { - if (!this.$v.form.asset.bridgechainRepository.url) { + if (!this.$v.form.asset.bridgechainRepository.required) { + return this.$t('VALIDATION.REQUIRED', [this.$t('TRANSACTION.BRIDGECHAIN.BRIDGECHAIN_REPOSITORY')]) + } else if (!this.$v.form.asset.bridgechainRepository.url) { return this.$t('VALIDATION.INVALID_URL') } else if (!this.$v.form.asset.bridgechainRepository.tooShort) { return this.$t('VALIDATION.TOO_SHORT', [this.$t('TRANSACTION.BRIDGECHAIN.BRIDGECHAIN_REPOSITORY')]) @@ -339,14 +368,42 @@ export default { methods: { getTransactionData () { + const bridgechainAsset = Object.assign({}, this.form.asset) + + // will have to be adjusted when multiple ports are supported in the wallet + bridgechainAsset.ports['@arkecosystem/core-api'] = parseInt(this.form.apiPort) + bridgechainAsset.seedNodes = this.form.seedNodes.map(seedNode => seedNode.ip) + if (this.isUpdate) { - this.form.asset.bridgechainId = this.form.asset.genesisHash + bridgechainAsset.bridgechainId = bridgechainAsset.genesisHash + + delete bridgechainAsset.name + delete bridgechainAsset.genesisHash + + if (this.hasSameRepository) { + delete bridgechainAsset.bridgechainRepository + } + + if (this.hasSameAssetRepository) { + delete bridgechainAsset.bridgechainAssetRepository + } + + if (this.hasSameSeedNodes) { + delete bridgechainAsset.seedNodes + } + + if (this.hasSamePorts) { + delete bridgechainAsset.ports + } + } else { + if (!bridgechainAsset.bridgechainAssetRepository || !bridgechainAsset.bridgechainAssetRepository.length) { + delete bridgechainAsset.bridgechainAssetRepository + } } - this.form.asset.seedNodes = this.form.seedNodes.map(seedNode => seedNode.ip) const transactionData = { address: this.currentWallet.address, - asset: this.form.asset, + asset: bridgechainAsset, passphrase: this.form.passphrase, fee: this.getFee(), wif: this.form.wif, @@ -358,8 +415,6 @@ export default { transactionData.secondPassphrase = this.form.secondPassphrase } - transactionData.asset.ports['@arkecosystem/core-api'] = parseInt(this.form.apiPort) - return transactionData }, @@ -455,9 +510,6 @@ export default { }, isValidSeed (value) { return ipAddress(value) - }, - belowMax () { - return this.$v.form.seedNodes.$model.length < maxSeedNodes } }, @@ -478,8 +530,8 @@ export default { seedNodes: { required, - belowMax (value) { - return value.length < maxSeedNodes + belowOrEqualMaximum (value) { + return value.length <= maxSeedNodes } }, @@ -497,17 +549,26 @@ export default { }, genesisHash: { - isValidHash (value) { - return this.bridgechain ? true : /^[a-z0-9]{64}$/.test(value) - }, required (value) { return this.bridgechain ? true : required(value) + }, + isValidHash (value) { + return this.bridgechain ? true : /^[a-z0-9]{64}$/.test(value) } }, bridgechainRepository: { + required (value) { + return this.bridgechain ? true : required(value) + }, tooShort (value) { - return required(value) && minLength(minRepositoryLength)(value) + if (this.bridgechain) { + if (value) { + return minLength(minRepositoryLength)(value) + } + return true + } + return minLength(minRepositoryLength)(value) }, url (value) { return url(value) @@ -524,3 +585,9 @@ export default { } } + + diff --git a/src/renderer/components/Transaction/TransactionPeerList.vue b/src/renderer/components/Transaction/TransactionPeerList.vue index 67d590f1c1..a3c9154339 100644 --- a/src/renderer/components/Transaction/TransactionPeerList.vue +++ b/src/renderer/components/Transaction/TransactionPeerList.vue @@ -2,11 +2,13 @@