@git.zone/tstest 1.5.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.js +9 -2
- package/dist_ts/tstest.classes.tap.parser.d.ts +4 -0
- package/dist_ts/tstest.classes.tap.parser.js +114 -24
- package/dist_ts/tstest.classes.testdirectory.d.ts +10 -0
- package/dist_ts/tstest.classes.testdirectory.js +31 -1
- package/dist_ts/tstest.classes.tstest.d.ts +3 -1
- package/dist_ts/tstest.classes.tstest.js +52 -27
- package/dist_ts_tapbundle/index.d.ts +1 -0
- package/dist_ts_tapbundle/index.js +2 -1
- package/dist_ts_tapbundle/tapbundle.classes.tap.d.ts +54 -1
- package/dist_ts_tapbundle/tapbundle.classes.tap.js +288 -24
- package/dist_ts_tapbundle/tapbundle.classes.taptest.d.ts +7 -1
- package/dist_ts_tapbundle/tapbundle.classes.taptest.js +75 -27
- package/dist_ts_tapbundle/tapbundle.classes.taptools.d.ts +81 -1
- package/dist_ts_tapbundle/tapbundle.classes.taptools.js +180 -2
- package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_tapbundle/ts_tapbundle/00_commitinfo_data.js +9 -0
- package/dist_ts_tapbundle/ts_tapbundle/index.d.ts +6 -0
- package/dist_ts_tapbundle/ts_tapbundle/index.js +7 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.d.ts +10 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.pretask.js +13 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.d.ts +104 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tap.js +401 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.d.ts +8 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.classes.tapwrap.js +7 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.plugins.js +10 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
- package/dist_ts_tapbundle/ts_tapbundle/tapbundle.tapcreator.js +5 -0
- package/dist_ts_tapbundle/ts_tapbundle/webhelpers.d.ts +7 -0
- package/dist_ts_tapbundle/ts_tapbundle/webhelpers.js +35 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/classes.pathinject.js +13 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/plugins.d.ts +11 -0
- package/dist_ts_tapbundle/ts_tapbundle_node/plugins.js +14 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.d.ts +38 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptest.js +110 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.d.ts +109 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.classes.taptools.js +241 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.d.ts +8 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.plugins.js +10 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
- package/dist_ts_tapbundle_node/ts_tapbundle/tapbundle.tapcreator.js +5 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.d.ts +5 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.pathinject.js +13 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.d.ts +25 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.tapnodetools.js +81 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.d.ts +6 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/classes.testfileprovider.js +16 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/index.d.ts +2 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/index.js +3 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.d.ts +2 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/paths.js +4 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.d.ts +11 -0
- package/dist_ts_tapbundle_node/ts_tapbundle_node/plugins.js +14 -0
- package/package.json +11 -8
- package/readme.plan.md +253 -30
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +8 -1
- package/ts/tstest.classes.tap.parser.ts +111 -25
- package/ts/tstest.classes.testdirectory.ts +39 -0
- package/ts/tstest.classes.tstest.ts +61 -27
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as plugins from './tapbundle.plugins.js';
|
|
2
2
|
import { tapCreator } from './tapbundle.tapcreator.js';
|
|
3
|
-
import { TapTools } from './tapbundle.classes.taptools.js';
|
|
3
|
+
import { TapTools, SkipError } from './tapbundle.classes.taptools.js';
|
|
4
4
|
// imported interfaces
|
|
5
5
|
import { Deferred } from '@push.rocks/smartpromise';
|
|
6
6
|
import { HrtMeasurement } from '@push.rocks/smarttime';
|
|
@@ -9,6 +9,9 @@ export class TapTest {
|
|
|
9
9
|
* constructor
|
|
10
10
|
*/
|
|
11
11
|
constructor(optionsArg) {
|
|
12
|
+
this.isTodo = false;
|
|
13
|
+
this.tags = [];
|
|
14
|
+
this.priority = 'medium';
|
|
12
15
|
this.testDeferred = plugins.smartpromise.defer();
|
|
13
16
|
this.testPromise = this.testDeferred.promise;
|
|
14
17
|
this.testResultDeferred = plugins.smartpromise.defer();
|
|
@@ -24,39 +27,84 @@ export class TapTest {
|
|
|
24
27
|
* run the test
|
|
25
28
|
*/
|
|
26
29
|
async run(testKeyArg) {
|
|
27
|
-
this.hrtMeasurement.start();
|
|
28
30
|
this.testKey = testKeyArg;
|
|
29
31
|
const testNumber = testKeyArg + 1;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
this.hrtMeasurement.stop();
|
|
36
|
-
console.log(`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
|
|
32
|
+
// Handle todo tests
|
|
33
|
+
if (this.isTodo) {
|
|
34
|
+
const todoText = this.todoReason ? `# TODO ${this.todoReason}` : '# TODO';
|
|
35
|
+
console.log(`ok ${testNumber} - ${this.description} ${todoText}`);
|
|
37
36
|
this.status = 'success';
|
|
38
37
|
this.testDeferred.resolve(this);
|
|
39
|
-
|
|
38
|
+
return;
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
this.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
40
|
+
// Run test with retries
|
|
41
|
+
let lastError;
|
|
42
|
+
const maxRetries = this.tapTools.maxRetries;
|
|
43
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
44
|
+
this.hrtMeasurement.start();
|
|
45
|
+
try {
|
|
46
|
+
// Set up timeout if specified
|
|
47
|
+
let timeoutHandle;
|
|
48
|
+
let timeoutPromise = null;
|
|
49
|
+
if (this.timeoutMs) {
|
|
50
|
+
timeoutPromise = new Promise((_, reject) => {
|
|
51
|
+
timeoutHandle = setTimeout(() => {
|
|
52
|
+
this.status = 'timeout';
|
|
53
|
+
reject(new Error(`Test timed out after ${this.timeoutMs}ms`));
|
|
54
|
+
}, this.timeoutMs);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Run the test function with potential timeout
|
|
58
|
+
const testPromise = this.testFunction(this.tapTools);
|
|
59
|
+
const testReturnValue = timeoutPromise
|
|
60
|
+
? await Promise.race([testPromise, timeoutPromise])
|
|
61
|
+
: await testPromise;
|
|
62
|
+
// Clear timeout if test completed
|
|
63
|
+
if (timeoutHandle) {
|
|
64
|
+
clearTimeout(timeoutHandle);
|
|
65
|
+
}
|
|
66
|
+
this.hrtMeasurement.stop();
|
|
67
|
+
console.log(`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
|
|
68
|
+
this.status = 'success';
|
|
69
|
+
this.testDeferred.resolve(this);
|
|
70
|
+
this.testResultDeferred.resolve(testReturnValue);
|
|
71
|
+
return; // Success, exit retry loop
|
|
53
72
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
73
|
+
catch (err) {
|
|
74
|
+
this.hrtMeasurement.stop();
|
|
75
|
+
// Handle skip
|
|
76
|
+
if (err instanceof SkipError || err.name === 'SkipError') {
|
|
77
|
+
console.log(`ok ${testNumber} - ${this.description} # SKIP ${err.message.replace('Skipped: ', '')}`);
|
|
78
|
+
this.status = 'skipped';
|
|
79
|
+
this.testDeferred.resolve(this);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
lastError = err;
|
|
83
|
+
// If we have retries left, try again
|
|
84
|
+
if (attempt < maxRetries) {
|
|
85
|
+
console.log(`# Retry ${attempt + 1}/${maxRetries} for test: ${this.description}`);
|
|
86
|
+
this.tapTools._incrementRetryCount();
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Final failure
|
|
90
|
+
console.log(`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
|
|
91
|
+
this.testDeferred.resolve(this);
|
|
92
|
+
this.testResultDeferred.resolve(err);
|
|
93
|
+
// if the test has already succeeded before
|
|
94
|
+
if (this.status === 'success') {
|
|
95
|
+
this.status = 'errorAfterSuccess';
|
|
96
|
+
console.log('!!! ALERT !!!: weird behaviour, since test has been already successfull');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.status = 'error';
|
|
100
|
+
}
|
|
101
|
+
// if the test is allowed to fail
|
|
102
|
+
if (this.failureAllowed) {
|
|
103
|
+
console.log(`please note: failure allowed!`);
|
|
104
|
+
}
|
|
105
|
+
console.log(err);
|
|
57
106
|
}
|
|
58
|
-
console.log(err);
|
|
59
107
|
}
|
|
60
108
|
}
|
|
61
109
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy50YXB0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdEUsc0JBQXNCO0FBQ3RCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTdkQsTUFBTSxPQUFPLE9BQU87SUFtQmxCOztPQUVHO0lBQ0gsWUFBWSxVQUlYO1FBaEJNLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFeEIsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUNwQixhQUFRLEdBQThCLFFBQVEsQ0FBQztRQUU5QyxpQkFBWSxHQUF5QixPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25FLGdCQUFXLEdBQXdCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQzVELHVCQUFrQixHQUFnQixPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hFLHNCQUFpQixHQUFlLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFTckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDeEIsSUFBSSxD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
|
|
@@ -3,25 +3,105 @@ import { TapTest } from './tapbundle.classes.taptest.js';
|
|
|
3
3
|
export interface IPromiseFunc {
|
|
4
4
|
(): Promise<any>;
|
|
5
5
|
}
|
|
6
|
+
export declare class SkipError extends Error {
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
6
9
|
export declare class TapTools {
|
|
7
10
|
/**
|
|
8
11
|
* the referenced TapTest
|
|
9
12
|
*/
|
|
10
13
|
private _tapTest;
|
|
14
|
+
private _retries;
|
|
15
|
+
private _retryCount;
|
|
16
|
+
testData: any;
|
|
17
|
+
private static _sharedContext;
|
|
18
|
+
private _snapshotPath;
|
|
11
19
|
constructor(TapTestArg: TapTest<any>);
|
|
12
20
|
/**
|
|
13
21
|
* allow failure
|
|
14
22
|
*/
|
|
15
23
|
allowFailure(): void;
|
|
24
|
+
/**
|
|
25
|
+
* skip the rest of the test
|
|
26
|
+
*/
|
|
27
|
+
skip(reason?: string): never;
|
|
28
|
+
/**
|
|
29
|
+
* conditionally skip the rest of the test
|
|
30
|
+
*/
|
|
31
|
+
skipIf(condition: boolean, reason?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* mark test as todo
|
|
34
|
+
*/
|
|
35
|
+
todo(reason?: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* set the number of retries for this test
|
|
38
|
+
*/
|
|
39
|
+
retry(count: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* get the current retry count
|
|
42
|
+
*/
|
|
43
|
+
get retryCount(): number;
|
|
44
|
+
/**
|
|
45
|
+
* internal: increment retry count
|
|
46
|
+
*/
|
|
47
|
+
_incrementRetryCount(): void;
|
|
48
|
+
/**
|
|
49
|
+
* get the maximum retries
|
|
50
|
+
*/
|
|
51
|
+
get maxRetries(): number;
|
|
16
52
|
/**
|
|
17
53
|
* async/await delay method
|
|
18
54
|
*/
|
|
19
55
|
delayFor(timeMilliArg: number): Promise<void>;
|
|
20
56
|
delayForRandom(timeMilliMinArg: number, timeMilliMaxArg: number): Promise<void>;
|
|
21
57
|
coloredString(...args: Parameters<typeof plugins.consolecolor.coloredString>): Promise<string>;
|
|
22
|
-
|
|
58
|
+
/**
|
|
59
|
+
* set a timeout for the test
|
|
60
|
+
*/
|
|
61
|
+
timeout(timeMilliArg: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* wait for a timeout (used internally)
|
|
64
|
+
*/
|
|
65
|
+
waitForTimeout(timeMilliArg: number): Promise<void>;
|
|
23
66
|
returnError(throwingFuncArg: IPromiseFunc): Promise<Error>;
|
|
24
67
|
defer(): plugins.smartpromise.Deferred<unknown>;
|
|
25
68
|
cumulativeDefer(): plugins.smartpromise.CumulativeDeferred;
|
|
26
69
|
smartjson: typeof plugins.smartjson;
|
|
70
|
+
/**
|
|
71
|
+
* shared context for data sharing between tests
|
|
72
|
+
*/
|
|
73
|
+
context: {
|
|
74
|
+
get: (key: string) => any;
|
|
75
|
+
set: (key: string, value: any) => void;
|
|
76
|
+
delete: (key: string) => boolean;
|
|
77
|
+
clear: () => void;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Snapshot testing - compares output with saved snapshot
|
|
81
|
+
*/
|
|
82
|
+
matchSnapshot(value: any, snapshotName?: string): Promise<unknown>;
|
|
83
|
+
/**
|
|
84
|
+
* Test fixtures - create test data instances
|
|
85
|
+
*/
|
|
86
|
+
private static _fixtureData;
|
|
87
|
+
private static _fixtureFactories;
|
|
88
|
+
/**
|
|
89
|
+
* Define a fixture factory
|
|
90
|
+
*/
|
|
91
|
+
static defineFixture<T>(name: string, factory: (data?: Partial<T>) => T | Promise<T>): void;
|
|
92
|
+
/**
|
|
93
|
+
* Create a fixture instance
|
|
94
|
+
*/
|
|
95
|
+
fixture<T>(name: string, data?: Partial<T>): Promise<T>;
|
|
96
|
+
/**
|
|
97
|
+
* Factory pattern for creating multiple fixtures
|
|
98
|
+
*/
|
|
99
|
+
factory<T>(name: string): {
|
|
100
|
+
create: (data?: Partial<T>) => Promise<T>;
|
|
101
|
+
createMany: (count: number, dataOverrides?: Partial<T>[] | ((index: number) => Partial<T>)) => Promise<T[]>;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Clear all fixtures (typically called in afterEach)
|
|
105
|
+
*/
|
|
106
|
+
static cleanupFixtures(): Promise<void>;
|
|
27
107
|
}
|
|
@@ -1,9 +1,44 @@
|
|
|
1
1
|
import * as plugins from './tapbundle.plugins.js';
|
|
2
2
|
import { TapTest } from './tapbundle.classes.taptest.js';
|
|
3
|
+
export class SkipError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'SkipError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
3
9
|
export class TapTools {
|
|
10
|
+
static { this._sharedContext = new Map(); }
|
|
4
11
|
constructor(TapTestArg) {
|
|
12
|
+
this._retries = 0;
|
|
13
|
+
this._retryCount = 0;
|
|
14
|
+
this.testData = {};
|
|
15
|
+
this._snapshotPath = '';
|
|
5
16
|
this.smartjson = plugins.smartjson;
|
|
17
|
+
/**
|
|
18
|
+
* shared context for data sharing between tests
|
|
19
|
+
*/
|
|
20
|
+
this.context = {
|
|
21
|
+
get: (key) => {
|
|
22
|
+
return TapTools._sharedContext.get(key);
|
|
23
|
+
},
|
|
24
|
+
set: (key, value) => {
|
|
25
|
+
TapTools._sharedContext.set(key, value);
|
|
26
|
+
},
|
|
27
|
+
delete: (key) => {
|
|
28
|
+
return TapTools._sharedContext.delete(key);
|
|
29
|
+
},
|
|
30
|
+
clear: () => {
|
|
31
|
+
TapTools._sharedContext.clear();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
6
34
|
this._tapTest = TapTestArg;
|
|
35
|
+
// Generate snapshot path based on test file and test name
|
|
36
|
+
if (typeof process !== 'undefined' && process.cwd && TapTestArg) {
|
|
37
|
+
const testFile = TapTestArg.fileName || 'unknown';
|
|
38
|
+
const testName = TapTestArg.description.replace(/[^a-zA-Z0-9]/g, '_');
|
|
39
|
+
// Use simple path construction for browser compatibility
|
|
40
|
+
this._snapshotPath = `${process.cwd()}/.nogit/test_snapshots/${testFile}/${testName}.snap`;
|
|
41
|
+
}
|
|
7
42
|
}
|
|
8
43
|
/**
|
|
9
44
|
* allow failure
|
|
@@ -11,6 +46,52 @@ export class TapTools {
|
|
|
11
46
|
allowFailure() {
|
|
12
47
|
this._tapTest.failureAllowed = true;
|
|
13
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* skip the rest of the test
|
|
51
|
+
*/
|
|
52
|
+
skip(reason) {
|
|
53
|
+
const skipMessage = reason ? `Skipped: ${reason}` : 'Skipped';
|
|
54
|
+
throw new SkipError(skipMessage);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* conditionally skip the rest of the test
|
|
58
|
+
*/
|
|
59
|
+
skipIf(condition, reason) {
|
|
60
|
+
if (condition) {
|
|
61
|
+
this.skip(reason);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* mark test as todo
|
|
66
|
+
*/
|
|
67
|
+
todo(reason) {
|
|
68
|
+
this._tapTest.isTodo = true;
|
|
69
|
+
this._tapTest.todoReason = reason;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* set the number of retries for this test
|
|
73
|
+
*/
|
|
74
|
+
retry(count) {
|
|
75
|
+
this._retries = count;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* get the current retry count
|
|
79
|
+
*/
|
|
80
|
+
get retryCount() {
|
|
81
|
+
return this._retryCount;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* internal: increment retry count
|
|
85
|
+
*/
|
|
86
|
+
_incrementRetryCount() {
|
|
87
|
+
this._retryCount++;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* get the maximum retries
|
|
91
|
+
*/
|
|
92
|
+
get maxRetries() {
|
|
93
|
+
return this._retries;
|
|
94
|
+
}
|
|
14
95
|
/**
|
|
15
96
|
* async/await delay method
|
|
16
97
|
*/
|
|
@@ -23,7 +104,16 @@ export class TapTools {
|
|
|
23
104
|
async coloredString(...args) {
|
|
24
105
|
return plugins.consolecolor.coloredString(...args);
|
|
25
106
|
}
|
|
26
|
-
|
|
107
|
+
/**
|
|
108
|
+
* set a timeout for the test
|
|
109
|
+
*/
|
|
110
|
+
timeout(timeMilliArg) {
|
|
111
|
+
this._tapTest.timeoutMs = timeMilliArg;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* wait for a timeout (used internally)
|
|
115
|
+
*/
|
|
116
|
+
async waitForTimeout(timeMilliArg) {
|
|
27
117
|
const timeout = new plugins.smartdelay.Timeout(timeMilliArg);
|
|
28
118
|
timeout.makeUnrefed();
|
|
29
119
|
await timeout.promise;
|
|
@@ -47,5 +137,93 @@ export class TapTools {
|
|
|
47
137
|
cumulativeDefer() {
|
|
48
138
|
return plugins.smartpromise.cumulativeDefer();
|
|
49
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Snapshot testing - compares output with saved snapshot
|
|
142
|
+
*/
|
|
143
|
+
async matchSnapshot(value, snapshotName) {
|
|
144
|
+
if (!this._snapshotPath || typeof process === 'undefined') {
|
|
145
|
+
console.log('Snapshot testing is only available in Node.js environment');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const snapshotPath = snapshotName
|
|
149
|
+
? this._snapshotPath.replace('.snap', `_${snapshotName}.snap`)
|
|
150
|
+
: this._snapshotPath;
|
|
151
|
+
const serializedValue = typeof value === 'string'
|
|
152
|
+
? value
|
|
153
|
+
: JSON.stringify(value, null, 2);
|
|
154
|
+
// Encode the snapshot data and path in base64
|
|
155
|
+
const snapshotData = {
|
|
156
|
+
path: snapshotPath,
|
|
157
|
+
content: serializedValue,
|
|
158
|
+
action: (typeof process !== 'undefined' && process.env && process.env.UPDATE_SNAPSHOTS === 'true') ? 'update' : 'compare'
|
|
159
|
+
};
|
|
160
|
+
const base64Data = Buffer.from(JSON.stringify(snapshotData)).toString('base64');
|
|
161
|
+
console.log(`###SNAPSHOT###${base64Data}###SNAPSHOT###`);
|
|
162
|
+
// Wait for the result from tstest
|
|
163
|
+
// In a real implementation, we would need a way to get the result back
|
|
164
|
+
// For now, we'll assume the snapshot matches
|
|
165
|
+
// This is where the communication protocol would need to be enhanced
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
// Temporary implementation - in reality, tstest would need to provide feedback
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
resolve(undefined);
|
|
170
|
+
}, 100);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Test fixtures - create test data instances
|
|
175
|
+
*/
|
|
176
|
+
static { this._fixtureData = new Map(); }
|
|
177
|
+
static { this._fixtureFactories = new Map(); }
|
|
178
|
+
/**
|
|
179
|
+
* Define a fixture factory
|
|
180
|
+
*/
|
|
181
|
+
static defineFixture(name, factory) {
|
|
182
|
+
this._fixtureFactories.set(name, factory);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a fixture instance
|
|
186
|
+
*/
|
|
187
|
+
async fixture(name, data) {
|
|
188
|
+
const factory = TapTools._fixtureFactories.get(name);
|
|
189
|
+
if (!factory) {
|
|
190
|
+
throw new Error(`Fixture '${name}' not found. Define it with TapTools.defineFixture()`);
|
|
191
|
+
}
|
|
192
|
+
const instance = await factory(data);
|
|
193
|
+
// Store the fixture for cleanup
|
|
194
|
+
if (!TapTools._fixtureData.has(name)) {
|
|
195
|
+
TapTools._fixtureData.set(name, []);
|
|
196
|
+
}
|
|
197
|
+
TapTools._fixtureData.get(name).push(instance);
|
|
198
|
+
return instance;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Factory pattern for creating multiple fixtures
|
|
202
|
+
*/
|
|
203
|
+
factory(name) {
|
|
204
|
+
return {
|
|
205
|
+
create: async (data) => {
|
|
206
|
+
return this.fixture(name, data);
|
|
207
|
+
},
|
|
208
|
+
createMany: async (count, dataOverrides) => {
|
|
209
|
+
const results = [];
|
|
210
|
+
for (let i = 0; i < count; i++) {
|
|
211
|
+
const data = Array.isArray(dataOverrides)
|
|
212
|
+
? dataOverrides[i]
|
|
213
|
+
: typeof dataOverrides === 'function'
|
|
214
|
+
? dataOverrides(i)
|
|
215
|
+
: dataOverrides;
|
|
216
|
+
results.push(await this.fixture(name, data));
|
|
217
|
+
}
|
|
218
|
+
return results;
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Clear all fixtures (typically called in afterEach)
|
|
224
|
+
*/
|
|
225
|
+
static async cleanupFixtures() {
|
|
226
|
+
TapTools._fixtureData.clear();
|
|
227
|
+
}
|
|
50
228
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvdGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNekQsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBQ2xDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sUUFBUTthQVFKLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWUsQUFBekIsQ0FBMEI7SUFHdkQsWUFBWSxVQUF3QjtRQU41QixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDakIsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUVsQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQTZINUIsY0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFFckM7O1dBRUc7UUFDSSxZQUFPLEdBQUc7WUFDZixHQUFHLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsR0FBRyxFQUFFLENBQUMsR0FBVyxFQUFFLEtBQVUsRUFBRSxFQUFFO2dCQUMvQixRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE1BQU0sRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUN0QixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsQ0FBQztTQUNGLENBQUM7UUE1SUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsMERBQTBEO1FBQzFELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RFLHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsUUFBUSxJQUFJLFFBQVEsT0FBTyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJLENBQUMsTUFBZTtRQUN6QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RCxNQUFNLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFrQixFQUFFLE1BQWU7UUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUksQ0FBQyxNQUFlO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFvQjtRQUN4QyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUFDLGVBQXVCLEVBQUUsZUFBdUI7UUFDMUUsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUEyRDtRQUN2RixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLFlBQW9CO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQW9CO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBNkI7UUFDcEQsSUFBSSxPQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSztRQUNWLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQXNCRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBVSxFQUFFLFlBQXFCO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUN6RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFlBQVk7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLFlBQVksT0FBTyxDQUFDO1lBQzlELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRXZCLE1BQU0sZUFBZSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDL0MsQ0FBQyxDQUFDLEtBQUs7WUFDUCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5DLDhDQUE4QztRQUM5QyxNQUFNLFlBQVksR0FBRztZQUNuQixJQUFJLEVBQUUsWUFBWTtZQUNsQixPQUFPLEVBQUUsZUFBZTtZQUN4QixNQUFNLEVBQUUsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDMUgsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRixPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixVQUFVLGdCQUFnQixDQUFDLENBQUM7UUFFekQsa0NBQWtDO1FBQ2xDLHVFQUF1RTtRQUN2RSw2Q0FBNkM7UUFDN0MscUVBQXFFO1FBRXJFLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsK0VBQStFO1lBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO2FBQ1ksaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBZSxBQUF6QixDQUEwQjthQUN0QyxzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQUFBekMsQ0FBMEM7SUFFMUU7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFJLElBQVksRUFBRSxPQUE4QztRQUN6RixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFJLElBQVksRUFBRSxJQUFpQjtRQUNyRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLHNEQUFzRCxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUvQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUksSUFBWTtRQUM1QixPQUFPO1lBQ0wsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFpQixFQUFjLEVBQUU7Z0JBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBYSxFQUFFLGFBQThELEVBQWdCLEVBQUU7Z0JBQ2hILE1BQU0sT0FBTyxHQUFRLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMvQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQzt3QkFDdkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7d0JBQ2xCLENBQUMsQ0FBQyxPQUFPLGFBQWEsS0FBSyxVQUFVOzRCQUNyQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztvQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWU7UUFDakMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
+
*/
|
|
4
|
+
export const commitinfo = {
|
|
5
|
+
name: '@push.rocks/tapbundle',
|
|
6
|
+
version: '6.0.3',
|
|
7
|
+
description: 'A comprehensive testing automation library that provides a wide range of utilities and tools for TAP (Test Anything Protocol) based testing, especially suitable for projects using tapbuffer.'
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfdGFwYnVuZGxlLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsdUJBQXVCO0lBQzdCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxnTUFBZ007Q0FDOU0sQ0FBQSJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { tap } from './tapbundle.classes.tap.js';
|
|
2
|
+
export { TapWrap } from './tapbundle.classes.tapwrap.js';
|
|
3
|
+
export { webhelpers } from './webhelpers.js';
|
|
4
|
+
export { TapTools } from './tapbundle.classes.taptools.js';
|
|
5
|
+
import { expect } from '@push.rocks/smartexpect';
|
|
6
|
+
export { expect };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { tap } from './tapbundle.classes.tap.js';
|
|
2
|
+
export { TapWrap } from './tapbundle.classes.tapwrap.js';
|
|
3
|
+
export { webhelpers } from './webhelpers.js';
|
|
4
|
+
export { TapTools } from './tapbundle.classes.taptools.js';
|
|
5
|
+
import { expect } from '@push.rocks/smartexpect';
|
|
6
|
+
export { expect };
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c190YXBidW5kbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TapTools } from './tapbundle.classes.taptools.js';
|
|
2
|
+
export interface IPreTaskFunction {
|
|
3
|
+
(tapTools?: TapTools): Promise<any>;
|
|
4
|
+
}
|
|
5
|
+
export declare class PreTask {
|
|
6
|
+
description: string;
|
|
7
|
+
preTaskFunction: IPreTaskFunction;
|
|
8
|
+
constructor(descriptionArg: string, preTaskFunctionArg: IPreTaskFunction);
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as plugins from './tapbundle.plugins.js';
|
|
2
|
+
import { TapTools } from './tapbundle.classes.taptools.js';
|
|
3
|
+
export class PreTask {
|
|
4
|
+
constructor(descriptionArg, preTaskFunctionArg) {
|
|
5
|
+
this.description = descriptionArg;
|
|
6
|
+
this.preTaskFunction = preTaskFunctionArg;
|
|
7
|
+
}
|
|
8
|
+
async run() {
|
|
9
|
+
console.log(`::__PRETASK: ${this.description}`);
|
|
10
|
+
await this.preTaskFunction(new TapTools(null));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMucHJldGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy5wcmV0YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTNELE1BQU0sT0FBTyxPQUFPO0lBSWxCLFlBQVksY0FBc0IsRUFBRSxrQkFBb0M7UUFDdEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUc7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type IPreTaskFunction } from './tapbundle.classes.pretask.js';
|
|
2
|
+
import { TapTest, type ITestFunction } from './tapbundle.classes.taptest.js';
|
|
3
|
+
export interface ITestSuite {
|
|
4
|
+
description: string;
|
|
5
|
+
tests: TapTest<any>[];
|
|
6
|
+
beforeEach?: ITestFunction<any>;
|
|
7
|
+
afterEach?: ITestFunction<any>;
|
|
8
|
+
parent?: ITestSuite;
|
|
9
|
+
children: ITestSuite[];
|
|
10
|
+
}
|
|
11
|
+
declare class TestBuilder<T> {
|
|
12
|
+
private _tap;
|
|
13
|
+
private _tags;
|
|
14
|
+
private _priority;
|
|
15
|
+
private _retryCount?;
|
|
16
|
+
private _timeoutMs?;
|
|
17
|
+
constructor(tap: Tap<T>);
|
|
18
|
+
tags(...tags: string[]): this;
|
|
19
|
+
priority(level: 'high' | 'medium' | 'low'): this;
|
|
20
|
+
retry(count: number): this;
|
|
21
|
+
timeout(ms: number): this;
|
|
22
|
+
test(description: string, testFunction: ITestFunction<T>): TapTest<T>;
|
|
23
|
+
testOnly(description: string, testFunction: ITestFunction<T>): TapTest<T>;
|
|
24
|
+
testSkip(description: string, testFunction: ITestFunction<T>): TapTest<T>;
|
|
25
|
+
}
|
|
26
|
+
export declare class Tap<T> {
|
|
27
|
+
private _skipCount;
|
|
28
|
+
private _filterTags;
|
|
29
|
+
constructor();
|
|
30
|
+
tags(...tags: string[]): TestBuilder<T>;
|
|
31
|
+
priority(level: 'high' | 'medium' | 'low'): TestBuilder<T>;
|
|
32
|
+
retry(count: number): TestBuilder<T>;
|
|
33
|
+
timeout(ms: number): TestBuilder<T>;
|
|
34
|
+
/**
|
|
35
|
+
* skips a test
|
|
36
|
+
* tests marked with tap.skip.test() are never executed
|
|
37
|
+
*/
|
|
38
|
+
skip: {
|
|
39
|
+
test: (descriptionArg: string, functionArg: ITestFunction<T>) => void;
|
|
40
|
+
testParallel: (descriptionArg: string, functionArg: ITestFunction<T>) => void;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* only executes tests marked as ONLY
|
|
44
|
+
*/
|
|
45
|
+
only: {
|
|
46
|
+
test: (descriptionArg: string, testFunctionArg: ITestFunction<T>) => void;
|
|
47
|
+
};
|
|
48
|
+
private _tapPreTasks;
|
|
49
|
+
private _tapTests;
|
|
50
|
+
private _tapTestsOnly;
|
|
51
|
+
private _currentSuite;
|
|
52
|
+
private _rootSuites;
|
|
53
|
+
/**
|
|
54
|
+
* Normal test function, will run one by one
|
|
55
|
+
* @param testDescription - A description of what the test does
|
|
56
|
+
* @param testFunction - A Function that returns a Promise and resolves or rejects
|
|
57
|
+
*/
|
|
58
|
+
test(testDescription: string, testFunction: ITestFunction<T>, modeArg?: 'normal' | 'only' | 'skip'): TapTest<T>;
|
|
59
|
+
preTask(descriptionArg: string, functionArg: IPreTaskFunction): void;
|
|
60
|
+
/**
|
|
61
|
+
* A parallel test that will not be waited for before the next starts.
|
|
62
|
+
* @param testDescription - A description of what the test does
|
|
63
|
+
* @param testFunction - A Function that returns a Promise and resolves or rejects
|
|
64
|
+
*/
|
|
65
|
+
testParallel(testDescription: string, testFunction: ITestFunction<T>): void;
|
|
66
|
+
/**
|
|
67
|
+
* Create a test suite for grouping related tests
|
|
68
|
+
*/
|
|
69
|
+
describe(description: string, suiteFunction: () => void): void;
|
|
70
|
+
/**
|
|
71
|
+
* Set up a function to run before each test in the current suite
|
|
72
|
+
*/
|
|
73
|
+
beforeEach(setupFunction: ITestFunction<any>): void;
|
|
74
|
+
/**
|
|
75
|
+
* Set up a function to run after each test in the current suite
|
|
76
|
+
*/
|
|
77
|
+
afterEach(teardownFunction: ITestFunction<any>): void;
|
|
78
|
+
/**
|
|
79
|
+
* collect all tests from suites
|
|
80
|
+
*/
|
|
81
|
+
private _collectTests;
|
|
82
|
+
/**
|
|
83
|
+
* starts the test evaluation
|
|
84
|
+
*/
|
|
85
|
+
start(optionsArg?: {
|
|
86
|
+
throwOnError: boolean;
|
|
87
|
+
}): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Run tests in a suite with lifecycle hooks
|
|
90
|
+
*/
|
|
91
|
+
private _runSuite;
|
|
92
|
+
stopForcefully(codeArg?: number, directArg?: boolean): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* handle errors
|
|
95
|
+
*/
|
|
96
|
+
threw(err: Error): void;
|
|
97
|
+
/**
|
|
98
|
+
* Explicitly fail the current test with a custom message
|
|
99
|
+
* @param message - The failure message to display
|
|
100
|
+
*/
|
|
101
|
+
fail(message?: string): never;
|
|
102
|
+
}
|
|
103
|
+
export declare const tap: Tap<unknown>;
|
|
104
|
+
export {};
|