@ac-kit/integration-test-util 0.1.0 → 0.2.1
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/CHANGELOG.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# @ac-kit/integration-test-util
|
|
2
|
+
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [a5c4d66]
|
|
8
|
+
- Updated dependencies [a5c4d66]
|
|
9
|
+
- Updated dependencies [a5c4d66]
|
|
10
|
+
- @ac-kit/node@0.3.0
|
|
11
|
+
- @ac-kit/core@0.3.0
|
|
12
|
+
- @ac-kit/cmd-docker@0.2.1
|
|
13
|
+
|
|
14
|
+
## 0.2.0
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- a493b4a: **Breaking:** `initDockerSuite` no longer switches the machine's docker context,
|
|
19
|
+
and names everything it creates uniquely.
|
|
20
|
+
|
|
21
|
+
- `contextName` is now `context`, and it is passed to every docker command
|
|
22
|
+
instead of being installed with `docker context use`. The old behaviour raced
|
|
23
|
+
between concurrent suites and left the developer's own context switched when a
|
|
24
|
+
run crashed.
|
|
25
|
+
- The image tag and the container names now carry a random per-suite id, so two
|
|
26
|
+
suites — including two runs of the same file — can no longer share a tag, and
|
|
27
|
+
one suite's teardown can no longer remove another's image.
|
|
28
|
+
- Teardown runs every step even when an earlier one throws, reporting the
|
|
29
|
+
failures together, so a container that refuses to die no longer strands the
|
|
30
|
+
image. The image is marked for removal before the build rather than after, so
|
|
31
|
+
a build that tags and then fails still gets cleaned up.
|
|
32
|
+
- Containers are started detached. Without it a foreground container never
|
|
33
|
+
returned control to the test.
|
|
34
|
+
- New `onContainerStarting` and `onContainerStopping` hooks fire before the run
|
|
35
|
+
and while the container is still reachable, beside the existing
|
|
36
|
+
`onContainerStarted` and `onContainerStopped`.
|
|
37
|
+
- `containerRunOptions` may no longer set `name`, `context` or `detach`, which
|
|
38
|
+
the suite owns.
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- Updated dependencies [732a70b]
|
|
43
|
+
- Updated dependencies [a493b4a]
|
|
44
|
+
- Updated dependencies [a493b4a]
|
|
45
|
+
- Updated dependencies [a493b4a]
|
|
46
|
+
- Updated dependencies [a493b4a]
|
|
47
|
+
- Updated dependencies [2ab5593]
|
|
48
|
+
- Updated dependencies [a493b4a]
|
|
49
|
+
- Updated dependencies [a493b4a]
|
|
50
|
+
- Updated dependencies [70c1269]
|
|
51
|
+
- @ac-kit/cmd-docker@0.2.0
|
|
52
|
+
- @ac-kit/node@0.2.0
|
|
53
|
+
- @ac-kit/core@0.2.0
|
package/README.md
CHANGED
|
@@ -7,13 +7,22 @@ speaking the protocol you expect.
|
|
|
7
7
|
```ts
|
|
8
8
|
import { initDockerSuite, isTcpPortOpen } from "@ac-kit/integration-test-util";
|
|
9
9
|
|
|
10
|
-
// Registers beforeAll/
|
|
11
|
-
// lifecycle: build the image,
|
|
12
|
-
|
|
10
|
+
// Registers beforeAll/beforeEach/afterEach/afterAll hooks covering the whole
|
|
11
|
+
// container lifecycle: build the image once, run a detached container per test,
|
|
12
|
+
// remove both afterwards. Every name it generates carries a random per-suite
|
|
13
|
+
// id, so concurrent suites never collide.
|
|
14
|
+
const suite = initDockerSuite("./fixtures/postfix", {
|
|
15
|
+
containerRunOptions: () => ({ publish: ["25:25"] }),
|
|
16
|
+
});
|
|
13
17
|
|
|
14
18
|
await isTcpPortOpen(25, "127.0.0.1");
|
|
15
19
|
```
|
|
16
20
|
|
|
21
|
+
Pass `context` to run every command against one docker context; the suite never
|
|
22
|
+
switches the machine's active one. `onContainerStarting`/`onContainerStarted`
|
|
23
|
+
and `onContainerStopping`/`onContainerStopped` bracket each container, the
|
|
24
|
+
"stopping" hook firing while it is still reachable.
|
|
25
|
+
|
|
17
26
|
Also exposes `tryTcpConnectAndReadBanner` and `tryTlsConnectAndReadBanner`, for
|
|
18
27
|
waiting until a server is not merely listening but actually answering.
|
|
19
28
|
|
|
@@ -1,27 +1,48 @@
|
|
|
1
|
+
import { type DockerContainerName, type DockerContainerRunOptions } from "@ac-kit/cmd-docker";
|
|
2
|
+
import type { Except } from "type-fest";
|
|
1
3
|
export type InitDockerSuiteOptions = {
|
|
4
|
+
/** Called with the name a container is about to be started under. */
|
|
5
|
+
onContainerStarting?: (name: DockerContainerName) => void | Promise<void>;
|
|
6
|
+
/** Called after a container is started. */
|
|
7
|
+
onContainerStarted?: (name: DockerContainerName) => void | Promise<void>;
|
|
8
|
+
/** Called before a container is removed, while it is still reachable. */
|
|
9
|
+
onContainerStopping?: (name: DockerContainerName) => void | Promise<void>;
|
|
10
|
+
/** Called after a container is removed. */
|
|
11
|
+
onContainerStopped?: (name: DockerContainerName) => void | Promise<void>;
|
|
2
12
|
/**
|
|
3
|
-
*
|
|
13
|
+
* Options to use when starting a container.
|
|
4
14
|
*
|
|
5
|
-
*
|
|
15
|
+
* The suite owns the name, the context and the detach flag: it has to know
|
|
16
|
+
* the name to remove the container, it runs every command against one
|
|
17
|
+
* context, and a container started in the foreground would never hand control
|
|
18
|
+
* back to the test.
|
|
6
19
|
*/
|
|
7
|
-
|
|
20
|
+
containerRunOptions?: (name: DockerContainerName) => Except<DockerContainerRunOptions, "name" | "context" | "detach">;
|
|
8
21
|
/**
|
|
9
|
-
*
|
|
22
|
+
* Prefix for the image and container names.
|
|
10
23
|
*
|
|
11
|
-
* Defaults to "
|
|
24
|
+
* Defaults to "test-".
|
|
12
25
|
*/
|
|
13
|
-
|
|
26
|
+
containerNamePrefix?: string;
|
|
27
|
+
/** Docker context to run every command of this suite against. */
|
|
28
|
+
context?: string;
|
|
29
|
+
/** Whether to reuse the same container instance across tests. */
|
|
30
|
+
reuseContainerInstance?: boolean;
|
|
14
31
|
};
|
|
15
32
|
export type DockerSuiteContext = {
|
|
16
|
-
containerName: string;
|
|
17
33
|
containerImageName: string;
|
|
18
|
-
stopContainer: () => Promise<void>;
|
|
19
34
|
};
|
|
20
35
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
36
|
+
* Initializes a Docker test suite: builds the image at `srcPath` once, runs a
|
|
37
|
+
* container per test, and removes both afterwards.
|
|
38
|
+
*
|
|
39
|
+
* Every name it generates carries a random per-suite id, so two suites running
|
|
40
|
+
* concurrently — including two runs of the same file — never share an image tag
|
|
41
|
+
* or a container name, and neither one's cleanup can remove the other's.
|
|
42
|
+
*
|
|
43
|
+
* @param srcPath The build context to build the suite's image from.
|
|
44
|
+
* @param options Options for the suite.
|
|
45
|
+
* @returns The names the suite generated, for tests that need to address them.
|
|
25
46
|
*/
|
|
26
47
|
export declare function initDockerSuite(srcPath: string, options?: InitDockerSuiteOptions): DockerSuiteContext;
|
|
27
48
|
//# sourceMappingURL=init-docker-suite.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-docker-suite.d.ts","sourceRoot":"","sources":["../../src/docker/init-docker-suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-docker-suite.d.ts","sourceRoot":"","sources":["../../src/docker/init-docker-suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,mBAAmB,EAGxB,KAAK,yBAAyB,EAE9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,MAAM,MAAM,sBAAsB,GAAG;IACpC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,CACrB,IAAI,EAAE,mBAAmB,KACrB,MAAM,CAAC,yBAAyB,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IAEtE;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iEAAiE;IACjE,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,sBAAsB,GAC9B,kBAAkB,CAgHpB"}
|
|
@@ -1,47 +1,110 @@
|
|
|
1
|
-
import { dockerBuildxBuild, dockerContainerRm,
|
|
1
|
+
import { dockerBuildxBuild, dockerContainerRm, dockerContainerRun, dockerImageRm, } from "@ac-kit/cmd-docker";
|
|
2
2
|
import { getRandomBytes } from "@ac-kit/crypto-random";
|
|
3
|
-
import { afterAll, afterEach, beforeAll } from "vitest";
|
|
3
|
+
import { afterAll, afterEach, beforeAll, beforeEach } from "vitest";
|
|
4
|
+
function randomId(byteLength) {
|
|
5
|
+
return Buffer.from(getRandomBytes(byteLength)).toString("hex");
|
|
6
|
+
}
|
|
4
7
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
8
|
+
* Initializes a Docker test suite: builds the image at `srcPath` once, runs a
|
|
9
|
+
* container per test, and removes both afterwards.
|
|
10
|
+
*
|
|
11
|
+
* Every name it generates carries a random per-suite id, so two suites running
|
|
12
|
+
* concurrently — including two runs of the same file — never share an image tag
|
|
13
|
+
* or a container name, and neither one's cleanup can remove the other's.
|
|
14
|
+
*
|
|
15
|
+
* @param srcPath The build context to build the suite's image from.
|
|
16
|
+
* @param options Options for the suite.
|
|
17
|
+
* @returns The names the suite generated, for tests that need to address them.
|
|
9
18
|
*/
|
|
10
19
|
export function initDockerSuite(srcPath, options) {
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
const containerNamePrefix = options?.containerNamePrefix ?? "test-";
|
|
21
|
+
const suiteId = randomId(8);
|
|
22
|
+
const containerImageName = `${containerNamePrefix}${suiteId}-img`;
|
|
23
|
+
const commonOptions = { context: options?.context };
|
|
24
|
+
const startedContainerNames = [];
|
|
25
|
+
let imageBuildAttempted = false;
|
|
26
|
+
async function stopContainer(containerName) {
|
|
27
|
+
const index = startedContainerNames.indexOf(containerName);
|
|
28
|
+
if (index === -1) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Untracked before the removal, so a removal that fails is reported once
|
|
32
|
+
// rather than retried until the drain loop gives up.
|
|
33
|
+
startedContainerNames.splice(index, 1);
|
|
34
|
+
await options?.onContainerStopping?.(containerName);
|
|
35
|
+
await dockerContainerRm([containerName], {
|
|
36
|
+
...commonOptions,
|
|
37
|
+
force: true,
|
|
38
|
+
});
|
|
39
|
+
await options?.onContainerStopped?.(containerName);
|
|
40
|
+
}
|
|
41
|
+
async function stopAllContainers() {
|
|
42
|
+
while (startedContainerNames.length > 0) {
|
|
43
|
+
await stopContainer(startedContainerNames[0]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function removeImage() {
|
|
47
|
+
if (!imageBuildAttempted) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
await dockerImageRm([containerImageName], {
|
|
51
|
+
...commonOptions,
|
|
52
|
+
force: true,
|
|
53
|
+
});
|
|
21
54
|
}
|
|
22
55
|
beforeAll(async () => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
await dockerBuildxBuild(srcPath, { tags: [containerImageName] });
|
|
56
|
+
// Set before the build, not after: a build that tags the image and then
|
|
57
|
+
// fails still leaves one to remove.
|
|
58
|
+
imageBuildAttempted = true;
|
|
59
|
+
await dockerBuildxBuild(srcPath, {
|
|
60
|
+
...commonOptions,
|
|
61
|
+
tags: [containerImageName],
|
|
62
|
+
});
|
|
31
63
|
});
|
|
32
64
|
afterAll(async () => {
|
|
33
|
-
|
|
34
|
-
|
|
65
|
+
// Every step runs even when an earlier one throws, or a container that
|
|
66
|
+
// refuses to die would strand the image for the rest of the machine.
|
|
67
|
+
const failures = [];
|
|
68
|
+
for (const step of [stopAllContainers, removeImage]) {
|
|
69
|
+
try {
|
|
70
|
+
await step();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
failures.push(error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (failures.length === 1) {
|
|
77
|
+
throw failures[0];
|
|
35
78
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
await dockerContextUse(initialContext);
|
|
79
|
+
if (failures.length > 1) {
|
|
80
|
+
throw new AggregateError(failures, "Docker suite cleanup failed");
|
|
39
81
|
}
|
|
40
|
-
|
|
82
|
+
});
|
|
83
|
+
beforeEach(async () => {
|
|
84
|
+
if (options?.reuseContainerInstance && startedContainerNames.length > 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const containerName = `${containerNamePrefix}${suiteId}-${randomId(4)}`;
|
|
88
|
+
await options?.onContainerStarting?.(containerName);
|
|
89
|
+
await dockerContainerRun(containerImageName, {
|
|
90
|
+
...options?.containerRunOptions?.(containerName),
|
|
91
|
+
...commonOptions,
|
|
92
|
+
name: containerName,
|
|
93
|
+
detach: true,
|
|
94
|
+
});
|
|
95
|
+
// Tracked before the "started" hook so a hook that throws still leaves a
|
|
96
|
+
// container the teardown knows about.
|
|
97
|
+
startedContainerNames.push(containerName);
|
|
98
|
+
await options?.onContainerStarted?.(containerName);
|
|
41
99
|
});
|
|
42
100
|
afterEach(async () => {
|
|
43
|
-
|
|
101
|
+
if (options?.reuseContainerInstance) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
await stopAllContainers();
|
|
44
105
|
});
|
|
45
|
-
return {
|
|
106
|
+
return {
|
|
107
|
+
containerImageName,
|
|
108
|
+
};
|
|
46
109
|
}
|
|
47
110
|
//# sourceMappingURL=init-docker-suite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-docker-suite.js","sourceRoot":"","sources":["../../src/docker/init-docker-suite.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,iBAAiB,
|
|
1
|
+
{"version":3,"file":"init-docker-suite.js","sourceRoot":"","sources":["../../src/docker/init-docker-suite.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ac-kit/integration-test-util",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Test helpers that drive and probe external services — Docker containers, TCP and TLS banner checks — from a package's integration tests.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"docker",
|
|
@@ -38,15 +38,16 @@
|
|
|
38
38
|
"prepack": "yarn build"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@ac-kit/cmd-docker": "^0.1
|
|
42
|
-
"@ac-kit/core": "^0.
|
|
41
|
+
"@ac-kit/cmd-docker": "^0.2.1",
|
|
42
|
+
"@ac-kit/core": "^0.3.0",
|
|
43
43
|
"@ac-kit/crypto-random": "^0.1.0",
|
|
44
|
-
"@ac-kit/node": "^0.
|
|
44
|
+
"@ac-kit/node": "^0.3.0",
|
|
45
|
+
"type-fest": "^5.8.0"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@ac-kit/tsconfig": "0.1.0",
|
|
48
49
|
"@ac-kit/typedoc-config": "0.1.0",
|
|
49
|
-
"@ac-kit/vitest-config": "0.1.
|
|
50
|
+
"@ac-kit/vitest-config": "0.1.1",
|
|
50
51
|
"@types/node": "26.5.1",
|
|
51
52
|
"@typescript/native": "typescript@7.0.2",
|
|
52
53
|
"rimraf": "6.1.3",
|