feat: utilize api-cli for e2e integration test

This commit is contained in:
Rainer Killinger
2020-04-14 12:56:37 +02:00
committed by Rainer Killinger
parent bbbe4d5f1f
commit ce06e735be
7 changed files with 943 additions and 876 deletions

View File

@@ -3,6 +3,7 @@ image: registry.gitlab.com/openstapps/projectmanagement/node
stages:
- build
- test
- audit
- publish
- deploy
@@ -16,15 +17,30 @@ build:
paths:
- node_modules/
test:
unit:
stage: test
dependencies:
- build
script:
- npm run test
- npm run test-unit
audit:
integration:
image: registry.gitlab.com/openstapps/projectmanagement/builder
stage: test
dependencies:
- build
variables:
DOCKER_DRIVER: overlay2
services:
- docker:dind
script:
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
- docker-compose -f integration-test.yml pull && docker-compose -f integration-test.yml up --abort-on-container-exit --exit-code-from apicli
tags:
- docker
audit:
stage: audit
dependencies:
- build
script:
@@ -45,13 +61,13 @@ pages:
- public
scheduled-audit:
stage: test
stage: audit
script:
- npm audit
only:
- schedules
test:ci:
ci:
stage: test
dependencies:
- build

26
integration-test.yml Normal file
View File

@@ -0,0 +1,26 @@
version: '3'
services:
backend:
ports:
- "3000:3000"
build: .
environment:
STAPPS_LOG_LEVEL: "31"
STAPPS_EXIT_LEVEL: "8"
NODE_CONFIG_ENV: "elasticsearch"
NODE_ENV: "integration-test"
ALLOW_NO_TRANSPORT: "true"
ES_FORCE_MAPPING_UPDATE: "true"
ES_ADDR: "http://elasticsearch:9200"
elasticsearch:
ports:
- "9200:9200"
image: "registry.gitlab.com/openstapps/database:master"
apicli:
image: "registry.gitlab.com/openstapps/api/cli:latest"
environment:
STAPPS_LOG_LEVEL: "31"
STAPPS_EXIT_LEVEL: "8"
command: e2e http://backend:3000 --waiton tcp:backend:3000

1727
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -25,8 +25,10 @@
"preversion": "npm run prepublishOnly",
"push": "git push && git push origin \"v$npm_package_version\"",
"start": "NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true node ./lib/cli.js",
"start-debug": "NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true ES_FORCE_MAPPING_UPDATE=true node ./lib/cli.js --require ts-node/register",
"test": "env NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true ES_FORCE_MAPPING_UPDATE=true nyc mocha --require ts-node/register --exit 'test/**/*.spec.ts'",
"start-debug": "STAPPS_LOG_LEVEL=31 NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true ES_FORCE_MAPPING_UPDATE=true node ./lib/cli.js --require ts-node/register",
"test": "npm run test-unit && npm run test-integration",
"test-unit": "env NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true ES_FORCE_MAPPING_UPDATE=true nyc mocha --require ts-node/register --exit 'test/**/*.spec.ts'",
"test-integration": "sudo docker-compose -f integration-test.yml pull && sudo docker-compose -f integration-test.yml up --build --abort-on-container-exit --exit-code-from apicli",
"tslint": "tslint -p tsconfig.json -c tslint.json 'src/**/*.ts'"
},
"dependencies": {

View File

@@ -44,8 +44,29 @@ import {Elasticsearch} from './storage/elasticsearch/elasticsearch';
* Configure the backend
*/
export async function configureApp(app: Express) {
let integrationTestTimeout: NodeJS.Timeout;
// request loggers have to be the first middleware to be set in express
app.use(morgan('dev'));
app.use(morgan('dev', {
skip: (_req, res) => {
if (process.env.NODE_ENV === 'integration-test') {
clearTimeout(integrationTestTimeout);
integrationTestTimeout = setTimeout(() => {
process.exit(1);
},
// tslint:disable-next-line:no-magic-numbers
20000);
return false;
}
// tslint:disable-next-line: no-magic-numbers
if (res.statusCode < 400) {
return true;
}
return false;
}, stream: process.stdout,
}));
const corsOptions = {
allowedHeaders: [

View File

@@ -34,9 +34,8 @@ app.set('port', port);
const server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
* Define server handling for specific events
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
@@ -101,6 +100,8 @@ function onListening() {
configureApp(app)
.then(() => {
Logger.ok('Sucessfully configured express server');
// After app setup listen on provided port, on all network interfaces
server.listen(port);
})
.catch((err) => {
throw err;

View File

@@ -84,7 +84,7 @@ export function createRoute<REQUESTTYPE, RETURNTYPE>(
);
res.status(error.statusCode);
res.json(error);
Logger.warn(error);
await Logger.error(error);
return;
}
@@ -108,7 +108,7 @@ export function createRoute<REQUESTTYPE, RETURNTYPE>(
);
res.status(internalServerError.statusCode);
res.json(internalServerError);
Logger.warn(internalServerError);
await Logger.error(internalServerError);
return;
}
@@ -124,7 +124,7 @@ export function createRoute<REQUESTTYPE, RETURNTYPE>(
// respond with the error from the handler
res.status(error.statusCode);
res.json(error);
Logger.warn(error);
await Logger.error(error);
} else {
// the error is not allowed so something went wrong
const internalServerError = new SCInternalServerErrorResponse(