neon-testing 2.2.0 → 2.2.1-beta.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/README.md +121 -31
- package/dist/examples/branch-expiration.test.d.ts +2 -0
- package/dist/examples/branch-expiration.test.d.ts.map +1 -0
- package/dist/examples/branch-expiration.test.js +60 -0
- package/dist/examples/branch-expiration.test.js.map +1 -0
- package/dist/examples/drivers/http-neon-drizzle.test.d.ts +2 -0
- package/dist/examples/drivers/http-neon-drizzle.test.d.ts.map +1 -0
- package/dist/examples/drivers/http-neon-drizzle.test.js +80 -0
- package/dist/examples/drivers/http-neon-drizzle.test.js.map +1 -0
- package/dist/examples/drivers/http-neon.test.d.ts +2 -0
- package/dist/examples/drivers/http-neon.test.d.ts.map +1 -0
- package/dist/examples/drivers/http-neon.test.js +71 -0
- package/dist/examples/drivers/http-neon.test.js.map +1 -0
- package/dist/examples/drivers/tcp-pg-drizzle.test.d.ts +2 -0
- package/dist/examples/drivers/tcp-pg-drizzle.test.d.ts.map +1 -0
- package/dist/examples/drivers/tcp-pg-drizzle.test.js +90 -0
- package/dist/examples/drivers/tcp-pg-drizzle.test.js.map +1 -0
- package/dist/examples/drivers/tcp-pg.test.d.ts +2 -0
- package/dist/examples/drivers/tcp-pg.test.d.ts.map +1 -0
- package/dist/examples/drivers/tcp-pg.test.js +76 -0
- package/dist/examples/drivers/tcp-pg.test.js.map +1 -0
- package/dist/examples/drivers/tcp-postgres-drizzle.test.d.ts +2 -0
- package/dist/examples/drivers/tcp-postgres-drizzle.test.d.ts.map +1 -0
- package/dist/examples/drivers/tcp-postgres-drizzle.test.js +77 -0
- package/dist/examples/drivers/tcp-postgres-drizzle.test.js.map +1 -0
- package/dist/examples/drivers/tcp-postgres.test.d.ts +2 -0
- package/dist/examples/drivers/tcp-postgres.test.d.ts.map +1 -0
- package/dist/examples/drivers/tcp-postgres.test.js +69 -0
- package/dist/examples/drivers/tcp-postgres.test.js.map +1 -0
- package/dist/examples/drivers/ws-neon-drizzle.test.d.ts +2 -0
- package/dist/examples/drivers/ws-neon-drizzle.test.d.ts.map +1 -0
- package/dist/examples/drivers/ws-neon-drizzle.test.js +121 -0
- package/dist/examples/drivers/ws-neon-drizzle.test.js.map +1 -0
- package/dist/examples/drivers/ws-neon.test.d.ts +2 -0
- package/dist/examples/drivers/ws-neon.test.d.ts.map +1 -0
- package/dist/examples/drivers/ws-neon.test.js +97 -0
- package/dist/examples/drivers/ws-neon.test.js.map +1 -0
- package/dist/examples/isolated.test.d.ts +2 -0
- package/dist/examples/isolated.test.d.ts.map +1 -0
- package/dist/examples/isolated.test.js +114 -0
- package/dist/examples/isolated.test.js.map +1 -0
- package/dist/examples/minimal.test.d.ts +2 -0
- package/dist/examples/minimal.test.d.ts.map +1 -0
- package/dist/examples/minimal.test.js +19 -0
- package/dist/examples/minimal.test.js.map +1 -0
- package/dist/examples/neon-testing.d.ts +6 -0
- package/dist/examples/neon-testing.d.ts.map +1 -0
- package/dist/examples/neon-testing.js +8 -0
- package/dist/examples/neon-testing.js.map +1 -0
- package/dist/examples/options-validation.test.d.ts +2 -0
- package/dist/examples/options-validation.test.d.ts.map +1 -0
- package/dist/examples/options-validation.test.js +99 -0
- package/dist/examples/options-validation.test.js.map +1 -0
- package/dist/examples/recommended.test.d.ts +2 -0
- package/dist/examples/recommended.test.d.ts.map +1 -0
- package/dist/examples/recommended.test.js +17 -0
- package/dist/examples/recommended.test.js.map +1 -0
- package/dist/index.d.ts +45 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -22
- package/dist/index.js.map +1 -1
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +16 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// minimal.test.ts
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
import { makeNeonTesting } from "neon-testing";
|
|
4
|
+
import { Pool } from "@neondatabase/serverless";
|
|
5
|
+
// Enable Neon test branch for this test file
|
|
6
|
+
makeNeonTesting({
|
|
7
|
+
apiKey: process.env.NEON_API_KEY,
|
|
8
|
+
projectId: process.env.NEON_PROJECT_ID,
|
|
9
|
+
// Recommended for Neon WebSocket drivers to automatically close connections
|
|
10
|
+
autoCloseWebSockets: true,
|
|
11
|
+
})();
|
|
12
|
+
test("database operations", async () => {
|
|
13
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
14
|
+
await pool.query(`CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)`);
|
|
15
|
+
await pool.query(`INSERT INTO users (name) VALUES ('Ellen Ripley')`);
|
|
16
|
+
const users = await pool.query(`SELECT * FROM users`);
|
|
17
|
+
expect(users.rows).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=minimal.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimal.test.js","sourceRoot":"","sources":["../../examples/minimal.test.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,6CAA6C;AAC7C,eAAe,CAAC;IACd,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAa;IACjC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,eAAgB;IACvC,4EAA4E;IAC5E,mBAAmB,EAAE,IAAI;CAC1B,CAAC,EAAE,CAAC;AAEL,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC1E,MAAM,IAAI,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const neonTesting: {
|
|
2
|
+
(overrides?: import("neon-testing").NeonTestingOverrides): () => import("@neondatabase/api-client").Branch | undefined;
|
|
3
|
+
deleteAllTestBranches: () => Promise<void>;
|
|
4
|
+
api: import("@neondatabase/api-client").Api<unknown>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=neon-testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neon-testing.d.ts","sourceRoot":"","sources":["../../examples/neon-testing.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW;;;;CAGtB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// neon-testing.ts
|
|
2
|
+
import { makeNeonTesting } from "neon-testing";
|
|
3
|
+
// Export a configured lifecycle function to use in test files
|
|
4
|
+
export const neonTesting = makeNeonTesting({
|
|
5
|
+
apiKey: process.env.NEON_API_KEY,
|
|
6
|
+
projectId: process.env.NEON_PROJECT_ID,
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=neon-testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neon-testing.js","sourceRoot":"","sources":["../../examples/neon-testing.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAa;IACjC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,eAAgB;CACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-validation.test.d.ts","sourceRoot":"","sources":["../../examples/options-validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { makeNeonTesting } from "neon-testing";
|
|
3
|
+
const projectId = process.env.NEON_PROJECT_ID;
|
|
4
|
+
describe("expiresIn", () => {
|
|
5
|
+
/**
|
|
6
|
+
* Test options validation when setting the factory-level options
|
|
7
|
+
*/
|
|
8
|
+
describe("factory-level (makeNeonTesting)", () => {
|
|
9
|
+
test("non-integer throws", () => {
|
|
10
|
+
expect(() => {
|
|
11
|
+
makeNeonTesting({
|
|
12
|
+
apiKey: process.env.NEON_API_KEY,
|
|
13
|
+
projectId,
|
|
14
|
+
expiresIn: 600.5,
|
|
15
|
+
});
|
|
16
|
+
}).toThrow("expiresIn must be an integer");
|
|
17
|
+
});
|
|
18
|
+
test("zero throws", () => {
|
|
19
|
+
expect(() => {
|
|
20
|
+
makeNeonTesting({
|
|
21
|
+
apiKey: process.env.NEON_API_KEY,
|
|
22
|
+
projectId,
|
|
23
|
+
expiresIn: 0,
|
|
24
|
+
});
|
|
25
|
+
}).toThrow("expiresIn must be a positive integer");
|
|
26
|
+
});
|
|
27
|
+
test("negative throws", () => {
|
|
28
|
+
expect(() => {
|
|
29
|
+
makeNeonTesting({
|
|
30
|
+
apiKey: process.env.NEON_API_KEY,
|
|
31
|
+
projectId,
|
|
32
|
+
expiresIn: -10,
|
|
33
|
+
});
|
|
34
|
+
}).toThrow("expiresIn must be a positive integer");
|
|
35
|
+
});
|
|
36
|
+
test("> 30 days throws", () => {
|
|
37
|
+
expect(() => {
|
|
38
|
+
makeNeonTesting({
|
|
39
|
+
apiKey: process.env.NEON_API_KEY,
|
|
40
|
+
projectId,
|
|
41
|
+
expiresIn: 2592001,
|
|
42
|
+
});
|
|
43
|
+
}).toThrow("expiresIn must not exceed 30 days");
|
|
44
|
+
});
|
|
45
|
+
test("valid value does not throw", () => {
|
|
46
|
+
expect(() => {
|
|
47
|
+
makeNeonTesting({
|
|
48
|
+
apiKey: process.env.NEON_API_KEY,
|
|
49
|
+
projectId,
|
|
50
|
+
expiresIn: 600,
|
|
51
|
+
});
|
|
52
|
+
}).not.toThrow();
|
|
53
|
+
});
|
|
54
|
+
test("null does not throw", () => {
|
|
55
|
+
expect(() => {
|
|
56
|
+
makeNeonTesting({
|
|
57
|
+
apiKey: process.env.NEON_API_KEY,
|
|
58
|
+
projectId,
|
|
59
|
+
expiresIn: null,
|
|
60
|
+
});
|
|
61
|
+
}).not.toThrow();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Test options validation when overriding the factory-level options
|
|
66
|
+
*/
|
|
67
|
+
describe("override-level (setup function)", () => {
|
|
68
|
+
// Create a base neonTesting without expiresIn specified at factory level
|
|
69
|
+
const baseTesting = makeNeonTesting({
|
|
70
|
+
apiKey: process.env.NEON_API_KEY,
|
|
71
|
+
projectId,
|
|
72
|
+
});
|
|
73
|
+
test("non-integer in override throws", () => {
|
|
74
|
+
expect(() => {
|
|
75
|
+
baseTesting({ expiresIn: 600.5 });
|
|
76
|
+
}).toThrow("expiresIn must be an integer");
|
|
77
|
+
});
|
|
78
|
+
test("zero in override throws", () => {
|
|
79
|
+
expect(() => {
|
|
80
|
+
baseTesting({ expiresIn: 0 });
|
|
81
|
+
}).toThrow("expiresIn must be a positive integer");
|
|
82
|
+
});
|
|
83
|
+
test("negative in override throws", () => {
|
|
84
|
+
expect(() => {
|
|
85
|
+
baseTesting({ expiresIn: -10 });
|
|
86
|
+
}).toThrow("expiresIn must be a positive integer");
|
|
87
|
+
});
|
|
88
|
+
test("> 30 days in override throws", () => {
|
|
89
|
+
expect(() => {
|
|
90
|
+
baseTesting({ expiresIn: 2592001 });
|
|
91
|
+
}).toThrow("expiresIn must not exceed 30 days");
|
|
92
|
+
});
|
|
93
|
+
// Note: Valid override values (600, null) are tested in branch-expiration.test.ts
|
|
94
|
+
// where describe blocks actually create branches. We can't test them here since
|
|
95
|
+
// calling baseTesting() inside a test would register beforeAll() hooks which is
|
|
96
|
+
// not allowed.
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=options-validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options-validation.test.js","sourceRoot":"","sources":["../../examples/options-validation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommended.test.d.ts","sourceRoot":"","sources":["../../examples/recommended.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// recommended.test.ts
|
|
2
|
+
import { expect, test } from "vitest";
|
|
3
|
+
import { neonTesting } from "./neon-testing";
|
|
4
|
+
import { Pool } from "@neondatabase/serverless";
|
|
5
|
+
// Enable Neon test branch for this test file
|
|
6
|
+
neonTesting({
|
|
7
|
+
// Recommended for Neon WebSocket drivers to automatically close connections
|
|
8
|
+
autoCloseWebSockets: true,
|
|
9
|
+
});
|
|
10
|
+
test("database operations", async () => {
|
|
11
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
12
|
+
await pool.query(`CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)`);
|
|
13
|
+
await pool.query(`INSERT INTO users (name) VALUES ('Ellen Ripley')`);
|
|
14
|
+
const users = await pool.query(`SELECT * FROM users`);
|
|
15
|
+
expect(users.rows).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=recommended.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommended.test.js","sourceRoot":"","sources":["../../examples/recommended.test.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,6CAA6C;AAC7C,WAAW,CAAC;IACV,4EAA4E;IAC5E,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAC;AAEH,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAEtE,MAAM,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC1E,MAAM,IAAI,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* https://neon.com/docs/reference/typescript-sdk
|
|
3
|
+
*/
|
|
4
|
+
import { type Branch } from "@neondatabase/api-client";
|
|
1
5
|
export interface NeonTestingOptions {
|
|
2
6
|
/**
|
|
3
7
|
* The Neon API key, this is used to create and teardown test branches
|
|
@@ -40,6 +44,18 @@ export interface NeonTestingOptions {
|
|
|
40
44
|
* connections
|
|
41
45
|
*/
|
|
42
46
|
autoCloseWebSockets?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Time in seconds until the branch expires and is automatically deleted
|
|
49
|
+
* (default: 600 = 10 minutes)
|
|
50
|
+
*
|
|
51
|
+
* This provides automatic cleanup for dangling branches from interrupted or
|
|
52
|
+
* failed test runs. Set to `null` to disable automatic expiration.
|
|
53
|
+
*
|
|
54
|
+
* Must be a positive integer. Maximum 30 days (2,592,000 seconds).
|
|
55
|
+
*
|
|
56
|
+
* https://neon.com/docs/guides/branch-expiration
|
|
57
|
+
*/
|
|
58
|
+
expiresIn?: number | null;
|
|
43
59
|
}
|
|
44
60
|
/** Options for overriding test database setup (excludes apiKey) */
|
|
45
61
|
export type NeonTestingOverrides = Omit<Partial<NeonTestingOptions>, "apiKey">;
|
|
@@ -47,21 +63,38 @@ export type NeonTestingOverrides = Omit<Partial<NeonTestingOptions>, "apiKey">;
|
|
|
47
63
|
* Factory function that creates a Neon test database setup/teardown function
|
|
48
64
|
* for Vitest test suites.
|
|
49
65
|
*
|
|
50
|
-
* @param
|
|
51
|
-
* @
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* @
|
|
56
|
-
*
|
|
66
|
+
* @param factoryOptions - Configuration options (see {@link NeonTestingOptions})
|
|
67
|
+
* @returns A setup/teardown function with attached utilities:
|
|
68
|
+
* - `deleteAllTestBranches()` - Cleanup method to delete all test branches
|
|
69
|
+
* - `api` - Direct access to the Neon API client
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* // neon-testing.ts
|
|
74
|
+
* import { makeNeonTesting } from "neon-testing";
|
|
75
|
+
*
|
|
76
|
+
* export const neonTesting = makeNeonTesting({
|
|
77
|
+
* apiKey: "apiKey",
|
|
78
|
+
* projectId: "projectId",
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* // my-test.test.ts
|
|
85
|
+
* import { neonTesting } from "./neon-testing";
|
|
86
|
+
*
|
|
87
|
+
* const getBranch = neonTesting();
|
|
57
88
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
89
|
+
* test("my test", () => {
|
|
90
|
+
* const branch = getBranch();
|
|
91
|
+
* console.log(branch.id);
|
|
92
|
+
* });
|
|
93
|
+
* ```
|
|
62
94
|
*/
|
|
63
95
|
export declare function makeNeonTesting(factoryOptions: NeonTestingOptions): {
|
|
64
|
-
(overrides?: NeonTestingOverrides):
|
|
96
|
+
(overrides?: NeonTestingOverrides): () => Branch | undefined;
|
|
65
97
|
deleteAllTestBranches: () => Promise<void>;
|
|
98
|
+
api: import("@neondatabase/api-client").Api<unknown>;
|
|
66
99
|
};
|
|
67
100
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,0BAA0B,CAAC;AA0ClC,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,kBAAkB;iBAyClD,oBAAoB;;;EA0HnC"}
|
package/dist/index.js
CHANGED
|
@@ -16,27 +16,61 @@ function createConnectionUri(connectionParameters, type) {
|
|
|
16
16
|
const hostname = type === "pooler" ? pooler_host : host;
|
|
17
17
|
return `postgresql://${role}:${password}@${hostname}/${database}?sslmode=require`;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Validates the expiresIn option
|
|
21
|
+
*/
|
|
22
|
+
function validateExpiresIn(expiresIn) {
|
|
23
|
+
if (expiresIn !== null && expiresIn !== undefined) {
|
|
24
|
+
if (!Number.isInteger(expiresIn)) {
|
|
25
|
+
throw new Error("expiresIn must be an integer");
|
|
26
|
+
}
|
|
27
|
+
if (expiresIn <= 0) {
|
|
28
|
+
throw new Error("expiresIn must be a positive integer");
|
|
29
|
+
}
|
|
30
|
+
if (expiresIn > 2592000) {
|
|
31
|
+
throw new Error("expiresIn must not exceed 30 days (2,592,000 seconds)");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
19
35
|
/**
|
|
20
36
|
* Factory function that creates a Neon test database setup/teardown function
|
|
21
37
|
* for Vitest test suites.
|
|
22
38
|
*
|
|
23
|
-
* @param
|
|
24
|
-
* @
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* @
|
|
29
|
-
*
|
|
39
|
+
* @param factoryOptions - Configuration options (see {@link NeonTestingOptions})
|
|
40
|
+
* @returns A setup/teardown function with attached utilities:
|
|
41
|
+
* - `deleteAllTestBranches()` - Cleanup method to delete all test branches
|
|
42
|
+
* - `api` - Direct access to the Neon API client
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* // neon-testing.ts
|
|
47
|
+
* import { makeNeonTesting } from "neon-testing";
|
|
48
|
+
*
|
|
49
|
+
* export const neonTesting = makeNeonTesting({
|
|
50
|
+
* apiKey: "apiKey",
|
|
51
|
+
* projectId: "projectId",
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
30
54
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* // my-test.test.ts
|
|
58
|
+
* import { neonTesting } from "./neon-testing";
|
|
59
|
+
*
|
|
60
|
+
* const getBranch = neonTesting();
|
|
61
|
+
*
|
|
62
|
+
* test("my test", () => {
|
|
63
|
+
* const branch = getBranch();
|
|
64
|
+
* console.log(branch.id);
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
35
67
|
*/
|
|
36
68
|
export function makeNeonTesting(factoryOptions) {
|
|
69
|
+
// Validate factory options
|
|
70
|
+
validateExpiresIn(factoryOptions.expiresIn);
|
|
37
71
|
const apiClient = createApiClient({ apiKey: factoryOptions.apiKey });
|
|
38
72
|
/**
|
|
39
|
-
* Delete all test branches
|
|
73
|
+
* Delete all test branches (branches with the "integration-test: true" annotation)
|
|
40
74
|
*/
|
|
41
75
|
async function deleteAllTestBranches() {
|
|
42
76
|
const { data } = await apiClient.listProjectBranches({
|
|
@@ -49,13 +83,29 @@ export function makeNeonTesting(factoryOptions) {
|
|
|
49
83
|
}
|
|
50
84
|
}
|
|
51
85
|
}
|
|
52
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Setup/teardown function for Vitest test suites
|
|
88
|
+
*
|
|
89
|
+
* Registers Vitest lifecycle hooks that:
|
|
90
|
+
* - Create an isolated test branch from your parent branch
|
|
91
|
+
* - Set `DATABASE_URL` environment variable to the test branch connection URI
|
|
92
|
+
* - Automatically delete the test branch after tests complete (unless `deleteBranch: false`)
|
|
93
|
+
* - Automatically expire branches after 10 minutes for cleanup (unless `expiresIn: null`)
|
|
94
|
+
*
|
|
95
|
+
* @param overrides - Optional overrides for the factory options
|
|
96
|
+
* @returns A function that provides access to the current Neon branch object
|
|
97
|
+
*/
|
|
98
|
+
const neonTesting = (
|
|
53
99
|
/** Override any factory options except apiKey */
|
|
54
100
|
overrides) => {
|
|
101
|
+
// Validate overrides
|
|
102
|
+
if (overrides?.expiresIn !== undefined) {
|
|
103
|
+
validateExpiresIn(overrides.expiresIn);
|
|
104
|
+
}
|
|
55
105
|
// Merge factory options with overrides
|
|
56
106
|
const options = { ...factoryOptions, ...overrides };
|
|
57
|
-
// Each test file gets its own branch
|
|
58
|
-
let
|
|
107
|
+
// Each test file gets its own branch and database client
|
|
108
|
+
let branch;
|
|
59
109
|
// List of tracked Neon WebSocket connections
|
|
60
110
|
const neonSockets = new Set();
|
|
61
111
|
// Custom WebSocket constructor that tracks Neon WebSocket connections
|
|
@@ -74,18 +124,24 @@ export function makeNeonTesting(factoryOptions) {
|
|
|
74
124
|
* @returns The connection URI for the new branch
|
|
75
125
|
*/
|
|
76
126
|
async function createBranch() {
|
|
127
|
+
// Calculate expiration timestamp if expiresIn is set
|
|
128
|
+
const expiresIn = options.expiresIn === undefined ? 600 : options.expiresIn; // Default: 10 minutes
|
|
129
|
+
const expiresAt = expiresIn !== null
|
|
130
|
+
? new Date(Date.now() + expiresIn * 1000).toISOString()
|
|
131
|
+
: undefined;
|
|
77
132
|
const { data } = await apiClient.createProjectBranch(options.projectId, {
|
|
78
133
|
branch: {
|
|
79
134
|
name: `test/${crypto.randomUUID()}`,
|
|
80
135
|
parent_id: options.parentBranchId,
|
|
81
136
|
init_source: options.schemaOnly ? "schema-only" : undefined,
|
|
137
|
+
expires_at: expiresAt,
|
|
82
138
|
},
|
|
83
139
|
endpoints: [{ type: EndpointType.ReadWrite }],
|
|
84
140
|
annotation_value: {
|
|
85
141
|
"integration-test": "true",
|
|
86
142
|
},
|
|
87
143
|
});
|
|
88
|
-
|
|
144
|
+
branch = data.branch;
|
|
89
145
|
const [connectionUri] = data.connection_uris ?? [];
|
|
90
146
|
if (!connectionUri) {
|
|
91
147
|
throw new Error("No connection URI found");
|
|
@@ -96,11 +152,11 @@ export function makeNeonTesting(factoryOptions) {
|
|
|
96
152
|
* Delete the test branch
|
|
97
153
|
*/
|
|
98
154
|
async function deleteBranch() {
|
|
99
|
-
if (!
|
|
155
|
+
if (!branch?.id) {
|
|
100
156
|
throw new Error("No branch to delete");
|
|
101
157
|
}
|
|
102
|
-
await apiClient.deleteProjectBranch(options.projectId,
|
|
103
|
-
|
|
158
|
+
await apiClient.deleteProjectBranch(options.projectId, branch.id);
|
|
159
|
+
branch = undefined;
|
|
104
160
|
}
|
|
105
161
|
beforeAll(async () => {
|
|
106
162
|
process.env.DATABASE_URL = await withRetry(createBranch, {
|
|
@@ -126,10 +182,17 @@ export function makeNeonTesting(factoryOptions) {
|
|
|
126
182
|
await deleteBranch();
|
|
127
183
|
}
|
|
128
184
|
});
|
|
185
|
+
/**
|
|
186
|
+
* Return the Neon branch object
|
|
187
|
+
*
|
|
188
|
+
* @returns The Neon branch object
|
|
189
|
+
*/
|
|
190
|
+
return () => branch;
|
|
129
191
|
};
|
|
130
|
-
// Attach
|
|
131
|
-
|
|
132
|
-
|
|
192
|
+
// Attach utilities
|
|
193
|
+
neonTesting.deleteAllTestBranches = deleteAllTestBranches;
|
|
194
|
+
neonTesting.api = apiClient;
|
|
195
|
+
return neonTesting;
|
|
133
196
|
}
|
|
134
197
|
/**
|
|
135
198
|
* Error handler: Suppress Neon WebSocket "Connection terminated unexpectedly"
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAOA,wBASG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineConfig, configDefaults } from "vitest/config";
|
|
2
|
+
import dotenv from "dotenv";
|
|
3
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
4
|
+
import { neonTesting } from "./vite-plugin";
|
|
5
|
+
dotenv.config();
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
test: {
|
|
8
|
+
testTimeout: 10000,
|
|
9
|
+
hookTimeout: 20000,
|
|
10
|
+
exclude: [...configDefaults.exclude, "**/dist/**"],
|
|
11
|
+
// Limit to concurrent test files to avoid Neon API rate limiting
|
|
12
|
+
maxConcurrency: 2,
|
|
13
|
+
},
|
|
14
|
+
plugins: [tsconfigPaths(), neonTesting({ debug: false })],
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE;QACJ,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC;QAClD,iEAAiE;QACjE,cAAc,EAAE,CAAC;KAClB;IACD,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;CAC1D,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neon-testing",
|
|
3
|
-
"version": "2.2.0",
|
|
3
|
+
"version": "2.2.1-beta.0",
|
|
4
4
|
"description": "A Vitest utility for seamless integration tests with Neon Postgres",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"neon",
|
|
@@ -54,15 +54,17 @@
|
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@neondatabase/serverless": "^1.0.2",
|
|
57
|
+
"@types/pg": "^8.15.6",
|
|
57
58
|
"dotenv": "^17.2.3",
|
|
58
|
-
"drizzle-orm": "^0.44.
|
|
59
|
+
"drizzle-orm": "^0.44.7",
|
|
59
60
|
"pg": "^8.16.3",
|
|
60
61
|
"postgres": "^3.4.7",
|
|
61
62
|
"prettier": "^3.6.2",
|
|
63
|
+
"tiny-invariant": "^1.3.3",
|
|
62
64
|
"typescript": "^5.9.3",
|
|
63
|
-
"vite": "^7.
|
|
65
|
+
"vite": "^7.2.2",
|
|
64
66
|
"vite-tsconfig-paths": "^5.1.4",
|
|
65
|
-
"vitest": "^4.0.
|
|
67
|
+
"vitest": "^4.0.8"
|
|
66
68
|
},
|
|
67
69
|
"browser": {
|
|
68
70
|
"./dist/vite-plugin.js": "./dist/browser-empty.js"
|