Compare commits

...

14 Commits

Author SHA1 Message Date
02dbe602b2 1.0.20 2019-04-08 17:52:41 +02:00
e17d7009d9 fix(core): update 2019-04-08 17:52:41 +02:00
d22534388d 1.0.19 2019-04-08 17:50:57 +02:00
e258b2d62e fix(core): update 2019-04-08 17:50:57 +02:00
5afe6e6981 1.0.18 2018-12-06 01:03:49 +01:00
5d071d0299 fix(core): update 2018-12-06 01:03:48 +01:00
180bfcb353 1.0.17 2018-12-06 00:56:36 +01:00
3161e6b4eb fix(core): update 2018-12-06 00:56:36 +01:00
6129388a20 1.0.16 2018-12-06 00:38:03 +01:00
8f0cfe1a06 fix(core): update 2018-12-06 00:38:03 +01:00
39926fb08b 1.0.15 2018-08-14 00:04:43 +02:00
36594b64f2 fix(dependencies): update 2018-08-14 00:04:42 +02:00
9f898b6579 1.0.14 2018-08-13 23:58:51 +02:00
b1725b636b fix(improve test handling): now failing correctly and with better log output 2018-08-13 23:58:50 +02:00
12 changed files with 909 additions and 360 deletions

View File

@ -26,6 +26,7 @@ mirror:
snyk: snyk:
stage: security stage: security
script: script:
- npmci npm prepare
- npmci command npm install -g snyk - npmci command npm install -g snyk
- npmci command npm install --ignore-scripts - npmci command npm install --ignore-scripts
- npmci command snyk test - npmci command snyk test
@ -36,21 +37,11 @@ snyk:
# ==================== # ====================
# test stage # test stage
# ==================== # ====================
testLEGACY:
stage: test
script:
- npmci node install legacy
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
allow_failure: true
testLTS: testLTS:
stage: test stage: test
script: script:
- npmci npm prepare
- npmci node install lts - npmci node install lts
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
@ -62,6 +53,7 @@ testLTS:
testSTABLE: testSTABLE:
stage: test stage: test
script: script:
- npmci npm prepare
- npmci node install stable - npmci node install stable
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
@ -118,6 +110,7 @@ pages:
stage: metadata stage: metadata
script: script:
- npmci command npm install -g typedoc typescript - npmci command npm install -g typedoc typescript
- npmci npm prepare
- npmci npm install - npmci npm install
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/ - npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/
tags: tags:
@ -130,13 +123,3 @@ pages:
paths: paths:
- public - public
allow_failure: true allow_failure: true
windowsCompatibility:
image: stefanscherer/node-windows:10-build-tools
stage: metadata
script:
- npm install & npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- windows
allow_failure: true

3
contribute.md Normal file
View File

@ -0,0 +1,3 @@
# How to contribute
Start with `tstest.classes.tstest.ts` to understand whats happening

View File

@ -2,5 +2,15 @@
"npmci": { "npmci": {
"npmGlobalTools": [], "npmGlobalTools": [],
"npmAccessLevel": "public" "npmAccessLevel": "public"
},
"gitzone": {
"module": {
"githost": "gitlab.com",
"gitscope": "gitzone",
"gitrepo": "tstest",
"shortDescription": "a test utility to run tests that match test/**/*.ts",
"npmPackagename": "@gitzone/tstest",
"license": "MIT"
}
} }
} }

1051
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "@gitzone/tstest", "name": "@gitzone/tstest",
"version": "1.0.13", "version": "1.0.20",
"private": false, "private": false,
"description": "a test utility to run tests that match test/**/*.ts", "description": "a test utility to run tests that match test/**/*.ts",
"main": "dist/index.js", "main": "dist/index.js",
@ -19,16 +19,16 @@
"build": "(tsbuild)" "build": "(tsbuild)"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.0.21", "@gitzone/tsbuild": "^2.1.8",
"@pushrocks/tapbundle": "^3.0.1" "@pushrocks/tapbundle": "^3.0.7"
}, },
"dependencies": { "dependencies": {
"@gitzone/tsrun": "^1.1.11", "@gitzone/tsrun": "^1.2.5",
"@pushrocks/consolecolor": "^2.0.1", "@pushrocks/consolecolor": "^2.0.1",
"@pushrocks/smartfile": "^6.0.6", "@pushrocks/smartfile": "^7.0.2",
"@pushrocks/smartlog": "^2.0.1", "@pushrocks/smartlog": "^2.0.19",
"@pushrocks/smartpromise": "^2.0.5", "@pushrocks/smartpromise": "^3.0.2",
"@pushrocks/smartshell": "^2.0.6", "@pushrocks/smartshell": "^2.0.13",
"@types/figures": "^2.0.0", "@types/figures": "^2.0.0",
"figures": "^2.0.0" "figures": "^2.0.0"
} }

26
readme.md Normal file
View File

@ -0,0 +1,26 @@
# @gitzone/tstest
a test utility to run tests that match test/**/*.ts
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@gitzone/tstest)
* [gitlab.com (source)](https://gitlab.com/gitzone/tstest)
* [github.com (source mirror)](https://github.com/gitzone/tstest)
* [docs (typedoc)](https://gitzone.gitlab.io/tstest/)
## Status for master
[![build status](https://gitlab.com/gitzone/tstest/badges/master/build.svg)](https://gitlab.com/gitzone/tstest/commits/master)
[![coverage report](https://gitlab.com/gitzone/tstest/badges/master/coverage.svg)](https://gitlab.com/gitzone/tstest/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@gitzone/tstest.svg)](https://www.npmjs.com/package/@gitzone/tstest)
[![Known Vulnerabilities](https://snyk.io/test/npm/@gitzone/tstest/badge.svg)](https://snyk.io/test/npm/@gitzone/tstest)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com)

View File

@ -4,7 +4,7 @@
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins';
import { coloredString as cs } from '@pushrocks/consolecolor'; import { coloredString as cs } from '@pushrocks/consolecolor';
import { TapParser } from './tstest.tap.parser'; import { TapParser } from './tstest.classes.tap.parser';
import * as logPrefixes from './tstest.logprefixes'; import * as logPrefixes from './tstest.logprefixes';
export class TapCombinator { export class TapCombinator {
@ -14,35 +14,35 @@ export class TapCombinator {
} }
evaluate() { evaluate() {
console.log(`${logPrefixes.TsTestPrefix} Ran ${this.tapParserStore.length} Testfiles!`); console.log(
console.log(`${logPrefixes.TsTestPrefix} Here are the overall results:`); `${logPrefixes.TsTestPrefix} RESULTS FOR ${this.tapParserStore.length} TESTFILE(S):`
);
let failGlobal = false; // determine wether tstest should fail let failGlobal = false; // determine wether tstest should fail
for (const tapParser of this.tapParserStore) { for (const tapParser of this.tapParserStore) {
if(tapParser.getErrorTests().length === 0) { if (tapParser.getErrorTests().length === 0) {
console.log( let overviewString =
logPrefixes.TsTestPrefix + logPrefixes.TsTestPrefix +
cs(` ${tapParser.fileName} ${plugins.figures.tick}`, 'green') + cs(` ${tapParser.fileName} ${plugins.figures.tick}`, 'green') +
' | ' + ` ${plugins.figures.pointer} ` +
cs(` all tests completed successfully!`, 'blue') tapParser.getTestOverviewAsString();
) console.log(overviewString);
} else { } else {
console.log( let overviewString =
logPrefixes.TsTestPrefix + logPrefixes.TsTestPrefix +
cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') + cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') +
' | ' + ` ${plugins.figures.pointer} ` +
cs(` Errors ocurred, please check for the logs!`, 'blue') tapParser.getTestOverviewAsString();
); console.log(overviewString);
failGlobal = true; failGlobal = true;
} }
} }
console.log(cs('-'.repeat(16), 'cyan')); console.log(cs(plugins.figures.hamburger.repeat(48), 'cyan'));
console.log(cs('*'.repeat(16), 'cyan')); if (!failGlobal) {
console.log(cs('-'.repeat(16), 'cyan')); console.log(cs('FINAL RESULT: SUCCESS!', 'green'));
if(!failGlobal) {
console.log(cs('Ending with code 0: TESTS ARE PASSING!', 'green'));
} else { } else {
console.log(cs('Ending with code 1: TESTS ARE FAILING!', 'red')); console.log(cs('FINAL RESULT: FAIL!', 'red'));
process.exit(1);
} }
} }
} }

View File

@ -5,13 +5,13 @@ import { coloredString as cs } from '@pushrocks/consolecolor';
// combines different tap test files to an overall result // combines different tap test files to an overall result
// ============ // ============
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins';
import { TapTestResult } from './tstest.tap.testresult'; import { TapTestResult } from './tstest.classes.tap.testresult';
import * as logPrefixes from './tstest.logprefixes'; import * as logPrefixes from './tstest.logprefixes';
export class TapParser { export class TapParser {
testStore: TapTestResult[] = []; testStore: TapTestResult[] = [];
expectedTestsRegex = /([0-9]*)\.\.([0-9]*)/; expectedTestsRegex = /([0-9]*)\.\.([0-9]*)$/;
expectedTests: number; expectedTests: number;
receivedTests: number; receivedTests: number;
@ -23,7 +23,6 @@ export class TapParser {
*/ */
constructor(public fileName: string) {} constructor(public fileName: string) {}
private _getNewTapTestResult() { private _getNewTapTestResult() {
this.activeTapTestResult = new TapTestResult(this.testStore.length + 1); this.activeTapTestResult = new TapTestResult(this.testStore.length + 1);
} }
@ -45,10 +44,7 @@ export class TapParser {
const regexResult = this.expectedTestsRegex.exec(logLine); const regexResult = this.expectedTestsRegex.exec(logLine);
this.expectedTests = parseInt(regexResult[2]); this.expectedTests = parseInt(regexResult[2]);
console.log( console.log(
`${logPrefixes.TapPrefix} ${cs( `${logPrefixes.TapPrefix} ${cs(`Expecting ${this.expectedTests} tests!`, 'blue')}`
`Expecting ${this.expectedTests} tests!`,
'blue'
)}`
); );
// initiating first TapResult // initiating first TapResult
@ -70,9 +66,7 @@ export class TapParser {
// test for protocol error // test for protocol error
if (testId !== this.activeTapTestResult.id) { if (testId !== this.activeTapTestResult.id) {
console.log( console.log(
`${ `${logPrefixes.TapErrorPrefix} Something is strange! Test Ids are not equal!`
logPrefixes.TapErrorPrefix
} Something is strange! Test Ids are not equal!`
); );
} }
this.activeTapTestResult.setTestResult(testOk); this.activeTapTestResult.setTestResult(testOk);
@ -80,14 +74,14 @@ export class TapParser {
if (testOk) { if (testOk) {
console.log( console.log(
logPrefixes.TapPrefix, logPrefixes.TapPrefix,
`${cs(`T${testId} ${plugins.figures.tick}`, 'green')} | ` + `${cs(`T${testId} ${plugins.figures.tick}`, 'green')} ${plugins.figures.arrowRight} ` +
cs(testSubject, 'blue') + cs(testSubject, 'blue') +
` | ${cs(`${testDuration} ms`, 'orange')}` ` | ${cs(`${testDuration} ms`, 'orange')}`
); );
} else { } else {
console.log( console.log(
logPrefixes.TapPrefix, logPrefixes.TapPrefix,
`${cs(`T${testId} ${plugins.figures.cross}`, 'red')} | ` + `${cs(`T${testId} ${plugins.figures.cross}`, 'red')} ${plugins.figures.arrowRight} ` +
cs(testSubject, 'blue') + cs(testSubject, 'blue') +
` | ${cs(`${testDuration} ms`, 'orange')}` ` | ${cs(`${testDuration} ms`, 'orange')}`
); );
@ -124,6 +118,28 @@ export class TapParser {
}); });
} }
/**
* returns a test overview as string
*/
getTestOverviewAsString() {
let overviewString = '';
for (let test of this.testStore) {
if (overviewString !== '') {
overviewString += ' | ';
}
if (test.testOk) {
overviewString += cs(`T${test.id} ${plugins.figures.tick}`, 'green');
} else {
overviewString += cs(`T${test.id} ${plugins.figures.cross}`, 'red');
}
}
return overviewString;
}
/**
* handles a tap process
* @param childProcessArg
*/
async handleTapProcess(childProcessArg: ChildProcess) { async handleTapProcess(childProcessArg: ChildProcess) {
const done = plugins.smartpromise.defer(); const done = plugins.smartpromise.defer();
childProcessArg.stdout.on('data', data => { childProcessArg.stdout.on('data', data => {
@ -139,29 +155,20 @@ export class TapParser {
if (this.expectedTests === this.receivedTests) { if (this.expectedTests === this.receivedTests) {
console.log( console.log(
`${logPrefixes.TapPrefix} ${cs( `${logPrefixes.TapPrefix} ${cs(
`${this.receivedTests} out of ${ `${this.receivedTests} out of ${this.expectedTests} Tests completed!`,
this.expectedTests
} Tests completed!`,
'green' 'green'
)}` )}`
); );
} else { } else {
console.log( console.log(
`${logPrefixes.TapErrorPrefix} ${cs( `${logPrefixes.TapErrorPrefix} ${cs(
`Only ${this.receivedTests} out of ${ `Only ${this.receivedTests} out of ${this.expectedTests} completed!`,
this.expectedTests
} completed!`,
'red' 'red'
)}` )}`
); );
} }
if (this.getErrorTests().length === 0) { if (this.getErrorTests().length === 0) {
console.log( console.log(`${logPrefixes.TapPrefix} ${cs(`All tests are successfull!!!`, 'green')}`);
`${logPrefixes.TapPrefix} ${cs(
`All tests are successfull!!!`,
'green'
)}`
);
} else { } else {
console.log( console.log(
`${logPrefixes.TapPrefix} ${cs( `${logPrefixes.TapPrefix} ${cs(

View File

@ -3,9 +3,9 @@ import * as paths from './tstest.paths';
import { Smartfile } from '@pushrocks/smartfile'; import { Smartfile } from '@pushrocks/smartfile';
// tap related stuff // tap related stuff
import { TapCombinator } from './tstest.tap.combinator'; import { TapCombinator } from './tstest.classes.tap.combinator';
import { TapParser } from './tstest.tap.parser'; import { TapParser } from './tstest.classes.tap.parser';
import { TapTestResult } from './tstest.tap.testresult'; import { TapTestResult } from './tstest.classes.tap.testresult';
export class TestDirectory { export class TestDirectory {
/** /**

View File

@ -5,8 +5,8 @@ import * as logPrefixes from './tstest.logprefixes';
import { coloredString as cs } from '@pushrocks/consolecolor'; import { coloredString as cs } from '@pushrocks/consolecolor';
import { TestDirectory } from './tstest.classes.testdirectory'; import { TestDirectory } from './tstest.classes.testdirectory';
import { TapCombinator } from './tstest.tap.combinator'; import { TapCombinator } from './tstest.classes.tap.combinator';
import { TapParser } from './tstest.tap.parser'; import { TapParser } from './tstest.classes.tap.parser';
export class TsTest { export class TsTest {
testDir: TestDirectory; testDir: TestDirectory;
@ -17,11 +17,13 @@ export class TsTest {
async run() { async run() {
const fileNamesToRun: string[] = await this.testDir.getTestFilePathArray(); const fileNamesToRun: string[] = await this.testDir.getTestFilePathArray();
console.log(`${logPrefixes.TsTestPrefix} Found ${fileNamesToRun.length} Testfile(s):`); console.log(cs(plugins.figures.hamburger.repeat(80), 'cyan'));
console.log('');
console.log(`${logPrefixes.TsTestPrefix} FOUND ${fileNamesToRun.length} TESTFILE(S):`);
for (const fileName of fileNamesToRun) { for (const fileName of fileNamesToRun) {
console.log(`${logPrefixes.TsTestPrefix} ${cs(fileName, 'orange')}`); console.log(`${logPrefixes.TsTestPrefix} ${cs(fileName, 'orange')}`);
} }
console.log('-'.repeat(16)); console.log('-'.repeat(48));
console.log(''); // force new line console.log(''); // force new line
const smartshellInstance = new plugins.smartshell.Smartshell({ const smartshellInstance = new plugins.smartshell.Smartshell({
executor: 'bash', executor: 'bash',
@ -33,7 +35,16 @@ export class TsTest {
console.log(`${cs('=> ', 'blue')} Running ${cs(fileName, 'orange')}`); console.log(`${cs('=> ', 'blue')} Running ${cs(fileName, 'orange')}`);
console.log(cs(`=`.repeat(16), 'cyan')); console.log(cs(`=`.repeat(16), 'cyan'));
const tapParser = new TapParser(fileName); const tapParser = new TapParser(fileName);
const execResultStreaming = await smartshellInstance.execStreamingSilent(`tsrun ${fileName}`);
// tsrun options
let tsrunOptions = '';
if (process.argv.includes('--web')) {
tsrunOptions += ' --web';
}
const execResultStreaming = await smartshellInstance.execStreamingSilent(
`tsrun ${fileName}${tsrunOptions}`
);
await tapParser.handleTapProcess(execResultStreaming.childProcess); await tapParser.handleTapProcess(execResultStreaming.childProcess);
console.log(cs(`^`.repeat(16), 'cyan')); console.log(cs(`^`.repeat(16), 'cyan'));
console.log(''); // force new line console.log(''); // force new line

View File

@ -1,3 +1,17 @@
{ {
"extends": "tslint-config-standard" "extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
} }