From 6fdbe6ee5d2820f03ef603a9b97538085e2df4bc Mon Sep 17 00:00:00 2001 From: Gina Contrino Date: Mon, 6 Nov 2017 13:54:52 +0100 Subject: [PATCH 1/4] Setup testnet tests --- features/step_definitions/generic.step.js | 2 +- features/step_definitions/hooks.js | 17 ++++++++++++++++- package.json | 1 + protractor.conf.js | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/features/step_definitions/generic.step.js b/features/step_definitions/generic.step.js index 8a9937f21..d6a0b7b22 100644 --- a/features/step_definitions/generic.step.js +++ b/features/step_definitions/generic.step.js @@ -140,7 +140,7 @@ defineSupportCode(({ Given, When, Then, setDefaultTimeout }) => { Given('I\'m logged in as "{accountName}"', { timeout: 2 * defaultTimeout }, (accountName, callback) => { browser.get(browser.params.baseURL); - waitForElemAndSendKeys('.passphrase input', accounts[accountName].passphrase, () => { + waitForElemAndSendKeys('.passphrase input', (browser.params.testnetPassphrase || accounts[accountName].passphrase), () => { waitForElemAndClickIt('.login-button', callback); }); }); diff --git a/features/step_definitions/hooks.js b/features/step_definitions/hooks.js index 129160772..43a463635 100644 --- a/features/step_definitions/hooks.js +++ b/features/step_definitions/hooks.js @@ -32,6 +32,21 @@ function takeScreenshot(screnarioSlug, callback) { }); } +const getNetworkType = (browser) => { + if (browser.params.testnetPassphrase && browser.params.testnetCustomNode) return 'customTestnet'; + if (browser.params.testnetPassphrase) return 'testnet'; + + return 'custom'; +}; +const setNetwork = { + custom: () => { localStorage.setItem('network', 2); }, + testnet: () => { localStorage.setItem('network', 1); }, + customTestnet: () => { + localStorage.setItem('address', 'https://testnet.lisk.io'); + localStorage.setItem('network', 2); + }, +}; + defineSupportCode(({ Before, After }) => { Before((scenario, callback) => { browser.ignoreSynchronization = true; @@ -39,7 +54,7 @@ defineSupportCode(({ Before, After }) => { browser.get(browser.params.baseURL); localStorage.clear(); localStorage.setItem('address', browser.params.liskCoreURL); - localStorage.setItem('network', 2); + setNetwork[getNetworkType(browser)](); callback(); }); diff --git a/package.json b/package.json index 231cc7b8b..a73060e5e 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "build-prod": "webpack --config ./config/webpack.config.prod --env.prod", "build-electron": "webpack --config ./config/webpack.config.electron", "e2e-test": "protractor protractor.conf.js", + "e2e-test:testnet": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\"", "test": "karma start", "test-live": "npm test -- --auto-watch --no-single-run", "start": "electron ./app/", diff --git a/protractor.conf.js b/protractor.conf.js index 3b99832a5..ab853c8f3 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -24,5 +24,7 @@ exports.config = { screenshotFolder: 'e2e-test-screenshots', baseURL: 'http://localhost:8080/', liskCoreURL: 'http://localhost:4000/', + testnetPassphrase: null, + testnetCustomNode: false, }, }; From dcc0adc1f43830d71f383bc2e00bb6fe51f63c60 Mon Sep 17 00:00:00 2001 From: Gina Contrino Date: Mon, 6 Nov 2017 14:54:27 +0100 Subject: [PATCH 2/4] Add scripts to jenkinsfile --- Jenkinsfile | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 785638f49..b4995d9fe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -120,12 +120,15 @@ node('lisk-nano') { ansiColor('xterm') { sh ''' N=${EXECUTOR_NUMBER:-0} + passphrase=${env.TESTNET_PASSPHRASE} # End to End test configuration export DISPLAY=:1$N Xvfb :1$N -ac -screen 0 1280x1024x24 & # Run end-to-end tests + npm run --silent e2e-test:testnet:custom -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --params.testnetPassphrase $passphrase --params.testnetCustomNode true + npm run --silent e2e-test:testnet -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --params.testnetPassphrase $passphrase npm run --silent e2e-test -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N ''' } diff --git a/package.json b/package.json index a73060e5e..72e341394 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "build-electron": "webpack --config ./config/webpack.config.electron", "e2e-test": "protractor protractor.conf.js", "e2e-test:testnet": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\"", + "e2e-test:testnet:custom": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\" \"--params.testnetCustomNode=true\"", "test": "karma start", "test-live": "npm test -- --auto-watch --no-single-run", "start": "electron ./app/", From 38d747860c09cd6b83c9a5559450d84136dcc619 Mon Sep 17 00:00:00 2001 From: Gina Contrino Date: Mon, 6 Nov 2017 15:28:22 +0100 Subject: [PATCH 3/4] Update jenkinsfile --- Jenkinsfile | 6 +++--- features/step_definitions/generic.step.js | 14 +++++++++++++- features/step_definitions/hooks.js | 4 ++-- package.json | 2 +- protractor.conf.js | 3 ++- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b4995d9fe..c5b464857 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -120,15 +120,15 @@ node('lisk-nano') { ansiColor('xterm') { sh ''' N=${EXECUTOR_NUMBER:-0} - passphrase=${env.TESTNET_PASSPHRASE} # End to End test configuration export DISPLAY=:1$N Xvfb :1$N -ac -screen 0 1280x1024x24 & # Run end-to-end tests - npm run --silent e2e-test:testnet:custom -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --params.testnetPassphrase $passphrase --params.testnetCustomNode true - npm run --silent e2e-test:testnet -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --params.testnetPassphrase $passphrase + + npm run --silent e2e-test:testnet:custom -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --params.testnetCustomNode true + npm run --silent e2e-test:testnet -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N $TESTNET_PASSPHRASE npm run --silent e2e-test -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N ''' } diff --git a/features/step_definitions/generic.step.js b/features/step_definitions/generic.step.js index d6a0b7b22..3ce5c9799 100644 --- a/features/step_definitions/generic.step.js +++ b/features/step_definitions/generic.step.js @@ -19,6 +19,18 @@ const expect = chai.expect; const EC = protractor.ExpectedConditions; const defaultTimeout = 10 * 1000; +const getNetworkType = (browser) => { + if (browser.params.testnetCustomNode) return 'customTestnet'; + if (browser.params.testnet) return 'testnet'; + + return 'custom'; +}; +const getPassphrase = (browser, accountName) => ({ + customTestnet: () => browser.params.testnetPassphrase, + testnet: () => browser.params.testnetPassphrase, + custom: () => accounts[accountName].passphrase, +}[getNetworkType(browser)]); + defineSupportCode(({ Given, When, Then, setDefaultTimeout }) => { setDefaultTimeout(defaultTimeout); @@ -140,7 +152,7 @@ defineSupportCode(({ Given, When, Then, setDefaultTimeout }) => { Given('I\'m logged in as "{accountName}"', { timeout: 2 * defaultTimeout }, (accountName, callback) => { browser.get(browser.params.baseURL); - waitForElemAndSendKeys('.passphrase input', (browser.params.testnetPassphrase || accounts[accountName].passphrase), () => { + waitForElemAndSendKeys('.passphrase input', (getPassphrase(browser)()), () => { waitForElemAndClickIt('.login-button', callback); }); }); diff --git a/features/step_definitions/hooks.js b/features/step_definitions/hooks.js index 43a463635..27e6c8519 100644 --- a/features/step_definitions/hooks.js +++ b/features/step_definitions/hooks.js @@ -33,8 +33,8 @@ function takeScreenshot(screnarioSlug, callback) { } const getNetworkType = (browser) => { - if (browser.params.testnetPassphrase && browser.params.testnetCustomNode) return 'customTestnet'; - if (browser.params.testnetPassphrase) return 'testnet'; + if (browser.params.testnetCustomNode) return 'customTestnet'; + if (browser.params.testnet) return 'testnet'; return 'custom'; }; diff --git a/package.json b/package.json index 72e341394..16efb29b9 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build-prod": "webpack --config ./config/webpack.config.prod --env.prod", "build-electron": "webpack --config ./config/webpack.config.electron", "e2e-test": "protractor protractor.conf.js", - "e2e-test:testnet": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\"", + "e2e-test:testnet": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\" \"--params.testnet=true\"", "e2e-test:testnet:custom": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\" \"--params.testnetCustomNode=true\"", "test": "karma start", "test-live": "npm test -- --auto-watch --no-single-run", diff --git a/protractor.conf.js b/protractor.conf.js index ab853c8f3..f3c26959f 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -24,7 +24,8 @@ exports.config = { screenshotFolder: 'e2e-test-screenshots', baseURL: 'http://localhost:8080/', liskCoreURL: 'http://localhost:4000/', - testnetPassphrase: null, + testnetPassphrase: process.env.TESTNET_PASSPHRASE, testnetCustomNode: false, + testnet: false, }, }; From f56a4ee70ffa51a4b9b4aa8c80ee17a6206f282c Mon Sep 17 00:00:00 2001 From: Gina Contrino Date: Tue, 7 Nov 2017 08:54:45 +0100 Subject: [PATCH 4/4] Refactor + cleanup --- Jenkinsfile | 22 ++++++++++++---------- features/send.feature | 1 + features/step_definitions/generic.step.js | 18 +++++------------- features/step_definitions/hooks.js | 18 ++---------------- features/voting.feature | 1 + package.json | 2 -- protractor.conf.js | 6 +++--- src/constants/networks.js | 2 +- 8 files changed, 25 insertions(+), 45 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c5b464857..8932fba99 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -118,19 +118,21 @@ node('lisk-nano') { stage ('Start Dev Server and Run E2E Tests') { try { ansiColor('xterm') { - sh ''' - N=${EXECUTOR_NUMBER:-0} + withCredentials([string(credentialsId: 'lisk-nano-testnet-passphrase', variable: 'TESTNET_PASSPHRASE')]) { + sh ''' + N=${EXECUTOR_NUMBER:-0} - # End to End test configuration - export DISPLAY=:1$N - Xvfb :1$N -ac -screen 0 1280x1024x24 & + # End to End test configuration + export DISPLAY=:1$N + Xvfb :1$N -ac -screen 0 1280x1024x24 & - # Run end-to-end tests + # Run end-to-end tests - npm run --silent e2e-test:testnet:custom -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --params.testnetCustomNode true - npm run --silent e2e-test:testnet -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N $TESTNET_PASSPHRASE - npm run --silent e2e-test -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N - ''' + npm run --silent e2e-test -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL https://testnet.lisk.io --cucumberOpts.tags @testnet --params.useTestnetPassphrase true + npm run --silent e2e-test -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N --cucumberOpts.tags @testnet --params.useTestnetPassphrase true --params.network testnet + npm run --silent e2e-test -- --params.baseURL file://$WORKSPACE/app/build/index.html --params.liskCoreURL http://127.0.0.1:400$N + ''' + } } } catch (err) { echo "Error: ${err}" diff --git a/features/send.feature b/features/send.feature index 8bdee9b0e..02b80d7b0 100644 --- a/features/send.feature +++ b/features/send.feature @@ -1,4 +1,5 @@ Feature: Send dialog + @testnet Scenario: should allow to send when enough funds and correct address form Given I'm logged in as "genesis" When I click "send button" diff --git a/features/step_definitions/generic.step.js b/features/step_definitions/generic.step.js index 3ce5c9799..ae58a643a 100644 --- a/features/step_definitions/generic.step.js +++ b/features/step_definitions/generic.step.js @@ -19,18 +19,6 @@ const expect = chai.expect; const EC = protractor.ExpectedConditions; const defaultTimeout = 10 * 1000; -const getNetworkType = (browser) => { - if (browser.params.testnetCustomNode) return 'customTestnet'; - if (browser.params.testnet) return 'testnet'; - - return 'custom'; -}; -const getPassphrase = (browser, accountName) => ({ - customTestnet: () => browser.params.testnetPassphrase, - testnet: () => browser.params.testnetPassphrase, - custom: () => accounts[accountName].passphrase, -}[getNetworkType(browser)]); - defineSupportCode(({ Given, When, Then, setDefaultTimeout }) => { setDefaultTimeout(defaultTimeout); @@ -152,7 +140,11 @@ defineSupportCode(({ Given, When, Then, setDefaultTimeout }) => { Given('I\'m logged in as "{accountName}"', { timeout: 2 * defaultTimeout }, (accountName, callback) => { browser.get(browser.params.baseURL); - waitForElemAndSendKeys('.passphrase input', (getPassphrase(browser)()), () => { + const passphrase = browser.params.useTestnetPassphrase + ? browser.params.testnetPassphrase + : accounts[accountName].passphrase; + + waitForElemAndSendKeys('.passphrase input', passphrase, () => { waitForElemAndClickIt('.login-button', callback); }); }); diff --git a/features/step_definitions/hooks.js b/features/step_definitions/hooks.js index 27e6c8519..60a4b3892 100644 --- a/features/step_definitions/hooks.js +++ b/features/step_definitions/hooks.js @@ -2,6 +2,7 @@ const { defineSupportCode } = require('cucumber'); const fs = require('fs'); const localStorage = require('../support/localStorage.js'); +const networks = require('./../../src/constants/networks'); function slugify(text) { return text.toString().toLowerCase() @@ -32,21 +33,6 @@ function takeScreenshot(screnarioSlug, callback) { }); } -const getNetworkType = (browser) => { - if (browser.params.testnetCustomNode) return 'customTestnet'; - if (browser.params.testnet) return 'testnet'; - - return 'custom'; -}; -const setNetwork = { - custom: () => { localStorage.setItem('network', 2); }, - testnet: () => { localStorage.setItem('network', 1); }, - customTestnet: () => { - localStorage.setItem('address', 'https://testnet.lisk.io'); - localStorage.setItem('network', 2); - }, -}; - defineSupportCode(({ Before, After }) => { Before((scenario, callback) => { browser.ignoreSynchronization = true; @@ -54,7 +40,7 @@ defineSupportCode(({ Before, After }) => { browser.get(browser.params.baseURL); localStorage.clear(); localStorage.setItem('address', browser.params.liskCoreURL); - setNetwork[getNetworkType(browser)](); + localStorage.setItem('network', networks[browser.params.network].code); callback(); }); diff --git a/features/voting.feature b/features/voting.feature index 2d359e637..78dbb3d5d 100644 --- a/features/voting.feature +++ b/features/voting.feature @@ -67,6 +67,7 @@ Feature: Voting tab And I click checkbox on table row no. 5 And I should see no "voting bar" + @testnet Scenario: should allow to select delegates in the "Voting" tab and vote for them Given I'm logged in as "delegate candidate" When I click tab number 2 diff --git a/package.json b/package.json index 16efb29b9..231cc7b8b 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,6 @@ "build-prod": "webpack --config ./config/webpack.config.prod --env.prod", "build-electron": "webpack --config ./config/webpack.config.electron", "e2e-test": "protractor protractor.conf.js", - "e2e-test:testnet": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\" \"--params.testnet=true\"", - "e2e-test:testnet:custom": "protractor protractor.conf.js \"--specs=features/send.feature:2:17,features/voting.feature:70\" \"--params.testnetCustomNode=true\"", "test": "karma start", "test-live": "npm test -- --auto-watch --no-single-run", "start": "electron ./app/", diff --git a/protractor.conf.js b/protractor.conf.js index f3c26959f..f739d4047 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -14,7 +14,7 @@ exports.config = { cucumberOpts: { require: 'features/step_definitions/*.js', - tags: '~@ignore', + tags: [], format: 'pretty', profile: false, 'no-source': true, @@ -25,7 +25,7 @@ exports.config = { baseURL: 'http://localhost:8080/', liskCoreURL: 'http://localhost:4000/', testnetPassphrase: process.env.TESTNET_PASSPHRASE, - testnetCustomNode: false, - testnet: false, + useTestnetPassphrase: false, + network: 'customNode', }, }; diff --git a/src/constants/networks.js b/src/constants/networks.js index 39cbf0e08..4ebac39f2 100644 --- a/src/constants/networks.js +++ b/src/constants/networks.js @@ -1,4 +1,4 @@ -export default { +module.exports = { mainnet: { // network name translation t('Mainnet'); name: 'Mainnet', ssl: true,