velocious 1.0.698 → 1.0.700
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/README.md +2 -2
- package/build/configuration-types.js +23 -0
- package/build/configuration.js +136 -1
- package/build/database/advisory-lock-backend-policy.js +204 -0
- package/build/database/advisory-lock-file-backend.js +348 -0
- package/build/database/advisory-lock-runner.js +239 -16
- package/build/database/drivers/base.js +318 -15
- package/build/database/drivers/mssql/index.js +1 -1
- package/build/database/drivers/mysql/index.js +4 -2
- package/build/database/drivers/pgsql/index.js +4 -2
- package/build/database/drivers/sqlite/base.js +13 -129
- package/build/database/drivers/sqlite/index.js +41 -62
- package/build/database/migrator.js +120 -50
- package/build/database/record/attachments/store.js +84 -1
- package/build/environment-handlers/base.js +13 -0
- package/build/environment-handlers/node.js +11 -0
- package/build/http-server/server-lock.js +21 -115
- package/build/src/configuration-types.d.ts +68 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +21 -1
- package/build/src/configuration.d.ts +100 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +124 -2
- package/build/src/database/advisory-lock-backend-policy.d.ts +145 -0
- package/build/src/database/advisory-lock-backend-policy.d.ts.map +1 -0
- package/build/src/database/advisory-lock-backend-policy.js +184 -0
- package/build/src/database/advisory-lock-file-backend.d.ts +194 -0
- package/build/src/database/advisory-lock-file-backend.d.ts.map +1 -0
- package/build/src/database/advisory-lock-file-backend.js +313 -0
- package/build/src/database/advisory-lock-runner.d.ts +116 -15
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
- package/build/src/database/advisory-lock-runner.js +190 -17
- package/build/src/database/drivers/base.d.ts +125 -4
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +282 -17
- package/build/src/database/drivers/mssql/index.d.ts +1 -1
- package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/index.js +2 -2
- package/build/src/database/drivers/mysql/index.d.ts +4 -2
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +5 -3
- package/build/src/database/drivers/pgsql/index.d.ts +4 -2
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.js +5 -3
- package/build/src/database/drivers/sqlite/base.d.ts +11 -49
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.js +14 -114
- package/build/src/database/drivers/sqlite/index.d.ts +28 -19
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +41 -59
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/migrator.js +110 -56
- package/build/src/database/record/attachments/store.d.ts +0 -3
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +71 -2
- package/build/src/environment-handlers/base.d.ts +14 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +13 -1
- package/build/src/environment-handlers/node.d.ts +11 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +11 -1
- package/build/src/http-server/server-lock.d.ts +13 -37
- package/build/src/http-server/server-lock.d.ts.map +1 -1
- package/build/src/http-server/server-lock.js +22 -109
- package/build/src/testing/test-runner.d.ts +74 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +140 -1
- package/build/src/testing/test-tenant-database-pool.d.ts +183 -0
- package/build/src/testing/test-tenant-database-pool.d.ts.map +1 -0
- package/build/src/testing/test-tenant-database-pool.js +388 -0
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
- package/build/src/testing/velocious-attempt-executor.js +43 -1
- package/build/testing/test-runner.js +152 -0
- package/build/testing/test-tenant-database-pool.js +438 -0
- package/build/testing/velocious-attempt-executor.js +44 -0
- package/package.json +1 -1
- package/src/configuration-types.js +23 -0
- package/src/configuration.js +136 -1
- package/src/database/advisory-lock-backend-policy.js +204 -0
- package/src/database/advisory-lock-file-backend.js +348 -0
- package/src/database/advisory-lock-runner.js +239 -16
- package/src/database/drivers/base.js +318 -15
- package/src/database/drivers/mssql/index.js +1 -1
- package/src/database/drivers/mysql/index.js +4 -2
- package/src/database/drivers/pgsql/index.js +4 -2
- package/src/database/drivers/sqlite/base.js +13 -129
- package/src/database/drivers/sqlite/index.js +41 -62
- package/src/database/migrator.js +120 -50
- package/src/database/record/attachments/store.js +84 -1
- package/src/environment-handlers/base.js +13 -0
- package/src/environment-handlers/node.js +11 -0
- package/src/http-server/server-lock.js +21 -115
- package/src/testing/test-runner.js +152 -0
- package/src/testing/test-tenant-database-pool.js +438 -0
- package/src/testing/velocious-attempt-executor.js +44 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
export type TestTenantPoolConfiguration = import("../configuration-types.js").TestTenantPoolConfiguration;
|
|
2
|
+
export type TestTenantPoolLease = {
|
|
3
|
+
/**
|
|
4
|
+
* - Tenant database identifier the lease belongs to.
|
|
5
|
+
*/
|
|
6
|
+
databaseIdentifier: string;
|
|
7
|
+
/**
|
|
8
|
+
* - The pool member's tenant descriptor.
|
|
9
|
+
*/
|
|
10
|
+
tenant: ReturnType<typeof JSON.parse>;
|
|
11
|
+
/**
|
|
12
|
+
* - Internal pool member backing the lease.
|
|
13
|
+
*/
|
|
14
|
+
member: TestTenantPoolMember;
|
|
15
|
+
};
|
|
16
|
+
export type TestTenantPoolMember = {
|
|
17
|
+
/**
|
|
18
|
+
* - Whether the member is currently held by a lease.
|
|
19
|
+
*/
|
|
20
|
+
leased: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* - Tenant descriptor resolved by the app's tenantDatabaseResolver.
|
|
23
|
+
*/
|
|
24
|
+
tenant: ReturnType<typeof JSON.parse>;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Reusable pool of pre-provisioned test tenant databases (STC-135 "keep a couple for
|
|
28
|
+
* re-use"). Instead of create + full structure load + drop per test, the pool provisions
|
|
29
|
+
* N tenant databases once per suite and resets each one between tests with
|
|
30
|
+
* truncate + migration-ledger baseline — the framework generalization of the
|
|
31
|
+
* captured-structure fast path consuming apps had to hand-roll.
|
|
32
|
+
*
|
|
33
|
+
* Provisioning runs the tenant provider's `createDatabase` hook (or the framework
|
|
34
|
+
* default provisioning), then loads the default database's captured structure SQL in
|
|
35
|
+
* one pass via {@link StructureSqlLoader} and baselines the tenant's
|
|
36
|
+
* `schema_migrations` ledger from the default database. Apps whose tenant schema
|
|
37
|
+
* differs from the default database (subset tables, FK-free clones) override
|
|
38
|
+
* `provisionTenant`/`resetTenant` in the pool configuration.
|
|
39
|
+
*
|
|
40
|
+
* Leases are deterministic: acquisition takes the first free member in configured
|
|
41
|
+
* order, so a suite that acquires and releases one lease per test reuses the same
|
|
42
|
+
* members in the same order. Acquisition is synchronous after provisioning, so
|
|
43
|
+
* concurrent acquires can never double-lease one member; exhaustion throws instead
|
|
44
|
+
* of queueing, because a test that holds a lease while waiting would deadlock the
|
|
45
|
+
* single-threaded runner.
|
|
46
|
+
*/
|
|
47
|
+
export default class TestTenantDatabasePool {
|
|
48
|
+
configuration: import("../configuration.js").default;
|
|
49
|
+
databaseIdentifier: string;
|
|
50
|
+
poolConfiguration: import("../configuration-types.js").TestTenantPoolConfiguration;
|
|
51
|
+
/** @type {TestTenantPoolMember[]} */
|
|
52
|
+
members: TestTenantPoolMember[];
|
|
53
|
+
/** @type {Map<string, TestTenantPoolMember>} */
|
|
54
|
+
membersByTenantKey: Map<string, TestTenantPoolMember>;
|
|
55
|
+
/** @type {Promise<void> | undefined} */
|
|
56
|
+
provisioningPromise: Promise<void> | undefined;
|
|
57
|
+
/** @type {Promise<string | null> | undefined} */
|
|
58
|
+
structureSqlPromise: Promise<string | null> | undefined;
|
|
59
|
+
dropped: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Creates a pool for one tenant database identifier.
|
|
62
|
+
* @param {object} args - Pool arguments.
|
|
63
|
+
* @param {import("../configuration.js").default} args.configuration - Configuration owning the tenant resolver.
|
|
64
|
+
* @param {string} args.databaseIdentifier - Tenant-only database identifier to pool.
|
|
65
|
+
* @param {TestTenantPoolConfiguration} args.poolConfiguration - Pool size (via `tenants`) and optional provisioning overrides.
|
|
66
|
+
*/
|
|
67
|
+
constructor({ configuration, databaseIdentifier, poolConfiguration }: {
|
|
68
|
+
configuration: import("../configuration.js").default;
|
|
69
|
+
databaseIdentifier: string;
|
|
70
|
+
poolConfiguration: TestTenantPoolConfiguration;
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* Number of pool members.
|
|
74
|
+
* @returns {number} - Pool size.
|
|
75
|
+
*/
|
|
76
|
+
size(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Acquires one pool member as a lease. The first free member in configured order is
|
|
79
|
+
* taken; when every member is leased the acquisition fails loudly instead of queueing.
|
|
80
|
+
* @param {{tenant?: ReturnType<typeof JSON.parse>}} [args] - Optional explicit pool tenant to pin.
|
|
81
|
+
* @returns {Promise<TestTenantPoolLease>} - Held lease; pass it to {@link release}.
|
|
82
|
+
*/
|
|
83
|
+
acquire({ tenant }?: {
|
|
84
|
+
tenant?: ReturnType<typeof JSON.parse>;
|
|
85
|
+
}): Promise<TestTenantPoolLease>;
|
|
86
|
+
/**
|
|
87
|
+
* Resets a leased member (truncate + ledger baseline, or the configured `resetTenant`
|
|
88
|
+
* override) and returns it to the free pool. Idempotent for an already-free member.
|
|
89
|
+
* A failed reset is followed by a full re-provision so a corrupted member cannot be
|
|
90
|
+
* handed to the next test; if re-provisioning also fails the member stays leased and
|
|
91
|
+
* the aggregated error is thrown.
|
|
92
|
+
* @param {TestTenantPoolLease} lease - Lease returned by {@link acquire}.
|
|
93
|
+
* @returns {Promise<void>} - Resolves once the member is clean and free again.
|
|
94
|
+
*/
|
|
95
|
+
release(lease: TestTenantPoolLease): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Drops every pool member's tenant database through the provider's `dropDatabase`
|
|
98
|
+
* hook (or the framework default) and closes the pool. Idempotent.
|
|
99
|
+
* @returns {Promise<void>} - Resolves after all members were dropped.
|
|
100
|
+
*/
|
|
101
|
+
teardown(): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Provisions every member exactly once (concurrent acquisitions share one
|
|
104
|
+
* provisioning pass).
|
|
105
|
+
* @returns {Promise<void>} - Resolves when all members are provisioned.
|
|
106
|
+
*/
|
|
107
|
+
ensureProvisioned(): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Provisions one member: creates the physical tenant database, then loads or clones
|
|
110
|
+
* the default database's structure and baselines the ledger.
|
|
111
|
+
* @param {TestTenantPoolMember} member - Pool member to provision.
|
|
112
|
+
* @returns {Promise<void>} - Resolves when the member's tenant database is ready.
|
|
113
|
+
*/
|
|
114
|
+
provisionMember(member: TestTenantPoolMember): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Creates the physical tenant database via the provider's `createDatabase` hook or
|
|
117
|
+
* the framework default provisioning.
|
|
118
|
+
* @param {TestTenantPoolMember} member - Pool member whose database must exist.
|
|
119
|
+
* @returns {Promise<void>} - Resolves when the tenant database exists.
|
|
120
|
+
*/
|
|
121
|
+
createTenantDatabaseForMember(member: TestTenantPoolMember): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Loads the captured default-database structure into the current tenant connection
|
|
124
|
+
* and baselines its ledger. Drivers without a structure-SQL generator fall back to
|
|
125
|
+
* {@link SchemaCloner} over every default table.
|
|
126
|
+
* @param {Record<string, import("../database/drivers/base.js").default>} dbs - Active connections (must include `default` and the pool identifier).
|
|
127
|
+
* @returns {Promise<void>} - Resolves when the tenant schema and ledger are baselined.
|
|
128
|
+
*/
|
|
129
|
+
applyDefaultStructure(dbs: Record<string, import("../database/drivers/base.js").default>): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Resets one member between tests: truncate every tenant table (the ledger table is
|
|
132
|
+
* preserved by `truncateAllTables`) and re-baseline the ledger from the default
|
|
133
|
+
* database, so the next test starts from the same schema state without a structure load.
|
|
134
|
+
* @param {TestTenantPoolMember} member - Leased member to clean.
|
|
135
|
+
* @returns {Promise<void>} - Resolves when the member is empty and ledger-current.
|
|
136
|
+
*/
|
|
137
|
+
resetMember(member: TestTenantPoolMember): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Baselines a tenant connection's ledger from the default database. Skips when the
|
|
140
|
+
* default database has no ledger yet (nothing to baseline from).
|
|
141
|
+
* @param {import("../database/drivers/base.js").default} tenantDb - Tenant connection whose ledger is refreshed.
|
|
142
|
+
* @returns {Promise<void>} - Resolves when the ledger matches the default database.
|
|
143
|
+
*/
|
|
144
|
+
baselineLedger(tenantDb: import("../database/drivers/base.js").default): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Drops one member's tenant database through the provider's `dropDatabase` hook or
|
|
147
|
+
* the framework default.
|
|
148
|
+
* @param {TestTenantPoolMember} member - Pool member to drop.
|
|
149
|
+
* @returns {Promise<void>} - Resolves when the tenant database is gone.
|
|
150
|
+
*/
|
|
151
|
+
dropMember(member: TestTenantPoolMember): Promise<void>;
|
|
152
|
+
/**
|
|
153
|
+
* Captures the default database's structure SQL once per pool (the framework
|
|
154
|
+
* generalization of the consuming apps' captured-structure fast path). Returns null
|
|
155
|
+
* for drivers without a structure generator, which selects the SchemaCloner fallback.
|
|
156
|
+
* @returns {Promise<string | null>} - Captured structure SQL or null.
|
|
157
|
+
*/
|
|
158
|
+
capturedStructureSql(): Promise<string | null>;
|
|
159
|
+
/**
|
|
160
|
+
* Runs tenant connection.
|
|
161
|
+
* @param {Record<string, import("../database/drivers/base.js").default>} dbs - Active connections.
|
|
162
|
+
* @returns {import("../database/drivers/base.js").default} - The pool identifier's connection.
|
|
163
|
+
*/
|
|
164
|
+
tenantConnection(dbs: Record<string, import("../database/drivers/base.js").default>): import("../database/drivers/base.js").default;
|
|
165
|
+
/**
|
|
166
|
+
* Runs default connection.
|
|
167
|
+
* @param {Record<string, import("../database/drivers/base.js").default>} dbs - Active connections.
|
|
168
|
+
* @returns {import("../database/drivers/base.js").default} - The default connection (ledger baseline source).
|
|
169
|
+
*/
|
|
170
|
+
defaultConnection(dbs: Record<string, import("../database/drivers/base.js").default>): import("../database/drivers/base.js").default;
|
|
171
|
+
/**
|
|
172
|
+
* Runs with a dedicated physical connection for one member. The reset path truncates
|
|
173
|
+
* committed data, so it must not reuse a test-pinned or async-context connection that
|
|
174
|
+
* a later rollback would undo — it checks out through the pool exactly like
|
|
175
|
+
* `registerTransactionalTenant` does and releases the connection back to the pool.
|
|
176
|
+
* @param {ReturnType<typeof JSON.parse>} tenant - Pool member tenant descriptor.
|
|
177
|
+
* @template T
|
|
178
|
+
* @param {(db: import("../database/drivers/base.js").default) => Promise<T>} callback - Operation on the dedicated connection.
|
|
179
|
+
* @returns {Promise<T>} - Callback result.
|
|
180
|
+
*/
|
|
181
|
+
withMemberConnection<T>(tenant: ReturnType<typeof JSON.parse>, callback: (db: import("../database/drivers/base.js").default) => Promise<T>): Promise<T>;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=test-tenant-database-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-tenant-database-pool.d.ts","sourceRoot":"","sources":["../../../src/testing/test-tenant-database-pool.js"],"names":[],"mappings":"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"}
|