@zukhruf/testing 0.3.41 → 0.3.43

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.
Files changed (61) hide show
  1. package/README.md +103 -15
  2. package/dist/databases/clickhouse.d.ts.map +1 -1
  3. package/dist/databases/clickhouse.js +5 -1
  4. package/dist/databases/clickhouse.js.map +1 -1
  5. package/dist/databases/collector.d.ts +34 -0
  6. package/dist/databases/collector.d.ts.map +1 -0
  7. package/dist/databases/collector.js +20 -0
  8. package/dist/databases/collector.js.map +1 -0
  9. package/dist/databases/mariadb.d.ts +1 -2
  10. package/dist/databases/mariadb.d.ts.map +1 -1
  11. package/dist/databases/mariadb.js +2 -2
  12. package/dist/databases/mariadb.js.map +1 -1
  13. package/dist/databases/mysql-family-collector.d.ts +16 -0
  14. package/dist/databases/mysql-family-collector.d.ts.map +1 -0
  15. package/dist/databases/mysql-family-collector.js +36 -0
  16. package/dist/databases/mysql-family-collector.js.map +1 -0
  17. package/dist/databases/mysql-family-server.d.ts +5 -3
  18. package/dist/databases/mysql-family-server.d.ts.map +1 -1
  19. package/dist/databases/mysql-family-server.js +22 -15
  20. package/dist/databases/mysql-family-server.js.map +1 -1
  21. package/dist/databases/mysql.d.ts +1 -1
  22. package/dist/databases/mysql.d.ts.map +1 -1
  23. package/dist/databases/mysql.js +2 -1
  24. package/dist/databases/mysql.js.map +1 -1
  25. package/dist/databases/postgres-collector.d.ts +9 -0
  26. package/dist/databases/postgres-collector.d.ts.map +1 -0
  27. package/dist/databases/postgres-collector.js +28 -0
  28. package/dist/databases/postgres-collector.js.map +1 -0
  29. package/dist/databases/postgres.d.ts.map +1 -1
  30. package/dist/databases/postgres.js +13 -8
  31. package/dist/databases/postgres.js.map +1 -1
  32. package/dist/databases/sqlite.d.ts.map +1 -1
  33. package/dist/databases/sqlite.js +2 -3
  34. package/dist/databases/sqlite.js.map +1 -1
  35. package/dist/databases/sqlserver-collector.d.ts +13 -0
  36. package/dist/databases/sqlserver-collector.d.ts.map +1 -0
  37. package/dist/databases/sqlserver-collector.js +42 -0
  38. package/dist/databases/sqlserver-collector.js.map +1 -0
  39. package/dist/databases/sqlserver.d.ts.map +1 -1
  40. package/dist/databases/sqlserver.js +15 -20
  41. package/dist/databases/sqlserver.js.map +1 -1
  42. package/dist/databases/succeeded.d.ts +3 -3
  43. package/dist/databases/succeeded.d.ts.map +1 -1
  44. package/dist/databases/succeeded.js +2 -2
  45. package/dist/databases/succeeded.js.map +1 -1
  46. package/dist/fs/temporary-files.d.ts +15 -0
  47. package/dist/fs/temporary-files.d.ts.map +1 -0
  48. package/dist/fs/temporary-files.js +21 -0
  49. package/dist/fs/temporary-files.js.map +1 -0
  50. package/dist/http/http-server.d.ts +0 -6
  51. package/dist/http/http-server.d.ts.map +1 -1
  52. package/dist/http/http-server.js +0 -8
  53. package/dist/http/http-server.js.map +1 -1
  54. package/dist/msw/msw.d.ts +15 -0
  55. package/dist/msw/msw.d.ts.map +1 -0
  56. package/dist/msw/msw.js +17 -0
  57. package/dist/msw/msw.js.map +1 -0
  58. package/dist/scripts/run-cleanup.d.ts.map +1 -1
  59. package/dist/scripts/run-cleanup.js +96 -0
  60. package/dist/scripts/run-cleanup.js.map +1 -1
  61. package/package.json +21 -4
@@ -1,19 +1,24 @@
1
- import { randomUUID } from 'node:crypto';
2
1
  import { timebox } from "../async/timebox.js";
3
2
  import { DockerFixtures } from "../docker/fixtures.js";
3
+ import { TestRun } from "../docker/test-run.js";
4
+ import { KIND_LABEL, databaseName } from "./collector.js";
5
+ import { postgres } from "./postgres-collector.js";
4
6
  import { succeeded } from "./succeeded.js";
5
7
  /** PostgreSQL test configuration. Each acquisition returns an independent handle. */
6
8
  export class Postgres {
7
9
  #docker;
10
+ #run;
8
11
  #options;
9
12
  constructor({ environment, image = 'postgres:18-alpine', password = 'testpassword', database = 'testdb', user = 'postgres', labels, }) {
10
13
  this.#docker = new DockerFixtures({ environment });
14
+ this.#run = TestRun.fromEnvironment(environment);
11
15
  this.#options = { image, password, database, user, labels };
12
16
  }
13
17
  /** Create an isolated database on the persistent shared server. */
14
18
  async database() {
15
19
  const container = await this.#acquire('postgres', 'reuse');
16
- const database = `test_${randomUUID().replaceAll('-', '')}`;
20
+ const database = databaseName(this.#run);
21
+ const server = { container: container.container, user: this.#options.user };
17
22
  try {
18
23
  await this.#sql(container, `CREATE DATABASE ${database}`);
19
24
  }
@@ -22,8 +27,8 @@ export class Postgres {
22
27
  throw error;
23
28
  }
24
29
  return this.#handle(container, database, async () => {
25
- await this.#sql(container, `DROP DATABASE IF EXISTS ${database} WITH (FORCE)`).catch(() => {
26
- /* Best-effort cleanup after external removal. */
30
+ await postgres.drop(server, database).catch(() => {
31
+ /* Best-effort: the run's cleanup drops a database that disposal left. */
27
32
  });
28
33
  await container.disconnect();
29
34
  });
@@ -35,7 +40,7 @@ export class Postgres {
35
40
  return this.#handle(container, database, () => container.cleanup());
36
41
  }
37
42
  #sql(container, sql) {
38
- return succeeded(container, [
43
+ return succeeded(container.container, [
39
44
  'psql',
40
45
  '-U',
41
46
  this.#options.user,
@@ -49,7 +54,7 @@ export class Postgres {
49
54
  const { image, password, user, labels } = this.#options;
50
55
  return this.#docker[mode]({
51
56
  image,
52
- labels,
57
+ labels: { ...labels, [KIND_LABEL]: postgres.kind },
53
58
  internalPort: 5432,
54
59
  env: {
55
60
  POSTGRES_PASSWORD: password,
@@ -65,14 +70,14 @@ export class Postgres {
65
70
  const { user } = this.#options;
66
71
  // TCP excludes PostgreSQL's temporary, socket-only initialization server.
67
72
  return timebox(async () => {
68
- await succeeded(container, [
73
+ await succeeded(container.container, [
69
74
  'pg_isready',
70
75
  '-h',
71
76
  '127.0.0.1',
72
77
  '-U',
73
78
  user,
74
79
  ]);
75
- await succeeded(container, [
80
+ await succeeded(container.container, [
76
81
  'psql',
77
82
  '-h',
78
83
  '127.0.0.1',
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/databases/postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/databases/postgres.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/databases/sqlite.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,YAAY,CAAC;IACzB,oEAAoE;IACpE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,uEAAuE;AACvE,qBAAa,MAAM;IACjB,0FAA0F;IACpF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAoDrE,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;CAY1C"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/databases/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,YAAY,CAAC;IACzB,oEAAoE;IACpE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,uEAAuE;AACvE,qBAAa,MAAM;IACjB,0FAA0F;IACpF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAoDrE,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;CAY1C"}
@@ -1,9 +1,8 @@
1
1
  import { once } from 'node:events';
2
- import { mkdtempDisposable } from 'node:fs/promises';
3
- import { tmpdir } from 'node:os';
4
2
  import { join } from 'node:path';
5
3
  import { DatabaseSync } from 'node:sqlite';
6
4
  import spawn, { SubprocessError } from 'nano-spawn';
5
+ import { TemporaryFiles } from "../fs/temporary-files.js";
7
6
  /** Each acquisition owns an independent, temporary SQLite database. */
8
7
  export class Sqlite {
9
8
  /** Holds a write lock in another process, which releases even while the caller blocks. */
@@ -55,7 +54,7 @@ export class Sqlite {
55
54
  }
56
55
  async database() {
57
56
  await using resources = new AsyncDisposableStack();
58
- const directory = resources.use(await mkdtempDisposable(join(tmpdir(), 'zukhruf-testing-sqlite-')));
57
+ const directory = resources.use(await new TemporaryFiles().directory('zukhruf-testing-sqlite-'));
59
58
  const path = join(directory.path, 'test.sqlite');
60
59
  const connection = resources.use(new DatabaseSync(path));
61
60
  const owned = resources.move();
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/databases/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASpD,uEAAuE;AACvE,MAAM,OAAO,MAAM;IACjB,0FAA0F;IAC1F,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,UAAkB;QAC9C,MAAM,MAAM,GAAG,KAAK,CAClB,OAAO,CAAC,QAAQ,EAChB;YACE,qBAAqB;YACrB,QAAQ;YACR;;;;;;;;;;;SAWC;YACD,IAAI;YACJ,MAAM,CAAC,UAAU,CAAC;SACnB,EACD,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAC/C,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IACE,CAAC,MAAM;oBACP,CAAC,CAAC,KAAK,YAAY,eAAe,CAAC;oBACnC,KAAK,CAAC,UAAU,KAAK,SAAS;oBAE9B,MAAM,KAAK,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,YAAY,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAC7B,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CACnE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE3C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACvE,CAAC;CACF"}
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/databases/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAS1D,uEAAuE;AACvE,MAAM,OAAO,MAAM;IACjB,0FAA0F;IAC1F,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,UAAkB;QAC9C,MAAM,MAAM,GAAG,KAAK,CAClB,OAAO,CAAC,QAAQ,EAChB;YACE,qBAAqB;YACrB,QAAQ;YACR;;;;;;;;;;;SAWC;YACD,IAAI;YACJ,MAAM,CAAC,UAAU,CAAC;SACnB,EACD,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAC/C,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IACE,CAAC,MAAM;oBACP,CAAC,CAAC,KAAK,YAAY,eAAe,CAAC;oBACnC,KAAK,CAAC,UAAU,KAAK,SAAS;oBAE9B,MAAM,KAAK,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,YAAY,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAC7B,MAAM,IAAI,cAAc,EAAE,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAChE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE3C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACvE,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { Collector } from './collector.ts';
2
+ export interface SqlServerServer {
3
+ host: string;
4
+ port: number;
5
+ password: string;
6
+ }
7
+ export declare const connectionString: ({ host, port, password }: SqlServerServer, database: string) => string;
8
+ /**
9
+ * Speaks to the server with the `mssql` driver: the `azure-sql-edge` image
10
+ * has no `sqlcmd` to exec.
11
+ */
12
+ export declare const sqlserver: Collector<SqlServerServer>;
13
+ //# sourceMappingURL=sqlserver-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlserver-collector.d.ts","sourceRoot":"","sources":["../../src/databases/sqlserver-collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,gBAAgB,GAC3B,0BAA0B,eAAe,EACzC,UAAU,MAAM,KACf,MACuH,CAAC;AAe3H;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,eAAe,CAgChD,CAAC"}
@@ -0,0 +1,42 @@
1
+ import sql from 'mssql';
2
+ export const connectionString = ({ host, port, password }, database) => `Server=${host},${port};Database=${database};User Id=sa;Password=${password};TrustServerCertificate=true;Encrypt=false;`;
3
+ async function query(server, text) {
4
+ const pool = new sql.ConnectionPool(connectionString(server, 'master'));
5
+ try {
6
+ await pool.connect();
7
+ return (await pool.request().query(text)).recordset;
8
+ }
9
+ finally {
10
+ await pool.close().catch(() => { });
11
+ }
12
+ }
13
+ /**
14
+ * Speaks to the server with the `mssql` driver: the `azure-sql-edge` image
15
+ * has no `sqlcmd` to exec.
16
+ */
17
+ export const sqlserver = {
18
+ kind: 'sqlserver',
19
+ async open(container, environment, host) {
20
+ const password = environment.MSSQL_SA_PASSWORD;
21
+ if (password === undefined)
22
+ throw new Error(`The sqlserver server ${container.id} has no MSSQL_SA_PASSWORD`);
23
+ const published = await container.port(1433);
24
+ if (!published)
25
+ throw new Error(`Container ${container.id} publishes no port for 1433`);
26
+ const forward = await host.forward(published.port);
27
+ return {
28
+ host: '127.0.0.1',
29
+ port: forward.port,
30
+ password,
31
+ [Symbol.asyncDispose]: forward.close,
32
+ };
33
+ },
34
+ async list(server) {
35
+ const rows = await query(server, "SELECT name FROM sys.databases WHERE name LIKE 'test%'");
36
+ return rows.map(({ name }) => String(name));
37
+ },
38
+ async drop(server, name) {
39
+ await query(server, `IF DB_ID('${name}') IS NOT NULL BEGIN ALTER DATABASE [${name}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [${name}]; END`);
40
+ },
41
+ };
42
+ //# sourceMappingURL=sqlserver-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlserver-collector.js","sourceRoot":"","sources":["../../src/databases/sqlserver-collector.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAUxB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAmB,EACzC,QAAgB,EACR,EAAE,CACV,UAAU,IAAI,IAAI,IAAI,aAAa,QAAQ,wBAAwB,QAAQ,6CAA6C,CAAC;AAE3H,KAAK,UAAU,KAAK,CAClB,MAAuB,EACvB,IAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAA+B;IACnD,IAAI,EAAE,WAAW;IACjB,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI;QACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,iBAAiB,CAAC;QAC/C,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CACb,wBAAwB,SAAS,CAAC,EAAE,2BAA2B,CAChE,CAAC;QACJ,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS;YACZ,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ;YACR,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,KAAK;SACrC,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM;QACf,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,MAAM,EACN,wDAAwD,CACzD,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI;QACrB,MAAM,KAAK,CACT,MAAM,EACN,aAAa,IAAI,wCAAwC,IAAI,6DAA6D,IAAI,QAAQ,CACvI,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlserver.d.ts","sourceRoot":"","sources":["../../src/databases/sqlserver.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,qBAAqB,+CACY,CAAC;AAC/C,eAAO,MAAM,qBAAqB,4CAA4C,CAAC;AAE/E,4FAA4F;AAC5F,qBAAa,SAAS;;gBAWR,EACV,WAAW,EACX,KAAK,EACL,QAA+B,EAC/B,QAAmB,EACnB,MAAM,GACP,EAAE,eAAe;IAKlB,mEAAmE;IAC7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAmBnC,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;CA+GjC"}
1
+ {"version":3,"file":"sqlserver.d.ts","sourceRoot":"","sources":["../../src/databases/sqlserver.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAO/D,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,qBAAqB,+CACY,CAAC;AAC/C,eAAO,MAAM,qBAAqB,4CAA4C,CAAC;AAE/E,4FAA4F;AAC5F,qBAAa,SAAS;;gBAYR,EACV,WAAW,EACX,KAAK,EACL,QAA+B,EAC/B,QAAmB,EACnB,MAAM,GACP,EAAE,eAAe;IAMlB,mEAAmE;IAC7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAqBnC,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;CA8FjC"}
@@ -1,13 +1,16 @@
1
- import { randomUUID } from 'node:crypto';
2
1
  import sql from 'mssql';
3
2
  import pMemoize from 'p-memoize';
4
3
  import { timebox } from "../async/timebox.js";
5
4
  import { DockerFixtures } from "../docker/fixtures.js";
5
+ import { TestRun } from "../docker/test-run.js";
6
+ import { KIND_LABEL, databaseName } from "./collector.js";
7
+ import { connectionString, sqlserver, } from "./sqlserver-collector.js";
6
8
  export const SQL_SERVER_FULL_IMAGE = 'mcr.microsoft.com/mssql/server:2022-latest';
7
9
  export const SQL_SERVER_EDGE_IMAGE = 'mcr.microsoft.com/azure-sql-edge:latest';
8
10
  /** SQL Server test configuration. Without an image, the engine's architecture picks one. */
9
11
  export class SqlServer {
10
12
  #docker;
13
+ #run;
11
14
  #options;
12
15
  #image = pMemoize(async () => {
13
16
  if (this.#options.image)
@@ -19,18 +22,22 @@ export class SqlServer {
19
22
  });
20
23
  constructor({ environment, image, password = 'StrongP@ssw0rd123!', database = 'testdb', labels, }) {
21
24
  this.#docker = new DockerFixtures({ environment });
25
+ this.#run = TestRun.fromEnvironment(environment);
22
26
  this.#options = { image, password, database, labels };
23
27
  }
24
28
  /** Create an isolated database on the persistent shared server. */
25
29
  async database() {
26
30
  const image = await this.#image();
27
31
  const container = await this.#acquire(image, 'reuse');
28
- const database = `test_${randomUUID().replaceAll('-', '')}`;
32
+ const database = databaseName(this.#run);
29
33
  try {
30
34
  await this.#createDatabase(container, database);
31
35
  return this.#handle(container, image, database, async () => {
32
36
  try {
33
- await this.#dropDatabase(container, database);
37
+ await sqlserver.drop(this.#server(container), database);
38
+ }
39
+ catch {
40
+ // Best-effort: the run's cleanup drops a database that disposal left.
34
41
  }
35
42
  finally {
36
43
  await container.disconnect();
@@ -56,8 +63,11 @@ export class SqlServer {
56
63
  throw error;
57
64
  }
58
65
  }
66
+ #server({ host, port }) {
67
+ return { host, port, password: this.#options.password };
68
+ }
59
69
  #connectionString(container, database) {
60
- return `Server=${container.host},${container.port};Database=${database};User Id=sa;Password=${this.#options.password};TrustServerCertificate=true;Encrypt=false;`;
70
+ return connectionString(this.#server(container), database);
61
71
  }
62
72
  async #ping(container) {
63
73
  const pool = new sql.ConnectionPool(`${this.#connectionString(container, 'master')}connectionTimeout=1000;requestTimeout=1000;`);
@@ -81,26 +91,11 @@ export class SqlServer {
81
91
  await pool.close();
82
92
  }
83
93
  }
84
- async #dropDatabase(container, database) {
85
- const pool = new sql.ConnectionPool(this.#connectionString(container, 'master'));
86
- try {
87
- await pool.connect();
88
- await pool
89
- .request()
90
- .query(`IF DB_ID('${database}') IS NOT NULL BEGIN ALTER DATABASE [${database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [${database}]; END`);
91
- }
92
- catch {
93
- // Best-effort cleanup; a leaked database lasts until container removal.
94
- }
95
- finally {
96
- await pool.close().catch(() => { });
97
- }
98
- }
99
94
  #acquire(image, mode) {
100
95
  const { password, labels } = this.#options;
101
96
  return this.#docker[mode]({
102
97
  image,
103
- labels,
98
+ labels: { ...labels, [KIND_LABEL]: sqlserver.kind },
104
99
  env: {
105
100
  ACCEPT_EULA: 'Y',
106
101
  MSSQL_SA_PASSWORD: password,
@@ -1 +1 @@
1
- {"version":3,"file":"sqlserver.js","sourceRoot":"","sources":["../../src/databases/sqlserver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlserver.js","sourceRoot":"","sources":["../../src/databases/sqlserver.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import type { ServiceContainer } from '../docker/service-container.ts';
1
+ import type { Container } from '@zukhruf/docker';
2
2
  /**
3
- * Runs `command` in the server's container and gives its standard output.
3
+ * Runs `command` in `container` and gives its standard output.
4
4
  * A non-zero exit code rejects with the output of the command.
5
5
  */
6
- export declare function succeeded({ container }: ServiceContainer, command: string[]): Promise<string>;
6
+ export declare function succeeded(container: Container, command: string[]): Promise<string>;
7
7
  //# sourceMappingURL=succeeded.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"succeeded.d.ts","sourceRoot":"","sources":["../../src/databases/succeeded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAC/B,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,MAAM,CAAC,CAKjB"}
1
+ {"version":3,"file":"succeeded.d.ts","sourceRoot":"","sources":["../../src/databases/succeeded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,MAAM,CAAC,CAKjB"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Runs `command` in the server's container and gives its standard output.
2
+ * Runs `command` in `container` and gives its standard output.
3
3
  * A non-zero exit code rejects with the output of the command.
4
4
  */
5
- export async function succeeded({ container }, command) {
5
+ export async function succeeded(container, command) {
6
6
  const { exitCode, stdout, output } = await container.exec({ Cmd: command });
7
7
  if (exitCode !== 0)
8
8
  throw new Error(`${command[0]} exited with ${exitCode}: ${output}`);
@@ -1 +1 @@
1
- {"version":3,"file":"succeeded.js","sourceRoot":"","sources":["../../src/databases/succeeded.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAE,SAAS,EAAoB,EAC/B,OAAiB;IAEjB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,IAAI,QAAQ,KAAK,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"succeeded.js","sourceRoot":"","sources":["../../src/databases/succeeded.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAoB,EACpB,OAAiB;IAEjB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,IAAI,QAAQ,KAAK,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface TemporaryDirectory extends AsyncDisposable {
2
+ /** The real path: symbolic links are resolved. */
3
+ path: string;
4
+ /** Remove the directory and its contents, with retries for a file that is held open. */
5
+ cleanup: () => Promise<void>;
6
+ }
7
+ export interface TemporaryDirectoryOptions {
8
+ /** The directory that holds the new directory. Default: `os.tmpdir()`. */
9
+ parent?: string;
10
+ }
11
+ /** Each acquisition owns an empty directory, removed with all that it holds. */
12
+ export declare class TemporaryFiles {
13
+ directory(prefix: string, { parent }?: TemporaryDirectoryOptions): Promise<TemporaryDirectory>;
14
+ }
15
+ //# sourceMappingURL=temporary-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-files.d.ts","sourceRoot":"","sources":["../../src/fs/temporary-files.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gFAAgF;AAChF,qBAAa,cAAc;IACnB,SAAS,CACb,MAAM,EAAE,MAAM,EACd,EAAE,MAAiB,EAAE,GAAE,yBAA8B,GACpD,OAAO,CAAC,kBAAkB,CAAC;CAiB/B"}
@@ -0,0 +1,21 @@
1
+ import { mkdtemp, realpath, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ /** Each acquisition owns an empty directory, removed with all that it holds. */
5
+ export class TemporaryFiles {
6
+ async directory(prefix, { parent = tmpdir() } = {}) {
7
+ await using resources = new AsyncDisposableStack();
8
+ const created = await mkdtemp(join(parent, prefix));
9
+ resources.defer(() => rm(created, {
10
+ recursive: true,
11
+ force: true,
12
+ maxRetries: 8,
13
+ retryDelay: 50,
14
+ }));
15
+ const path = await realpath(created);
16
+ const owned = resources.move();
17
+ const cleanup = () => owned.disposeAsync();
18
+ return { path, cleanup, [Symbol.asyncDispose]: cleanup };
19
+ }
20
+ }
21
+ //# sourceMappingURL=temporary-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-files.js","sourceRoot":"","sources":["../../src/fs/temporary-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,gFAAgF;AAChF,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,SAAS,CACb,MAAc,EACd,EAAE,MAAM,GAAG,MAAM,EAAE,KAAgC,EAAE;QAErD,YAAY,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CACnB,EAAE,CAAC,OAAO,EAAE;YACV,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,EAAE;SACf,CAAC,CACH,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3D,CAAC;CACF"}
@@ -10,14 +10,8 @@ export interface HttpServerHandle extends AsyncDisposable {
10
10
  /** Stop accepting requests and close active HTTP connections. */
11
11
  cleanup: () => Promise<void>;
12
12
  }
13
- /** A server whose scope is the process: nothing disposes it. */
14
- export interface BackgroundHttpServer {
15
- origin: string;
16
- }
17
13
  /** Each acquisition owns a loopback HTTP server on an available port. */
18
14
  export declare class HttpServer {
19
15
  start(handler: HttpHandler): Promise<HttpServerHandle>;
20
- /** Serves until the process exits and never keeps it running, even while a connection is open. */
21
- background(handler: HttpHandler): Promise<BackgroundHttpServer>;
22
16
  }
23
17
  //# sourceMappingURL=http-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/http/http-server.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EAEpB,MAAM,WAAW,CAAC;AAEnB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,KACrB,OAAO,CAAC;AAEb,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,gEAAgE;AAChE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yEAAyE;AACzE,qBAAa,UAAU;IACf,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsB5D,kGAAkG;IAC5F,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAOtE"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/http/http-server.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,cAAc,EAEpB,MAAM,WAAW,CAAC;AAEnB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,KACrB,OAAO,CAAC;AAEb,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,yEAAyE;AACzE,qBAAa,UAAU;IACf,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAqB7D"}
@@ -22,14 +22,6 @@ export class HttpServer {
22
22
  [Symbol.asyncDispose]: cleanup,
23
23
  };
24
24
  }
25
- /** Serves until the process exits and never keeps it running, even while a connection is open. */
26
- async background(handler) {
27
- const server = serve(handler);
28
- server.on('connection', (socket) => socket.unref());
29
- await listen(server);
30
- server.unref();
31
- return { origin: originOf(server) };
32
- }
33
25
  }
34
26
  function serve(handler) {
35
27
  return createServer((request, response) => {
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/http/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAIL,YAAY,GACb,MAAM,WAAW,CAAC;AAuBnB,yEAAyE;AACzE,MAAM,OAAO,UAAU;IACrB,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,YAAY,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAErB,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,MAAM;YACN,OAAO;YACP,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO;SAC/B,CAAC;IACJ,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,UAAU,CAAC,OAAoB;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACtC,CAAC;CACF;AAED,SAAS,KAAK,CAAC,OAAoB;IACjC,OAAO,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QACxC,KAAK,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,MAAc;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC9B,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC;IAC/C,OAAO,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/http/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAIL,YAAY,GACb,MAAM,WAAW,CAAC;AAkBnB,yEAAyE;AACzE,MAAM,OAAO,UAAU;IACrB,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,YAAY,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAErB,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,MAAM;YACN,OAAO;YACP,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO;SAC/B,CAAC;IACJ,CAAC;CACF;AAED,SAAS,KAAK,CAAC,OAAoB;IACjC,OAAO,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QACxC,KAAK,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,MAAc;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC9B,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC;IAC/C,OAAO,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { AnyHandler } from 'msw';
2
+ import { type SetupServer } from 'msw/node';
3
+ export interface MswInterception extends Disposable {
4
+ /** For `server.use()` in a part of the test. */
5
+ server: SetupServer;
6
+ /** A clone of each request that the server receives, in the order of arrival. */
7
+ requests: Request[];
8
+ /** Close the server. */
9
+ cleanup: () => void;
10
+ }
11
+ /** Each acquisition owns an msw server that fails each request no handler answers. */
12
+ export declare class Msw {
13
+ intercept(...handlers: AnyHandler[]): MswInterception;
14
+ }
15
+ //# sourceMappingURL=msw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msw.d.ts","sourceRoot":"","sources":["../../src/msw/msw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,UAAU,CAAC;AAEzD,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,iFAAiF;IACjF,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,wBAAwB;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,sFAAsF;AACtF,qBAAa,GAAG;IACd,SAAS,CAAC,GAAG,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe;CAatD"}
@@ -0,0 +1,17 @@
1
+ import { setupServer } from 'msw/node';
2
+ /** Each acquisition owns an msw server that fails each request no handler answers. */
3
+ export class Msw {
4
+ intercept(...handlers) {
5
+ const server = setupServer(...handlers);
6
+ const requests = [];
7
+ server.events.on('request:start', ({ request }) => {
8
+ requests.push(request.clone());
9
+ });
10
+ server.listen({ onUnhandledFrame: 'error' });
11
+ const owned = new DisposableStack();
12
+ owned.defer(() => server.close());
13
+ const cleanup = () => owned.dispose();
14
+ return { server, requests, cleanup, [Symbol.dispose]: cleanup };
15
+ }
16
+ }
17
+ //# sourceMappingURL=msw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msw.js","sourceRoot":"","sources":["../../src/msw/msw.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,UAAU,CAAC;AAWzD,sFAAsF;AACtF,MAAM,OAAO,GAAG;IACd,SAAS,CAAC,GAAG,QAAsB;QACjC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAChD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IAClE,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-cleanup.d.ts","sourceRoot":"","sources":["../../src/scripts/run-cleanup.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAWzC,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C,gDAAgD;AAChD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AASD;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf"}
1
+ {"version":3,"file":"run-cleanup.d.ts","sourceRoot":"","sources":["../../src/scripts/run-cleanup.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiBzD,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C,gDAAgD;AAChD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAiHD;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAED,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -1,14 +1,109 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
1
9
  import { execFile } from 'node:child_process';
2
10
  import { readFile, readdir, rm } from 'node:fs/promises';
3
11
  import { join } from 'node:path';
4
12
  import { promisify } from 'node:util';
5
13
  import { Docker } from '@zukhruf/docker';
14
+ import { KIND_LABEL, ownedBy, } from "../databases/collector.js";
6
15
  import { SHARED_SERVER_LABEL } from "../docker/fixtures.js";
7
16
  import { DockerHost, SHELL_TIMEOUT, quote } from "../docker/host.js";
8
17
  import { TEST_RUN_LABEL, TestRun, directoryPrefix, forwardPrefix, } from "../docker/test-run.js";
9
18
  /** How long one Engine API call of the cleanup may take. */
10
19
  export const ENGINE_CALL_TIMEOUT = 240_000;
11
20
  const execute = promisify(execFile);
21
+ const codeOf = (error) => error instanceof Error && 'code' in error ? error.code : undefined;
22
+ /**
23
+ * The collector of each kind, loaded when a server of the kind runs. A
24
+ * driver is an optional peer dependency: without it, the run's test
25
+ * processes could not create a database of the kind.
26
+ */
27
+ const collectors = {
28
+ postgres: {
29
+ load: async () => (await import("../databases/postgres-collector.js")).postgres,
30
+ },
31
+ mysql: {
32
+ load: async () => (await import("../databases/mysql-family-collector.js")).mysql,
33
+ },
34
+ mariadb: {
35
+ load: async () => (await import("../databases/mysql-family-collector.js")).mariadb,
36
+ },
37
+ sqlserver: {
38
+ driver: 'mssql',
39
+ load: async () => (await import("../databases/sqlserver-collector.js")).sqlserver,
40
+ },
41
+ };
42
+ const isKind = (value) => value !== undefined && Object.hasOwn(collectors, value);
43
+ /** The collector of `kind`, or undefined when its driver is not installed. */
44
+ async function collectorOf(kind) {
45
+ const { driver, load } = collectors[kind];
46
+ if (driver !== undefined)
47
+ try {
48
+ await import(__rewriteRelativeImportExtension(driver));
49
+ }
50
+ catch (error) {
51
+ if (codeOf(error) === 'ERR_MODULE_NOT_FOUND')
52
+ return undefined;
53
+ throw error;
54
+ }
55
+ return load();
56
+ }
57
+ const running = async (container) => (await container.inspect().catch(() => undefined))?.State?.Running === true;
58
+ /**
59
+ * Drops the run's databases on each running shared server of a database
60
+ * fixture. A server that stops takes its databases with it. A server that
61
+ * does not answer yet holds none: a fixture creates a database only after
62
+ * the server answered its readiness check.
63
+ */
64
+ async function dropDatabases(engine, host, runId, signal) {
65
+ for (const summary of await engine.containers.list({
66
+ filters: { label: [`${SHARED_SERVER_LABEL}=1`, KIND_LABEL] },
67
+ signal: signal(),
68
+ })) {
69
+ const kind = summary.Labels?.[KIND_LABEL];
70
+ if (!isKind(kind))
71
+ continue;
72
+ const collector = await collectorOf(kind);
73
+ if (!collector)
74
+ continue;
75
+ const container = await engine.containers.find(summary.Id, {
76
+ signal: signal(),
77
+ });
78
+ if (!container)
79
+ continue;
80
+ const inspected = await container.inspect({ signal: signal() });
81
+ if (!inspected.State?.Running)
82
+ continue;
83
+ const environment = Object.fromEntries((inspected.Config?.Env ?? []).map((entry) => {
84
+ const separator = entry.indexOf('=');
85
+ return [entry.slice(0, separator), entry.slice(separator + 1)];
86
+ }));
87
+ await using connection = new AsyncDisposableStack();
88
+ let server;
89
+ let names;
90
+ try {
91
+ server = connection.use(await collector.open(container, environment, host));
92
+ names = await collector.list(server);
93
+ }
94
+ catch {
95
+ continue;
96
+ }
97
+ for (const name of names.filter(ownedBy(runId)))
98
+ try {
99
+ await collector.drop(server, name);
100
+ }
101
+ catch (error) {
102
+ if (await running(container))
103
+ throw error;
104
+ }
105
+ }
106
+ }
12
107
  async function readRecordedPath(file) {
13
108
  const { path } = JSON.parse(await readFile(file, 'utf8'));
14
109
  return path;
@@ -62,6 +157,7 @@ export async function cleanup(engine, previous, directory) {
62
157
  await rm(path, { recursive: true, force: true });
63
158
  }
64
159
  }
160
+ await dropDatabases(engine, host, previous.id, signal);
65
161
  }
66
162
  /** Connects to the run's engine, cleans the run, and ends the connection. */
67
163
  export async function connectAndCleanup(previous, directory) {