Compare commits

...

12 Commits

15 changed files with 5440 additions and 4125 deletions

View File

@ -6,8 +6,8 @@ on:
- '**'
env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
IMAGE: code.foss.global/hosttoday/ht-docker-node:npmci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
@ -26,7 +26,7 @@ jobs:
- name: Install pnpm and npmci
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
pnpm install -g @ship.zone/npmci
- name: Run npm prepare
run: npmci npm prepare

View File

@ -6,8 +6,8 @@ on:
- '*'
env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
IMAGE: code.foss.global/hosttoday/ht-docker-node:npmci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
@ -26,7 +26,7 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
pnpm install -g @ship.zone/npmci
npmci npm prepare
- name: Audit production dependencies
@ -54,7 +54,7 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
pnpm install -g @ship.zone/npmci
npmci npm prepare
- name: Test stable
@ -82,7 +82,7 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
pnpm install -g @ship.zone/npmci
npmci npm prepare
- name: Release
@ -104,7 +104,7 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
pnpm install -g @ship.zone/npmci
npmci npm prepare
- name: Code quality

View File

@ -1,5 +1,44 @@
# Changelog
## 2024-11-06 - 5.4.1 - fix(ci)
Fix CI configuration URL and package installation paths.
- Updated Docker image URL in CI config.
- Fixed repository URL format in package.json.
- Corrected npmci package installation path.
## 2024-11-06 - 5.4.0 - feat(node)
Add smartmongo and smarts3 integration in node tools
- Added createSmartmongo method to TapNodeTools for creating SmartMongo instances.
- Added createSmarts3 method to TapNodeTools for creating Smarts3 instances.
- Updated dependencies with smartmongo and smarts3 in package.json.
## 2024-09-19 - 5.3.0 - feat(TapNodeTools)
Add getEnvVarOnDemand method to TapNodeTools
- Introduced a new method getEnvVarOnDemand to the TapNodeTools class to fetch environment variables on demand.
- Enhanced getQenv function in TapNodeTools class to cache the Qenv instance for better performance.
## 2024-09-19 - 5.2.2 - fix(core)
Ensure reliability in test setup and execution
- Added new pre-task functionality to log starting of tasks.
- Enhanced `runCommand` method to better handle shell command execution.
- Fixed issue in `createHttpsCert` to correctly generate self-signed certificates.
## 2024-09-19 - 5.2.1 - fix(tapbundle)
Add qenv package to dependencies for environment management
- Added @push.rocks/qenv to dependencies in package.json.
- Updated TapNodeTools class in ts_node/classes.tapnodetools.ts to include getQenv method.
- Imported qenv in ts_node/plugins.ts.
## 2024-09-18 - 5.2.0 - feat(TapNodeTools)
Add ability to create HTTPS certificates with self-signed option
- Introduced a new parameter `allowSelfSigned` to the `createHttpsCert` function.
## 2024-09-18 - 5.1.4 - fix(ts_node)
Fixed issues in HTTPS certificate generation for TapNodeTools

View File

@ -1,7 +1,7 @@
{
"name": "@push.rocks/tapbundle",
"private": false,
"version": "5.1.4",
"version": "5.4.1",
"description": "A test automation library bundling utilities and tools for TAP (Test Anything Protocol) based testing, specifically tailored for tapbuffer.",
"exports": {
".": "./dist_ts/index.js",
@ -15,23 +15,26 @@
},
"repository": {
"type": "git",
"url": "https://code.foss.global/push.rocks/tapbundle.git"
"url": "git+https://code.foss.global/push.rocks/tapbundle.git"
},
"author": "Lossless GmbH",
"license": "MIT",
"bugs": {
"url": "https://gitlab.com/pushrocks/tapbundle/issues"
"url": "https://code.foss.global/push.rocks/tapbundle/issues"
},
"homepage": "https://code.foss.global/push.rocks/tapbundle",
"homepage": "https://code.foss.global/push.rocks/tapbundle#readme",
"dependencies": {
"@open-wc/testing": "^4.0.0",
"@push.rocks/consolecolor": "^2.0.2",
"@push.rocks/qenv": "^6.0.5",
"@push.rocks/smartcrypto": "^2.0.4",
"@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartenv": "^5.0.12",
"@push.rocks/smartexpect": "^1.2.1",
"@push.rocks/smartjson": "^5.0.20",
"@push.rocks/smartmongo": "^2.0.10",
"@push.rocks/smartpromise": "^4.0.4",
"@push.rocks/smarts3": "^2.2.1",
"@push.rocks/smartshell": "^3.0.6",
"@push.rocks/smarttime": "^4.0.8"
},

9318
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,9 @@
# @push.rocks/tapbundle
tap bundled for tapbuffer
## Install
Install the package by running the following command in your terminal:
```bash
@ -11,9 +13,11 @@ npm install @push.rocks/tapbundle --save-dev
This will add `@push.rocks/tapbundle` to your project's `devDependencies`.
## Usage
The `@push.rocks/tapbundle` package is a tap-compatible testing framework written in TypeScript, intended for use with tapbuffer. It includes a range of useful features enabling easy setup and execution of tests, assertion handling through `expect` and `expectAsync`, as well as auxiliary tools for delay and colored console output.
### Getting Started
First, ensure your project is set up with Typescript and supports ESM syntax. You can then import `tap`, `expect`, and `expectAsync` from `@push.rocks/tapbundle` to start defining your tests.
```typescript
@ -33,6 +37,7 @@ tap.start();
```
### Defining Tests
You can define tests with descriptions and async functions. The `tap` instance manages test execution, supports test skipping, and managing exclusive tests with the `.only` modifier.
```typescript
@ -52,6 +57,7 @@ tap.start();
```
### Using `expect` and `expectAsync`
The package provides `expect` and `expectAsync` for assertions:
```typescript
@ -60,6 +66,7 @@ expect(5).toBeGreaterThan(2);
```
### Handling Asynchronous Operations
`tapbundle` facilitates working with async operations in tests. You can introduce delays or set timeouts:
```typescript
@ -72,7 +79,9 @@ tap.start();
```
### Advanced Usage
#### Pre Tasks
You can define tasks to run before test execution begins:
```typescript
@ -88,6 +97,7 @@ tap.start();
```
#### Accessing Test Metadata
Each test returns a `TapTest` instance, from which you can access metadata and manipulate test behavior:
```typescript
@ -102,9 +112,11 @@ tap.start().then(() => {
```
### Running Tests
Tests are executed by calling `tap.start()`. This method runs all defined tests in sequence and respects `.skip` and `.only` modifiers.
### Debugging and Output
`@push.rocks/tapbundle` supports colored console output via `consolecolor` to help with debugging and test result readability:
```typescript

View File

@ -23,10 +23,10 @@ const test3 = tap.test(
async () => {
expect(
(await test1.testPromise).hrtMeasurement.milliSeconds <
(await test2).hrtMeasurement.milliSeconds
(await test2).hrtMeasurement.milliSeconds,
).toBeTrue();
expect((await test2.testPromise).hrtMeasurement.milliSeconds > 10).toBeTrue();
}
},
);
const test4 = tap.skip.test('my 4th test -> should fail', async (tools) => {

View File

@ -15,4 +15,14 @@ tap.test('should create a https cert', async () => {
expect(cert).toInclude('-----BEGIN CERTIFICATE-----');
});
tap.test('should create a smartmongo instance', async () => {
const smartmongo = await tapNodeTools.createSmartmongo();
await smartmongo.stop();
});
tap.test('should create a smarts3 instance', async () => {
const smarts3 = await tapNodeTools.createSmarts3();
await smarts3.stop();
});
tap.start();

View File

@ -17,10 +17,10 @@ const test3 = tap.test(
async () => {
expect(
(await test1.testPromise).hrtMeasurement.milliSeconds <
(await test2).hrtMeasurement.milliSeconds
(await test2).hrtMeasurement.milliSeconds,
).toBeTrue();
expect((await test2.testPromise).hrtMeasurement.milliSeconds > 1000).toBeTrue();
}
},
);
const test4 = tap.test('my 4th test -> should fail', async (tools) => {

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@push.rocks/tapbundle',
version: '5.1.4',
version: '5.4.1',
description: 'A test automation library bundling utilities and tools for TAP (Test Anything Protocol) based testing, specifically tailored for tapbuffer.'
}

View File

@ -37,7 +37,7 @@ export class Tap<T> {
public test(
testDescription: string,
testFunction: ITestFunction<T>,
modeArg: 'normal' | 'only' | 'skip' = 'normal'
modeArg: 'normal' | 'only' | 'skip' = 'normal',
): TapTest<T> {
const localTest = new TapTest<T>({
description: testDescription,
@ -67,7 +67,7 @@ export class Tap<T> {
description: testDescription,
testFunction,
parallel: true,
})
}),
);
}
@ -125,7 +125,7 @@ export class Tap<T> {
failReasons.push(
`Test ${tapTest.testKey + 1} failed with status ${tapTest.status}:\n` +
`|| ${tapTest.description}\n` +
`|| for more information please take a look the logs above`
`|| for more information please take a look the logs above`,
);
}
}
@ -150,7 +150,7 @@ export class Tap<T> {
} else {
setTimeout(() => {
process.exit(codeArg);
}, 10)
}, 10);
}
}

View File

@ -56,7 +56,7 @@ export class TapTest<T = unknown> {
}
this.hrtMeasurement.stop();
console.log(
`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`
`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`,
);
this.status = 'success';
this.testDeferred.resolve(this);
@ -64,7 +64,7 @@ export class TapTest<T = unknown> {
} catch (err: any) {
this.hrtMeasurement.stop();
console.log(
`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`
`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`,
);
this.testDeferred.resolve(this);
this.testResultDeferred.resolve(err);

View File

@ -5,6 +5,16 @@ class TapNodeTools {
constructor() {}
private qenv: plugins.qenv.Qenv;
public async getQenv(): Promise<plugins.qenv.Qenv> {
this.qenv = this.qenv || new plugins.qenv.Qenv('./', '.nogit/');
return this.qenv;
}
public async getEnvVarOnDemand(envVarNameArg: string): Promise<string> {
const qenv = await this.getQenv();
return qenv.getEnvVarOnDemand(envVarNameArg);
}
public async runCommand(commandArg: string): Promise<any> {
if (!this.smartshellInstance) {
this.smartshellInstance = new plugins.smartshell.Smartshell({
@ -16,8 +26,14 @@ class TapNodeTools {
}
public async createHttpsCert(
commonName: string = 'localhost'
commonName: string = 'localhost',
allowSelfSigned: boolean = true
): Promise<{ key: string; cert: string }> {
if (allowSelfSigned) {
// set node to allow self-signed certificates
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
}
// Generate a key pair
const keys = plugins.smartcrypto.nodeForge.pki.rsa.generateKeyPair(2048);
@ -52,6 +68,28 @@ class TapNodeTools {
cert: pemCert,
};
}
/**
* create and return a smartmongo instance
*/
public async createSmartmongo() {
const smartmongoMod = await import('@push.rocks/smartmongo');
const smartmongoInstance = new smartmongoMod.SmartMongo();
await smartmongoInstance.start();
return smartmongoInstance;
}
/**
* create and return a smarts3 instance
*/
public async createSmarts3() {
const smarts3Mod = await import('@push.rocks/smarts3');
const smarts3Instance = new smarts3Mod.Smarts3({
cleanSlate: true,
});
await smarts3Instance.start();
return smarts3Instance;
}
}
export const tapNodeTools = new TapNodeTools();

View File

@ -5,7 +5,8 @@ import * as fs from 'fs';
export { crypto,fs };
// @push.rocks scope
import * as qenv from '@push.rocks/qenv';
import * as smartcrypto from '@push.rocks/smartcrypto';
import * as smartshell from '@push.rocks/smartshell';
export { smartcrypto, smartshell };
export { qenv, smartcrypto, smartshell };

View File

@ -6,7 +6,9 @@
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"verbatimModuleSyntax": true
"verbatimModuleSyntax": true,
"baseUrl": ".",
"paths": {}
},
"exclude": [
"dist_*/**/*.d.ts"