Merge branch 'smoke-tests' into 'master'

Smoke tests

See merge request fyipe-project/app!19
This commit is contained in:
Nawaz Dhandala
2019-09-09 09:48:06 +00:00
24 changed files with 5505 additions and 435 deletions

View File

@@ -7,190 +7,194 @@
# Define stages
stages:
# - BuildAndTest
# - E2E
- BuildAndTest
- E2E
- DeployStaging
- DeployProduction
- SmokeTest
- Rollback
# ##BACKEND
# lint_n_audit_backend:
# stage: BuildAndTest
# script:
# - cd backend
# - npm install --dev
# - npm run lint
# # - npm run audit
# - cd ..
##BACKEND
lint_n_audit_backend:
stage: BuildAndTest
script:
- cd backend
- npm install --dev
- npm run lint
# - npm run audit
- cd ..
# build_n_test_backend:
# stage: BuildAndTest
# script:
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --name fyipe --network container:mongo fyipe-project/backend:3.0.$CI_PIPELINE_IID npm test
build_n_test_backend:
stage: BuildAndTest
script:
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --name fyipe --network container:mongo fyipe-project/backend:3.0.$CI_PIPELINE_IID npm test
# ##DASHBOARD
# lint_n_audit_dashboard:
# stage: BuildAndTest
# script:
# - cd dashboard
# - npm install --dev
# - npm run lint
# # - npm run audit
# - cd ..
##DASHBOARD
lint_n_audit_dashboard:
stage: BuildAndTest
script:
- cd dashboard
- npm install --dev
- npm run lint
# - npm run audit
- cd ..
# build_n_test_dashboard:
# stage: BuildAndTest
# script:
# - echo "Setup machine for running puppeteer tests"
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
# - sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
# - sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
# - sudo docker ps
# - cd dashboard
# - npm install
# - npm run jest
build_n_test_dashboard:
stage: BuildAndTest
script:
- echo "Setup machine for running puppeteer tests"
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
- sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
- sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
- sudo docker ps
- cd dashboard
- npm install
- npm run jest
# ##ZAPIER
# lint_n_audit_zapier:
# stage: BuildAndTest
# script:
# - cd zapier
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
##ZAPIER
lint_n_audit_zapier:
stage: BuildAndTest
script:
- cd zapier
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# build_n_test_zapier:
# stage: BuildAndTest
# script:
# - echo "No test implemented"
build_n_test_zapier:
stage: BuildAndTest
script:
- echo "No test implemented"
# ## STATUS PAGE
# lint_n_audit_statuspage:
# stage: BuildAndTest
# script:
# - cd status-page
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
## STATUS PAGE
lint_n_audit_statuspage:
stage: BuildAndTest
script:
- cd status-page
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# build_n_test_statuspage:
# stage: BuildAndTest
# script:
# - echo "Setup machine for running puppeteer tests"
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/status-page:3.0.$CI_PIPELINE_IID ./status-page
# - sudo docker run -p 3006:3006 -d fyipe-project/status-page:3.0.$CI_PIPELINE_IID
# - sudo docker ps
# - cd backend
# - npm install
# - cd ..
# - cd status-page
# - npm install
# - curl localhost:3006
# - npm run jest
build_n_test_statuspage:
stage: BuildAndTest
script:
- echo "Setup machine for running puppeteer tests"
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/status-page:3.0.$CI_PIPELINE_IID ./status-page
- sudo docker run -p 3006:3006 -d fyipe-project/status-page:3.0.$CI_PIPELINE_IID
- sudo docker ps
- cd backend
- npm install
- cd ..
- cd status-page
- npm install
- curl localhost:3006
- npm run jest
# ## ACCOUNTS
# lint_n_audit_accounts:
# stage: BuildAndTest
# script:
# - cd accounts
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
## ACCOUNTS
lint_n_audit_accounts:
stage: BuildAndTest
script:
- cd accounts
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# build_n_test_accounts:
# stage: BuildAndTest
# script:
# - echo "Setup machine for running puppeteer tests"
# - sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
# - sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
# - sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
# - sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
# - sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
# - sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
# - sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
# - sudo docker ps
# - cd accounts
# - npm install
# - npm run jest
build_n_test_accounts:
stage: BuildAndTest
script:
- echo "Setup machine for running puppeteer tests"
- sudo docker stop $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker rm $(sudo docker ps -aq) || echo 'No docker containers'
- sudo docker run --name mongo -p 27017:27017 -d mongo:3.4
- sudo docker build -t fyipe-project/backend:3.0.$CI_PIPELINE_IID ./backend
- sudo docker run --env-file ./backend/.env.development --net=host -d fyipe-project/backend:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/accounts:3.0.$CI_PIPELINE_IID ./accounts
- sudo docker run -p 3003:3003 -d fyipe-project/accounts:3.0.$CI_PIPELINE_IID
- sudo docker build -t fyipe-project/dashboard:3.0.$CI_PIPELINE_IID ./dashboard
- sudo docker run -p 3000:3000 -d fyipe-project/dashboard:3.0.$CI_PIPELINE_IID
- sudo docker ps
- cd accounts
- npm install
- npm run jest
# ## HOME
# lint_n_audit_home:
# stage: BuildAndTest
# script:
# - cd home
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
## HOME
lint_n_audit_home:
stage: BuildAndTest
script:
- cd home
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# build_n_test_home:
# stage: BuildAndTest
# script:
# - echo "No test implemented"
build_n_test_home:
stage: BuildAndTest
script:
- echo "No test implemented"
# ## PROBE
# lint_n_audit_probe:
# stage: BuildAndTest
# script:
# - cd probe
# - npm install --dev
# - npm run lint
# - npm run audit
# - cd ..
## PROBE
lint_n_audit_probe:
stage: BuildAndTest
script:
- cd probe
- npm install --dev
- npm run lint
- npm run audit
- cd ..
# build_n_test_probe:
# stage: BuildAndTest
# script:
# - echo "No test implemented"
build_n_test_probe:
stage: BuildAndTest
script:
- echo "No test implemented"
# ##E2E Stage.
# e2e_test:
# stage: E2E
# script:
# - chmod +x ./kubernetes/ci/setup-machine.sh
# - ./kubernetes/ci/setup-machine.sh
# - chmod +x ./kubernetes/ci/setup.sh
# - ./kubernetes/ci/setup.sh
# - export ACCOUNTS_URL=`sudo kubectl describe svc accounts | grep Endpoints | cut -d ":" -f 2`
# - export BACKEND_URL=`sudo kubectl describe svc backend | grep Endpoints | cut -d ":" -f 2`
# - export DASHBOARD_URL=`sudo kubectl describe svc dashboard | grep Endpoints | cut -d ":" -f 2`
# - export HOME_URL=`sudo kubectl describe svc home | grep Endpoints | cut -d ":" -f 2`
# - export STATUSPAGE_URL=`sudo kubectl describe svc status-page | grep Endpoints | cut -d ":" -f 2`
# - echo ACCOUNTS_URL=$ACCOUNTS_URL
# - echo BACKEND_URL=$BACKEND_URL
# - echo DASHBOARD_URL=$DASHBOARD_URL
# - echo HOME_URL=$HOME_URL
# - echo STATUSPAGE_URL=$STATUSPAGE_URL
# - chmod +x ./kubernetes/ci/hosts-setup.sh
# - ./kubernetes/ci/hosts-setup.sh
##E2E Stage.
e2e_test:
stage: E2E
script:
- chmod +x ./kubernetes/ci/setup-machine.sh
- ./kubernetes/ci/setup-machine.sh
- chmod +x ./kubernetes/ci/setup.sh
- ./kubernetes/ci/setup.sh
- export ACCOUNTS_URL=`sudo kubectl describe svc accounts | grep Endpoints | cut -d ":" -f 2`
- export BACKEND_URL=`sudo kubectl describe svc backend | grep Endpoints | cut -d ":" -f 2`
- export DASHBOARD_URL=`sudo kubectl describe svc dashboard | grep Endpoints | cut -d ":" -f 2`
- export HOME_URL=`sudo kubectl describe svc home | grep Endpoints | cut -d ":" -f 2`
- export STATUSPAGE_URL=`sudo kubectl describe svc status-page | grep Endpoints | cut -d ":" -f 2`
- export APIDOCS_URL=`sudo kubectl describe svc api-docs | grep Endpoints | cut -d ":" -f 2`
- echo ACCOUNTS_URL=$ACCOUNTS_URL
- echo BACKEND_URL=$BACKEND_URL
- echo DASHBOARD_URL=$DASHBOARD_URL
- echo HOME_URL=$HOME_URL
- echo STATUSPAGE_URL=$STATUSPAGE_URL
- chmod +x ./kubernetes/ci/hosts-setup.sh
- ./kubernetes/ci/hosts-setup.sh
- cd smoke-test
- npm i
- npm run test
# only:
# refs:
# - release
# - master
only:
refs:
- release
- master
# DEPLOYMENT STAGE - BACKEND
deploy_staging_backend:

View File

@@ -1,10 +1,26 @@
const express = require('express');
const path = require('path');
const app = express();
const envfile = require('envfile');
const fs = require('fs');
var child_process = require('child_process');
var env = {
REACT_APP_FYIPE_HOSTED: process.env.FYIPE_HOSTED,
REACT_APP_HOST: process.env.HOST,
REACT_APP_DASHBOARD_HOST: process.env.DASHBOARD_HOST,
REACT_APP_BACKEND_HOST: process.env.BACKEND_HOST
}
fs.writeFileSync('.env', envfile.stringifySync(env));
child_process.execSync('react-env', {
stdio: [0, 1, 2]
});
app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', function(req, res) {
app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

View File

@@ -928,6 +928,29 @@
"to-fast-properties": "^2.0.0"
}
},
"@beam-australia/react-env": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@beam-australia/react-env/-/react-env-2.1.2.tgz",
"integrity": "sha512-gXcCGGGb2oRM/oeqT861JXsSTJjOxGTBMkj7J5ujEBb6Vmv5I108NcALPYYdGdzFCV6ebdVP+E5k0W1xAbzA7w==",
"requires": {
"cross-spawn": "^6.0.5",
"dotenv": "^8.0.0",
"dotenv-expand": "^5.1.0",
"minimist": "^1.2.0"
},
"dependencies": {
"dotenv": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
"integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA=="
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
}
}
},
"@cnakazawa/watch": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz",
@@ -1782,6 +1805,15 @@
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
},
"ambi": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ambi/-/ambi-5.0.0.tgz",
"integrity": "sha512-NYJzHMsZU7clGY2lH11U+2PEllFDW66qnUukXYbyF8ZJ0B0CXVNfKHUvkUp+gsaNPBW8FqEFX5l64LTlUvI2pw==",
"requires": {
"editions": "^2.1.0",
"typechecker": "^4.3.0"
}
},
"ansi-colors": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
@@ -4834,6 +4866,22 @@
"stream-shift": "^1.0.0"
}
},
"eachr": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz",
"integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=",
"requires": {
"editions": "^1.1.1",
"typechecker": "^4.3.0"
},
"dependencies": {
"editions": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
"integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
}
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -4843,6 +4891,15 @@
"safer-buffer": "^2.1.0"
}
},
"editions": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
"integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
"requires": {
"errlop": "^1.1.1",
"semver": "^5.6.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -4922,6 +4979,25 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
},
"envfile": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/envfile/-/envfile-3.0.0.tgz",
"integrity": "sha512-LdL/WLZutuZedarG3Knu4v4RC7kZpC+dSdv9tVj0B8q11K0T0pLczRYxhmyVpApRRXWQnz5Fldrtnu/RzbCHPA==",
"requires": {
"ambi": "^5.0.0",
"eachr": "^3.1.0",
"editions": "^2.1.3",
"typechecker": "^4.0.1"
}
},
"errlop": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz",
"integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==",
"requires": {
"editions": "^2.1.2"
}
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -13445,6 +13521,14 @@
"mime-types": "~2.1.24"
}
},
"typechecker": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz",
"integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==",
"requires": {
"editions": "^2.1.0"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",

View File

@@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@beam-australia/react-env": "^2.1.2",
"@trendmicro/react-dropdown": "^1.3.0",
"axios": "^0.18.0",
"browserslist": "^4.6.1",
@@ -12,6 +13,7 @@
"components": "^0.1.0",
"connected-react-router": "^4.5.0",
"creditcard-generator": "0.0.7",
"envfile": "^3.0.0",
"express": "^4.16.4",
"faker": "^4.1.0",
"file-saver": "^2.0.1",

View File

@@ -29,6 +29,7 @@
<link rel="preload" href="/assets/fonts/camphor/font3.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="preload" href="/assets/fonts/camphor/font4.woff2" as="font" type="font/woff2" crossorigin="">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
<script src="%PUBLIC_URL%/env.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.3/jquery.tipsy.min.js" type="text/javascript"></script>
<style type="text/css">
/* Camphor */

View File

@@ -11,25 +11,26 @@ let dashboardUrl = null;
let domain = null;
let adminDashboardUrl = null;
function env(value) {
var { _env } = window;
return _env[`REACT_APP_${value}`];
}
if (!isServer) {
if (window.location.href.indexOf('localhost') > -1) {
apiUrl = 'http://localhost:3002';
dashboardUrl = 'http://localhost:3000';
domain = 'localhost';
adminDashboardUrl = 'http://localhost:3100';
} else if (window.location.href.indexOf('staging') > -1) {
apiUrl = 'https://staging-api.fyipe.com';
dashboardUrl = 'http://staging-dashboard.fyipe.com';
domain = 'fyipe.com';
} else {
apiUrl = 'https://api.fyipe.com';
dashboardUrl = 'https://dashboard.fyipe.com';
domain = 'fyipe.com';
} else if (env('BACKEND_HOST')) {
apiUrl = env('BACKEND_HOST');
dashboardUrl = env('DASHBOARD_HOST');
domain = 'host';
}
}
export const API_URL = apiUrl;
export const DASHBOARD_URL = dashboardUrl;
@@ -197,7 +198,7 @@ export const PricingPlan = {
getPlans() {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1) {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1 || window.location.href.indexOf('accounts:3003') > -1) {
return [
{
category: 'Basic',

View File

@@ -1,10 +1,26 @@
const express = require('express');
const path = require('path');
const app = express();
const envfile = require('envfile');
const fs = require('fs');
var child_process = require('child_process');
var env = {
REACT_APP_FYIPE_HOSTED: process.env.FYIPE_HOSTED,
REACT_APP_HOST: process.env.HOST,
REACT_APP_ACCOUNTS_HOST: process.env.ACCOUNTS_HOST,
REACT_APP_BACKEND_HOST: process.env.BACKEND_HOST
}
fs.writeFileSync('.env', envfile.stringifySync(env));
child_process.execSync('react-env', {
stdio: [0, 1, 2]
});
app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', function(req, res) {
app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

View File

@@ -928,6 +928,34 @@
"to-fast-properties": "^2.0.0"
}
},
"@beam-australia/react-env": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@beam-australia/react-env/-/react-env-2.1.2.tgz",
"integrity": "sha512-gXcCGGGb2oRM/oeqT861JXsSTJjOxGTBMkj7J5ujEBb6Vmv5I108NcALPYYdGdzFCV6ebdVP+E5k0W1xAbzA7w==",
"requires": {
"cross-spawn": "^6.0.5",
"dotenv": "^8.0.0",
"dotenv-expand": "^5.1.0",
"minimist": "^1.2.0"
},
"dependencies": {
"dotenv": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
"integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA=="
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
}
}
},
"@cnakazawa/watch": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz",
@@ -1829,6 +1857,15 @@
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
},
"ambi": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ambi/-/ambi-5.0.0.tgz",
"integrity": "sha512-NYJzHMsZU7clGY2lH11U+2PEllFDW66qnUukXYbyF8ZJ0B0CXVNfKHUvkUp+gsaNPBW8FqEFX5l64LTlUvI2pw==",
"requires": {
"editions": "^2.1.0",
"typechecker": "^4.3.0"
}
},
"ansi-colors": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
@@ -5571,6 +5608,22 @@
}
}
},
"eachr": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz",
"integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=",
"requires": {
"editions": "^1.1.1",
"typechecker": "^4.3.0"
},
"dependencies": {
"editions": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
"integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
}
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -5580,6 +5633,15 @@
"safer-buffer": "^2.1.0"
}
},
"editions": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
"integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
"requires": {
"errlop": "^1.1.1",
"semver": "^5.6.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -5706,6 +5768,25 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
},
"envfile": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/envfile/-/envfile-3.0.0.tgz",
"integrity": "sha512-LdL/WLZutuZedarG3Knu4v4RC7kZpC+dSdv9tVj0B8q11K0T0pLczRYxhmyVpApRRXWQnz5Fldrtnu/RzbCHPA==",
"requires": {
"ambi": "^5.0.0",
"eachr": "^3.1.0",
"editions": "^2.1.3",
"typechecker": "^4.0.1"
}
},
"errlop": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz",
"integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==",
"requires": {
"editions": "^2.1.2"
}
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -8486,8 +8567,7 @@
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"optional": true
"bundled": true
},
"aproba": {
"version": "1.2.0",
@@ -8524,8 +8604,7 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"concat-map": {
"version": "0.0.1",
@@ -8534,8 +8613,7 @@
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"core-util-is": {
"version": "1.0.2",
@@ -8638,8 +8716,7 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true,
"optional": true
"bundled": true
},
"ini": {
"version": "1.3.5",
@@ -8649,7 +8726,6 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -8675,7 +8751,6 @@
"minipass": {
"version": "2.3.5",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -8692,7 +8767,6 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -8765,8 +8839,7 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"object-assign": {
"version": "4.1.1",
@@ -8776,7 +8849,6 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@@ -8852,8 +8924,7 @@
},
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
"optional": true
"bundled": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -8883,7 +8954,6 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -8901,7 +8971,6 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -8940,13 +9009,11 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true,
"optional": true
"bundled": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
"optional": true
"bundled": true
}
}
}
@@ -15006,6 +15073,14 @@
"mime-types": "~2.1.24"
}
},
"typechecker": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz",
"integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==",
"requires": {
"editions": "^2.1.0"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",

View File

@@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@beam-australia/react-env": "^2.1.2",
"@trendmicro/react-dropdown": "^1.3.0",
"axios": "^0.18.0",
"browserslist": "^4.6.1",
@@ -12,6 +13,7 @@
"cloudboost": "^6.6.6",
"components": "^0.1.0",
"connected-react-router": "^4.5.0",
"envfile": "^3.0.0",
"express": "^4.16.4",
"faker": "^4.1.0",
"file-saver": "^2.0.1",

View File

@@ -29,6 +29,7 @@
<link rel="preload" href="/assets/fonts/camphor/font3.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="preload" href="/assets/fonts/camphor/font4.woff2" as="font" type="font/woff2" crossorigin="">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
<script src="%PUBLIC_URL%/env.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.3/jquery.tipsy.min.js" type="text/javascript"></script>
<script src="https://js.stripe.com/v3/"></script>
<style type="text/css">

View File

@@ -3,32 +3,50 @@ import isEmail from 'sane-email-validation';
import validUrl from 'valid-url';
import valid from 'card-validator';
import { isServer } from './store';
import FileSaver from 'file-saver'
import FileSaver from 'file-saver';
let apiUrl = 'http://localhost:3002';
let dashboardUrl = null;
let accountsUrl = null;
let domain = null;
// if (!isServer) {
// if (window.location.href.indexOf('localhost') > -1) {
// apiUrl = 'http://localhost:3002';
// dashboardUrl = 'http://localhost:3000';
// accountsUrl = 'http://localhost:3003';
// domain = 'localhost';
// } else if (window.location.href.indexOf('staging') > -1) {
// apiUrl = 'https://staging-api.fyipe.com';
// dashboardUrl = 'http://staging-dashboard.fyipe.com';
// accountsUrl = 'http://staging-accounts.fyipe.com';
// domain = 'fyipe.com';
// } else {
// apiUrl = 'https://api.fyipe.com';
// dashboardUrl = 'https://fyipe.com';
// accountsUrl = 'https://accounts.fyipe.com';
// domain = 'fyipe.com';
// }
// }
function env(value) {
var { _env } = window;
return _env[`REACT_APP_${value}`];
}
if (!isServer) {
if (window.location.href.indexOf('localhost') > -1) {
apiUrl = 'http://localhost:3002';
dashboardUrl = 'http://localhost:3000';
accountsUrl = 'http://localhost:3003';
domain = 'localhost';
} else if (window.location.href.indexOf('staging') > -1) {
apiUrl = 'https://staging-api.fyipe.com';
dashboardUrl = 'http://staging-dashboard.fyipe.com';
accountsUrl = 'http://staging-accounts.fyipe.com';
domain = 'fyipe.com';
} else {
apiUrl = 'https://api.fyipe.com';
dashboardUrl = 'https://fyipe.com';
accountsUrl = 'https://accounts.fyipe.com';
domain = 'fyipe.com';
} else if (env('BACKEND_HOST')) {
apiUrl = env('BACKEND_HOST');
dashboardUrl = env('HOST');
accountsUrl = env('ACCOUNTS_HOST');
domain = 'host';
}
}
export const API_URL = apiUrl;
@@ -215,7 +233,7 @@ export const PricingPlan = {
getPlans() {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1) {
if (window.location.href.indexOf('localhost') > -1 || window.location.href.indexOf('staging') > -1 || window.location.href.indexOf('dashboard:3003') > -1) {
return [
{
category: 'Basic',

View File

@@ -26,6 +26,12 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "http://dashboard:3000"
- name: ACCOUNTS_HOST
value: "http://accounts:3003"
- name: BACKEND_HOST
value: "http://backend:3002"
ports:
- containerPort: 3000
hostPort: 3000
@@ -75,6 +81,12 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "http://accounts:3003"
- name: BACKEND_HOST
value: "http://backend:3002"
- name: DASHBOARD_HOST
value: "http://dashboard:3000"
ports:
- containerPort: 3003
hostPort: 3003
@@ -100,6 +112,61 @@ spec:
type: LoadBalancer
---
# Fyipe API docs Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-docs
labels:
app: api-docs
spec:
selector:
matchLabels:
app: api-docs
replicas: 1
template:
metadata:
labels:
app: api-docs
spec:
containers:
- image: localhost:32000/api-docs:master
name: api-docs
imagePullPolicy: Always
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "accounts"
- name: BACKEND_HOST
value: "backend"
- name: DASHBOARD_HOST
value: "dashboard"
ports:
- containerPort: 1445
hostPort: 1445
name: api-docs
restartPolicy: Always
imagePullSecrets:
- name: gitlabcredv2
---
# Fyipe API docs Service
apiVersion: v1
kind: Service
metadata:
labels:
app: api-docs
name: api-docs
spec:
ports:
- port: 80
protocol: TCP
targetPort: 1445
selector:
app: api-docs
type: LoadBalancer
---
# Fyipe Backend Deployment
apiVersion: apps/v1
kind: Deployment
@@ -133,7 +200,7 @@ spec:
- name: STRIPE_PRIVATE_KEY
value: "sk_test_YxwnzywggtAd8jDaHecNmHiN"
- name: PORT
value: "3001"
value: "3002"
- name: MAIL_USER
value: "testmail@fyipe.com"
- name: MAIL_PASSWORD
@@ -150,9 +217,11 @@ spec:
value: "testmail@fyipe.com"
- name: EMAIL_VERIFY_TIME
value: "3600"
- name: MAIL_SECURE
value: "false"
ports:
- containerPort: 3001
hostPort: 3001
- containerPort: 3002
hostPort: 3002
name: backend
restartPolicy: Always
imagePullSecrets:
@@ -169,7 +238,7 @@ spec:
ports:
- port: 80
protocol: TCP
targetPort: 3001
targetPort: 3002
selector:
app: backend
type: LoadBalancer
@@ -198,6 +267,14 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "home"
- name: BACKEND_HOST
value: "backend"
- name: ACCOUNTS_HOST
value: "accounts"
- name: DASHBOARD_HOST
value: "dashboard"
ports:
- containerPort: 1444
hostPort: 1444
@@ -244,6 +321,14 @@ spec:
env:
- name: FYIPE_HOSTED
value: "true"
- name: HOST
value: "statuspage"
- name: BACKEND_HOST
value: "backend"
- name: ACCOUNTS_HOST
value: "accounts"
- name: DASHBOARD_HOST
value: "dashboard"
ports:
- containerPort: 3006
hostPort: 3006

View File

@@ -6,5 +6,7 @@ sudo sed -i '/backend/c\' /etc/hosts
echo $BACKEND_URL' backend' | sudo tee -a /etc/hosts
sudo sed -i '/home/c\' /etc/hosts
echo $HOME_URL' home' | sudo tee -a /etc/hosts
sudo sed -i '/statuspage/c\' /etc/hosts
echo $STATUSPAGE_URL' statuspage' | sudo tee -a /etc/hosts
sudo sed -i '/status-page/c\' /etc/hosts
echo $STATUSPAGE_URL' status-page' | sudo tee -a /etc/hosts
sudo sed -i '/api-docs/c\' /etc/hosts
echo $APIDOCS_URL' api-docs' | sudo tee -a /etc/hosts

101
smoke-test/accounts.test.js Normal file
View File

@@ -0,0 +1,101 @@
const puppeteer = require('puppeteer');
var should = require('should');
var utils = require('./test-utils');
var browser, page, userCredentials;
describe('Login API', () => {
beforeAll(async () => {
jest.setTimeout(15000);
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
// intercept request and mock response for login
await page.setRequestInterception(true);
await page.on('request', async (request) => {
if ((await request.url()).match(/user\/login/)) {
request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify(userCredentials)
});
} else {
request.continue();
}
});
await page.on('response', async (response) => {
try {
var res = await response.json();
if (res && res.tokens) {
userCredentials = res;
}
} catch (error) { }
});
});
afterAll(async () => {
await browser.close();
});
it('Should login valid User', async () => {
await page.goto(utils.ACCOUNTS_URL + '/register', { waitUntil: 'networkidle2' });
await page.waitForSelector('#email');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=name]');
await page.type('input[name=name]', utils.user.name);
await page.click('input[name=companyName]');
await page.type('input[name=companyName]', utils.user.company.name);
await page.click('input[name=companyPhoneNumber]');
await page.type('input[name=companyPhoneNumber]', utils.user.phone);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('input[name=confirmPassword]');
await page.type('input[name=confirmPassword]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
await page.waitForSelector('#cardName');
await page.click('input[name=cardName]');
await page.type('input[name=cardName]', utils.user.name);
await page.click('input[name=cardNumber]');
await page.type('input[name=cardNumber]', utils.user.card);
await page.click('input[name=cvc]');
await page.type('input[name=cvc]', utils.user.cvv);
await page.click('input[name=expiry]');
await page.type('input[name=expiry]', utils.user.expiryDate);
await page.click('input[name=address1]');
await page.type('input[name=address1]', utils.user.address.streetA);
await page.click('input[name=address2]');
await page.type('input[name=address2]', utils.user.address.streetB);
await page.click('input[name=city]');
await page.type('input[name=city]', utils.user.address.city);
await page.click('input[name=state]');
await page.type('input[name=state]', utils.user.address.state);
await page.click('input[name=zipCode]');
await page.type('input[name=zipCode]', utils.user.address.zipcode);
await page.select('#country', 'India');
await page.click('button[type=submit]');
await page.waitFor(15000);
await page.goto(utils.ACCOUNTS_URL + '/login');
await page.waitForSelector('#login-button');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
var localStorageData = await page.evaluate(() => {
var json = {};
for (var i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
json[key] = localStorage.getItem(key);
}
return json;
});
localStorageData.should.have.property('sessionID');
localStorageData.should.have.property('access_token');
localStorageData.should.have.property('email', utils.user.email);
page.url().should.containEql(utils.DASHBOARD_URL);
}, 160000);
})

View File

@@ -0,0 +1,25 @@
const utils= require('./test-utils');
const puppeteer = require('puppeteer');
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
})
afterAll(async () => {
await browser.close();
})
describe('Check api-docs up', () => {
test('should get title of api docs page', async () => {
await page.goto(utils.APIDOCS_URL, {
waitUntil: 'domcontentloaded'
});
const response = await page.$eval('head > title', (e) => {
return e.innerHTML;
});
expect(response).toBe('Fyipe API Documentation');
})
})

View File

@@ -0,0 +1,25 @@
const utils = require('./test-utils');
const puppeteer = require('puppeteer');
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
});
afterAll(async () => {
await browser.close();
});
describe('Check Backend', () => {
test('should get status ok from backend', async () => {
await page.goto(utils.BACKEND_URL, {
waitUntil: 'networkidle0'
});
const response = await page.$eval('body > pre', (e) => {
return e.innerHTML;
});
expect(response).toBe('{"status":200,"message":"Service Status - OK"}');
});
});

View File

@@ -0,0 +1,136 @@
const puppeteer = require('puppeteer');
var should = require('should');
var utils = require('./test-utils');
var browser, page, userCredentials;
describe('Monitor API', () => {
const operationTimeOut = 50000;
beforeAll(async () => {
jest.setTimeout(150000);
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
// intercept request and mock response for login
await page.setRequestInterception(true);
await page.on('request', async (request)=>{
if((await request.url()).match(/user\/login/)){
request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify(userCredentials)
});
}else{
request.continue();
}
});
await page.on('response', async (response)=>{
try{
const res = await response.json();
if(res && res.tokens){
userCredentials = res;
}
}catch(error){}
});
});
afterAll(async () => {
await browser.close();
});
it('Should login valid User', async () => {
await page.goto(utils.ACCOUNTS_URL + '/register', { waitUntil: 'networkidle2' });
await page.waitForSelector('#email');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=name]');
await page.type('input[name=name]', utils.user.name);
await page.click('input[name=companyName]');
await page.type('input[name=companyName]', utils.user.company.name);
await page.click('input[name=companyPhoneNumber]');
await page.type('input[name=companyPhoneNumber]', utils.user.phone);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('input[name=confirmPassword]');
await page.type('input[name=confirmPassword]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
await page.waitForSelector('#cardName');
await page.click('input[name=cardName]');
await page.type('input[name=cardName]', utils.user.name);
await page.click('input[name=cardNumber]');
await page.type('input[name=cardNumber]', utils.user.card);
await page.click('input[name=cvc]');
await page.type('input[name=cvc]', utils.user.cvv);
await page.click('input[name=expiry]');
await page.type('input[name=expiry]', utils.user.expiryDate);
await page.click('input[name=address1]');
await page.type('input[name=address1]', utils.user.address.streetA);
await page.click('input[name=address2]');
await page.type('input[name=address2]', utils.user.address.streetB);
await page.click('input[name=city]');
await page.type('input[name=city]', utils.user.address.city);
await page.click('input[name=state]');
await page.type('input[name=state]', utils.user.address.state);
await page.click('input[name=zipCode]');
await page.type('input[name=zipCode]', utils.user.address.zipcode);
await page.select('#country', 'India');
await page.click('button[type=submit]');
await page.waitFor(15000);
await page.goto(utils.ACCOUNTS_URL + '/login');
await page.waitForSelector('#login-button');
await page.click('input[name=email]');
await page.type('input[name=email]', utils.user.email);
await page.click('input[name=password]');
await page.type('input[name=password]', utils.user.password);
await page.click('button[type=submit]');
await page.waitFor(10000);
var localStorageData = await page.evaluate(() => {
var json = {};
for (var i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
json[key] = localStorage.getItem(key);
}
return json;
});
localStorageData.should.have.property('sessionID');
localStorageData.should.have.property('access_token');
localStorageData.should.have.property('email', utils.user.email);
page.url().should.containEql(utils.DASHBOARD_URL);
}, 160000);
it('Should create new monitor with correct details', async () => {
let monitorName = utils.generateRandomString();
await page.waitForSelector('#monitors');
await page.click('#monitors');
await page.waitForSelector('#frmNewMonitor');
await page.click('input[id=name]');
await page.type('input[id=name]', monitorName);
await page.select('select[name=type_1000]','url');
await page.waitForSelector('#url');
await page.click('#url');
await page.type('#url', 'https://google.com');
await page.click('button[type=submit]');
await page.waitFor(5000);
let spanElement;
spanElement = await page.$('span.ContentHeader-title.Text-color--dark.Text-display--inline.Text-fontSize--20.Text-fontWeight--regular.Text-lineHeight--28.Text-typeface--base.Text-wrap--wrap');
spanElement = await spanElement.getProperty('innerText');
spanElement = await spanElement.jsonValue();
spanElement.should.be.exactly(monitorName);
}, operationTimeOut);
it('Should delete monitor', async () => {
await page.waitForSelector('#name');
await page.evaluate(() => {
document.querySelector('div.Box-root div.db-Trends-header div.db-Trends-controls div button.bs-Button.bs-DeprecatedButton.db-Trends-editButton.bs-Button--icon.bs-Button--delete').click();
});
await page.evaluate(() => {
document.querySelector('button.bs-DeprecatedButton:nth-child(2)').click();
});
}, operationTimeOut);
});

129
smoke-test/home.test.js Executable file
View File

@@ -0,0 +1,129 @@
const puppeteer = require('puppeteer')
const util = require('./test-utils')
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(util.puppeteerLaunchConfig)
page = await browser.newPage()
})
afterAll(async () => {
await browser.close()
})
describe('Request demo', () => {
test('user can submit request a demo form', async () => {
await page.goto(`${util.HOME_URL}/enterprise/demo`)
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.type('#message', util.user.message)
await page.click('#request-demo-btn')
await page.waitForSelector('#success')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for website monitoring resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#website-monitoring')
await Promise.all([
page.waitForNavigation(),
page.click('#website-monitoring'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for speed equals revenue resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#speed-revenue')
await Promise.all([
page.waitForNavigation(),
page.click('#speed-revenue'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for best practices resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#best-practices')
await Promise.all([
page.waitForNavigation(),
page.click('#best-practices'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
test('user can request for peak performance resource', async () => {
await page.goto(`${util.HOME_URL}/enterprise/resources`)
await page.waitForSelector('#peak-performance')
await Promise.all([
page.waitForNavigation(),
page.click('#peak-performance'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', util.user.name)
await page.type('#email', util.user.email)
await page.type('#Phone', util.user.phone)
await page.type('#website', util.user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(util.user.email)
}, 30000)
})

View File

@@ -1,3 +0,0 @@
const smoketest = require('./smokeTest.test')
smoketest.smokeTest()

4475
smoke-test/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

18
smoke-test/package.json Normal file
View File

@@ -0,0 +1,18 @@
{
"name": "smoke-test",
"version": "1.0.0",
"description": "Smoke tests for fyipe",
"main": "index.test.js",
"scripts": {
"test": "jest --runInBand ."
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"faker": "^4.1.0",
"jest": "^24.7.1",
"puppeteer": "^1.17.0",
"should": "^13.2.3"
}
}

View File

@@ -1,215 +0,0 @@
module.exports = {
smokeTest: () => {
const faker = require('faker')
const puppeteer = require('puppeteer')
const user = {
name: faker.name.findName(),
email: faker.internet.email(),
website: 'www.testcompanyfyipe.com',
company: faker.company.companyName(),
companySize: 8,
message: faker.company.catchPhraseDescriptor(),
}
let page
let browser
const baseURL = 'http://localhost:1444'
// Enable for live viewing of tests.
/* beforeAll(async () => {
const width = 1200
const height = 720
browser = await puppeteer.launch(
{
headless: false,
slowMo: 60,
arg: [`--window-size=${width},${height}`],
},
)
page = await browser.newPage()
await page.setViewport({ width, height })
}) */
// Run this for headless testing with puppeteer.
beforeAll(async () => {
browser = await puppeteer.launch()
page = await browser.newPage()
})
afterAll(() => {
browser.close()
})
describe('Request demo', () => {
test('user can submit request a demo form', async () => {
await page.goto(`${baseURL}/enterprise/demo`)
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.type('#message', user.message)
await page.click('#request-demo-btn')
await page.waitForSelector('#success')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for website monitoring resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#website-monitoring')
await Promise.all([
page.waitForNavigation(),
page.click('#website-monitoring'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for speed equals revenue resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#speed-revenue')
await Promise.all([
page.waitForNavigation(),
page.click('#speed-revenue'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for best practices resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#best-practices')
await Promise.all([
page.waitForNavigation(),
page.click('#best-practices'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can request for peak performance resource', async () => {
await page.goto(`${baseURL}/enterprise/resources`)
await page.waitForSelector('#peak-performance')
await Promise.all([
page.waitForNavigation(),
page.click('#peak-performance'),
])
await page.waitForSelector('#form-section')
await page.type('#fullname', user.name)
await page.type('#email', user.email)
await page.type('#website', user.website)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#volume')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#request-resource-btn')
// Check if user's email is submitted successfully
const emailSubmitted = await page.evaluate(() => document.querySelector('.submitted-email').innerText)
expect(emailSubmitted).toBe(user.email)
}, 30000)
test('user can signup for a fyipe account and logout', async () => {
await page.goto(baseURL)
await page.waitForSelector('#create-account-top')
await Promise.all([
page.waitForNavigation(),
page.click('#create-account-top'),
])
await page.waitForSelector('#main-body')
await page.type('#email', user.email)
await page.type('#name', user.name)
await page.type('#password', user.password)
await page.type('#confirmPassword', user.password)
await page.click('#create-account-button')
await page.waitForSelector('#card-form')
await page.type('#cardName', user.name)
await page.type('#cardNumber', user.cardNumber)
await page.type('#cvv', user.cvv)
await page.type('#expiry', user.expiry)
await page.type('#address1', user.address1)
await page.type('#address2', user.address2)
await page.type('#city', user.city)
await page.type('#state', user.state)
await page.type('#zipCode', user.zipCode)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#create-account-button')
await page.waitForSelector('#companyName')
await page.type('#companyName', user.company)
await page.type('#companyRole', user.companyRole)
await page.click('#country')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.click('#companySize')
await page.keyboard.press('ArrowDown')
await page.keyboard.down('Enter')
await page.type('#companyPhoneNumber', user.companyPhoneNumber)
await page.type('#reference', user.reference)
await page.click('#create-account-button')
await page.waitForNavigation()
await page.click('#profile-menu')
await page.click('#logout-button')
await page.waitForSelector('#login')
}, 60000)
test('user can login to and logout of fyipe', async () => {
await page.goto(baseURL)
await page.waitForSelector('#sign-in')
await Promise.all([
page.waitForNavigation(),
page.click('#sign-in'),
])
await page.waitFor(5000)
await page.waitForSelector('#login')
await page.type('#email', user.email)
await page.type('#password', user.password)
await page.click('#login-button')
await page.waitForNavigation()
await page.click('#profile-menu')
await page.click('#logout-button')
await page.waitForSelector('#login')
}, 30000)
})
},
}

View File

@@ -0,0 +1,25 @@
const utils= require('./test-utils');
const puppeteer = require('puppeteer');
var page, browser;
beforeAll(async () => {
browser = await puppeteer.launch(utils.puppeteerLaunchConfig);
page = await browser.newPage();
})
afterAll(async () => {
await browser.close();
})
describe('Check status-page up', () => {
test('should load status page and show login screen', async () => {
await page.goto(utils.STATUSPAGE_URL, {
waitUntil: 'domcontentloaded'
});
const response = await page.$eval('#login-button > span', (e) => {
return e.innerHTML;
});
expect(response).toBe('Sign in to your account');
})
})

47
smoke-test/test-utils.js Normal file
View File

@@ -0,0 +1,47 @@
const faker = require('faker')
var user = faker.helpers.createCard();
user.email = generateRandomBusinessEmail();
user.password = generatePassword();
user.card = '4111111111111111';
user.cvv = '100';
user.expiryDate = '12/23';
user.message = 'Test message'
const puppeteerLaunchConfig = {
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
]
}
const HOME_URL = process.env.HOME_URL ? 'http://home:1444' : 'http://localhost:1444';
const ACCOUNTS_URL = process.env.ACCOUNTS_URL ? 'http://accounts:3003' : 'http://localhost:3003';
const DASHBOARD_URL = process.env.DASHBOARD_URL ? 'http://dashboard:3000' : 'http://localhost:3000';
const BACKEND_URL = process.env.BACKEND_URL ? 'http://backend:3002' : 'http://localhost:3002';
const STATUSPAGE_URL = process.env.STATUSPAGE_URL ? 'http://status-page:3006' : 'http://localhost:3006';
const APIDOCS_URL = process.env.APIDOCS_URL ? 'http://api-docs:1445' : 'http://localhost:1445';
function generateRandomBusinessEmail() {
return Math.random().toString(36).substring(8) + '@' + Math.random().toString(24).substring(8) + '.com'
}
function generatePassword() {
return Math.random().toString(36).substring(7);
}
function generateRandomString() {
return faker.lorem.word();
}
module.exports = {
HOME_URL,
ACCOUNTS_URL,
DASHBOARD_URL,
BACKEND_URL,
STATUSPAGE_URL,
APIDOCS_URL,
user,
puppeteerLaunchConfig,
generateRandomString
}