From 46fe6d00fc579678e5734a5326ca8fca5336cb79 Mon Sep 17 00:00:00 2001 From: Vladimir Volek Date: Tue, 5 Feb 2019 14:26:40 +0100 Subject: [PATCH] Integration tests (#311) * Add base test env * Add eslint rules for cypress * Add configs and scripts in package json * Added docker file for bridge and emualator * Bridge install progress * Bridge install next step * Add task for integration tests * Fixed deps * Added baseUrl * Added baseUrl fix * Added npx * Added caching for cypress bin * Added path to binary * Install cypress * Finalized dockerfile * Fixed bridge lib path * Fixed path for binary * Adjust script again * Run all the things properly * Try to run the tests * First POC test * First POC test in gitlab * Fixed flow * Fixed gitlab test url, try docker service * export artifacts * Test only integration tests in CI * Test only integration tests in CI 2 * Test only integration tests in CI 3 * Added tests for initialize device * Try to add docker in only one step * Turn on other integration steps * Correct node version * Ignore cache in flow * Run bridge and emulator in debug link mode * Fix param * Try to run new config in CI * init device in docker * Remove docker image after run * Remove amp * Fix path * Artifacts on fail * Artifacts on fail with volume * Artifacts on fail with volume 2 * Install mkdir * Install mkdir again * test * test 2 * test 3 * test 4 * test 5 * test 6 * test 7 * test 8 * test 9 * test 10 * test 11 * test 12 * test 13 * test 14 * test 15 * test 16 * test 17 * Revert "test 17" This reverts commit f3f6c0d6906cdc470aa11ae728b4b61a6b71a732. * test 18 * test 19 * test 20 * test 21 try chrome * test 22 * test 23 * test 24 * test 25 * test 25 try to install chrome again * test 25 try to install chrome again * Added missing deps * Added debug * Install chromium * Install chromium 2 * turn on chromium * turn off debug * turn on debug * fix folder * turn off debug * Fix init device * Add header dashboard test * Bring things back * clean * clean fix * Build image in CI * Added stage step * Added docker image * Added service * Added tests to docker image * Refactor a bit * Correct registry image * Build wallet again * Add test for dashbaord content * new node version, more tests * Remove unused code * typo * Correct snapshots, moved deps to dev, beta disclaimer prop --- .eslintrc | 11 +- .flowconfig | 1 + .gitignore | 4 +- .gitlab-ci.yml | 48 +- Dockerfile | 53 +- cypress.json | 11 + package.json | 10 + src/components/Button/index.js | 4 + src/components/DeviceHeader/index.js | 3 + src/components/Header/index.js | 2 +- .../components/BetaDisclaimer/index.js | 2 +- .../components/CoinMenu/index.js | 3 +- .../components/Divider/index.js | 4 +- .../Wallet/components/LeftNavigation/index.js | 3 +- src/views/Wallet/index.js | 6 +- src/views/Wallet/views/Dashboard/index.js | 2 +- src/views/Wallet/views/Initialize/index.js | 2 +- test/integration/dashboard.spec.js | 26 + test/plugins/index.js | 7 + test/scripts/init-device.js | 6 + test/scripts/run-all.sh | 20 + .../Dashboard page -- content.snap.png | Bin 0 -> 33887 bytes .../Dashboard page -- device header.snap.png | Bin 0 -> 11056 bytes .../Dashboard page -- navigation.snap.png | Bin 0 -> 13364 bytes test/support/commands.js | 5 + test/support/index.js | 5 + yarn.lock | 872 ++++++++++++++++-- 27 files changed, 1011 insertions(+), 99 deletions(-) create mode 100644 cypress.json create mode 100644 test/integration/dashboard.spec.js create mode 100644 test/plugins/index.js create mode 100644 test/scripts/init-device.js create mode 100755 test/scripts/run-all.sh create mode 100644 test/snapshots/All Specs/Dashboard page -- content.snap.png create mode 100644 test/snapshots/All Specs/Dashboard page -- device header.snap.png create mode 100644 test/snapshots/All Specs/Dashboard page -- navigation.snap.png create mode 100644 test/support/commands.js create mode 100644 test/support/index.js diff --git a/.eslintrc b/.eslintrc index a2540fde..30b99d6a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -10,7 +10,8 @@ }, "env": { "browser": true, - "jest": true + "jest": true, + "cypress/globals": true }, "rules": { "import/prefer-default-export": 0, @@ -32,13 +33,17 @@ "new-cap": 0, "max-len": 0, "eol-last": 0, - "spaced-comment": 0 + "spaced-comment": 0, + "no-unused-expressions": 0, + "chai-friendly/no-unused-expressions": 2 }, "plugins": [ "import", "react", "jest", - "flowtype" + "flowtype", + "cypress", + "chai-friendly" ], "settings": { "import/resolver": { diff --git a/.flowconfig b/.flowconfig index 97214ee1..13295242 100644 --- a/.flowconfig +++ b/.flowconfig @@ -10,6 +10,7 @@ .*/_old/.* .*/scripts/solidity/.* .*/build/.* +.*/cache/.* [libs] ./src/flowtype/npm/redux_v3.x.x.js diff --git a/.gitignore b/.gitignore index 495fb80e..9120523b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,6 @@ logs _old -coverage \ No newline at end of file +coverage +test/**/__diff_output__ +test/screenshots \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0a4b250..3046d582 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,14 +1,19 @@ -image: node:9.3 +image: node:10.15.1 + +variables: + CYPRESS_CACHE_FOLDER: "$CI_PROJECT_DIR/cache/Cypress" cache: key: ${CI_COMMIT_REF_SLUG} paths: - - node_modules/ + - node_modules + - ${CYPRESS_CACHE_FOLDER} stages: - test - build - deploy + - integration tests lint: stage: test @@ -62,7 +67,23 @@ build stable: expire_in: 1 week paths: - build/stable - - scripts/s3sync.sh + - scripts/s3sync.sh + +build emulator and bridge image: + variables: + CONTAINER_NAME: "$CI_REGISTRY/emulator-bridge-tests" + image: docker:latest + services: + - docker:dind + before_script: + - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD + stage: build + when: manual + script: + - docker pull $CONTAINER_NAME:latest || true + - docker build --cache-from $CONTAINER_NAME:latest --tag $CONTAINER_NAME:$CI_COMMIT_SHA --tag $CONTAINER_NAME:latest . + - docker push $CONTAINER_NAME:$CI_COMMIT_SHA + - docker push $CONTAINER_NAME:latest deploy review: stage: deploy @@ -138,3 +159,24 @@ delete review: - branches tags: - deploy + +integration tests: + image: docker:latest + services: + - docker:dind + stage: integration tests + script: + - 'export SHARED_PATH="$(dirname ${CI_PROJECT_DIR})/shared"' + - rm -r ${SHARED_PATH} || true + - docker build -t wallet-emulator-bridge-tests . + - mkdir -p ${SHARED_PATH}/trezor-wallet/screenshots + - mkdir -p ${SHARED_PATH}/trezor-wallet/videos + - docker run --volume ${SHARED_PATH}/trezor-wallet/screenshots:/trezor-wallet/test/screenshots --volume ${SHARED_PATH}/trezor-wallet/videos:/trezor-wallet/test/videos --rm wallet-emulator-bridge-tests + - find ${SHARED_PATH} + - mkdir trezor-wallet + - cp -r ${SHARED_PATH}/ trezor-wallet/ + artifacts: + when: always + expire_in: 1 week + paths: + - trezor-wallet/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7d2db3a6..06d122b5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,50 @@ -FROM node:9.3 +FROM python:latest -ARG BUILD_TYPE=stable +# +# setup +# +RUN apt-get update +RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - +RUN apt-get install -y chromium libappindicator3-1 xdg-utils fonts-liberation nodejs wget dpkg git python python3 python3-pip xvfb libgtk2.0-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 +RUN npm install -g yarn -WORKDIR /trezor-wallet-app +RUN ln -s /usr/bin/chromium /usr/local/bin/chromium-browser -COPY package.json /trezor-wallet-app -COPY yarn.lock /trezor-wallet-app +# +# build emulator +# +RUN mkdir /trezor-emulator +WORKDIR /trezor-emulator -RUN yarn install +RUN git clone https://github.com/trezor/trezor-core +WORKDIR /trezor-emulator/trezor-core +RUN git submodule update --init --recursive -COPY . /trezor-wallet-app +RUN apt-get install libusb-1.0-0 +RUN pip3 install scons trezor +RUN make build_unix_noui -RUN yarn run build:${BUILD_TYPE} +# +# install bridge +# +RUN mkdir /trezor-bridge +WORKDIR /trezor-bridge +RUN wget https://wallet.trezor.io/data/bridge/2.0.25/trezor-bridge_2.0.25_amd64.deb +RUN dpkg -x /trezor-bridge/trezor-bridge_2.0.25_amd64.deb /trezor-bridge/extracted -EXPOSE 8080 -CMD [ "yarn", "run", "prod-server" ] \ No newline at end of file +# +# install trezor-wallet +# +RUN mkdir /trezor-wallet +WORKDIR /trezor-wallet +COPY package.json /trezor-wallet +COPY yarn.lock /trezor-wallet +RUN yarn +COPY . /trezor-wallet +RUN yarn run build:stable + +# +# run +# +ENTRYPOINT ["/trezor-wallet/test/scripts/run-all.sh"] +EXPOSE 8080 21325 \ No newline at end of file diff --git a/cypress.json b/cypress.json new file mode 100644 index 00000000..f7910b54 --- /dev/null +++ b/cypress.json @@ -0,0 +1,11 @@ +{ + "integrationFolder": "test/integration", + "fixturesFolder": "test/fixtures", + "pluginsFile": "test/plugins/index.js", + "supportFile": "test/support/index.js", + "defaultCommandTimeout": 10000, + "screenshotsFolder": "test/screenshots", + "video": false, + "trashAssetsBeforeRuns": true, + "chromeWebSecurity": false +} \ No newline at end of file diff --git a/package.json b/package.json index 86c03fe9..6dc97fb7 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,14 @@ "test": "run-s test:*", "test:unit": "npx jest", "test-unit:watch": "npx jest -o --watch", + "test-integration:dev": "npx cypress open -c baseUrl=http://localhost:8081/#/", + "test-integration:test": "npx cypress run", + "test-integration:gitlab": "npx cypress run -c baseUrl=https://localhost:8080/#/ --browser chromium", "server:beta": "node ./server/index.js --buildType=beta", "server:stable": "node ./server/index.js --buildType=stable" }, "dependencies": { + "@babel/polyfill": "^7.2.5", "babel": "^6.23.0", "babel-core": "^6.26.3", "bignumber.js": "2.4.0", @@ -69,9 +73,11 @@ "redux-logger": "^3.0.6", "redux-raven-middleware": "^1.2.0", "redux-thunk": "^2.2.0", + "request": "^2.88.0", "rimraf": "^2.6.2", "styled-components": "^4.1.2", "styled-normalize": "^8.0.4", + "trezor-bridge-communicator": "1.0.2", "trezor-connect": "7.0.0-beta.2", "wallet-address-validator": "^0.2.4", "web3": "1.0.0-beta.35", @@ -94,10 +100,14 @@ "babel-preset-env": "^1.6.0", "babel-preset-jest": "^23.2.0", "babel-preset-react": "^6.24.1", + "cypress": "^3.1.5", + "cypress-image-snapshot": "^3.0.0", "eslint": "^4", "eslint-config-airbnb": "^17.0.0", "eslint-import-resolver-babel-module": "^4.0.0", "eslint-loader": "^2.1.0", + "eslint-plugin-chai-friendly": "^0.4.1", + "eslint-plugin-cypress": "^2.2.0", "eslint-plugin-flowtype": "^2.50.0", "eslint-plugin-import": "^2.14.0", "eslint-plugin-jest": "^21.18.0", diff --git a/src/components/Button/index.js b/src/components/Button/index.js index a5f3931d..65f56aa9 100644 --- a/src/components/Button/index.js +++ b/src/components/Button/index.js @@ -17,6 +17,7 @@ type Props = { isWhite?: boolean, isWebUsb?: boolean, isTransparent?: boolean, + dataTest?: string } const Wrapper = styled.button` @@ -146,10 +147,12 @@ const Button = ({ isWhite = false, isWebUsb = false, isTransparent = false, + dataTest, }: Props) => { const newClassName = isWebUsb ? `${className} trezor-webusb-button` : className; return ( { const status = getStatus(device); return ( ( - + { sidebarEnabled && {sidebarOpened ? '✕ Close' : '☰ Menu'}} diff --git a/src/views/Landing/components/BetaDisclaimer/index.js b/src/views/Landing/components/BetaDisclaimer/index.js index d9dfd824..f2fe5b76 100644 --- a/src/views/Landing/components/BetaDisclaimer/index.js +++ b/src/views/Landing/components/BetaDisclaimer/index.js @@ -68,7 +68,7 @@ const BetaDisclaimer = (props: { close: () => void }) => ( /> Please note that the Trezor Beta Wallet might be collecting anonymized usage data, especially error logs, for development purposes. The Trezor Wallet does not log any data. - OK, I understand + OK, I understand ); diff --git a/src/views/Wallet/components/LeftNavigation/components/CoinMenu/index.js b/src/views/Wallet/components/LeftNavigation/components/CoinMenu/index.js index 6d262662..194932e7 100644 --- a/src/views/Wallet/components/LeftNavigation/components/CoinMenu/index.js +++ b/src/views/Wallet/components/LeftNavigation/components/CoinMenu/index.js @@ -57,7 +57,7 @@ class CoinMenu extends PureComponent { render() { const { config } = this.props.localStorage; return ( - + {config.networks.map(item => ( { ))} ( @@ -39,6 +40,7 @@ Divider.propTypes = { textLeft: PropTypes.string, textRight: PropTypes.string, hasBorder: PropTypes.bool, + testId: PropTypes.string, }; export default Divider; diff --git a/src/views/Wallet/components/LeftNavigation/index.js b/src/views/Wallet/components/LeftNavigation/index.js index 8e926f67..57d57d0d 100644 --- a/src/views/Wallet/components/LeftNavigation/index.js +++ b/src/views/Wallet/components/LeftNavigation/index.js @@ -207,6 +207,7 @@ class LeftNavigation extends React.PureComponent {
{ if (isDeviceAccessible || this.props.devices.length > 1) { @@ -237,7 +238,7 @@ class LeftNavigation extends React.PureComponent { {dropdownOpened && } {isDeviceAccessible && menu} -