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.
Files changed (66) hide show
  1. package/README.md +121 -31
  2. package/dist/examples/branch-expiration.test.d.ts +2 -0
  3. package/dist/examples/branch-expiration.test.d.ts.map +1 -0
  4. package/dist/examples/branch-expiration.test.js +60 -0
  5. package/dist/examples/branch-expiration.test.js.map +1 -0
  6. package/dist/examples/drivers/http-neon-drizzle.test.d.ts +2 -0
  7. package/dist/examples/drivers/http-neon-drizzle.test.d.ts.map +1 -0
  8. package/dist/examples/drivers/http-neon-drizzle.test.js +80 -0
  9. package/dist/examples/drivers/http-neon-drizzle.test.js.map +1 -0
  10. package/dist/examples/drivers/http-neon.test.d.ts +2 -0
  11. package/dist/examples/drivers/http-neon.test.d.ts.map +1 -0
  12. package/dist/examples/drivers/http-neon.test.js +71 -0
  13. package/dist/examples/drivers/http-neon.test.js.map +1 -0
  14. package/dist/examples/drivers/tcp-pg-drizzle.test.d.ts +2 -0
  15. package/dist/examples/drivers/tcp-pg-drizzle.test.d.ts.map +1 -0
  16. package/dist/examples/drivers/tcp-pg-drizzle.test.js +90 -0
  17. package/dist/examples/drivers/tcp-pg-drizzle.test.js.map +1 -0
  18. package/dist/examples/drivers/tcp-pg.test.d.ts +2 -0
  19. package/dist/examples/drivers/tcp-pg.test.d.ts.map +1 -0
  20. package/dist/examples/drivers/tcp-pg.test.js +76 -0
  21. package/dist/examples/drivers/tcp-pg.test.js.map +1 -0
  22. package/dist/examples/drivers/tcp-postgres-drizzle.test.d.ts +2 -0
  23. package/dist/examples/drivers/tcp-postgres-drizzle.test.d.ts.map +1 -0
  24. package/dist/examples/drivers/tcp-postgres-drizzle.test.js +77 -0
  25. package/dist/examples/drivers/tcp-postgres-drizzle.test.js.map +1 -0
  26. package/dist/examples/drivers/tcp-postgres.test.d.ts +2 -0
  27. package/dist/examples/drivers/tcp-postgres.test.d.ts.map +1 -0
  28. package/dist/examples/drivers/tcp-postgres.test.js +69 -0
  29. package/dist/examples/drivers/tcp-postgres.test.js.map +1 -0
  30. package/dist/examples/drivers/ws-neon-drizzle.test.d.ts +2 -0
  31. package/dist/examples/drivers/ws-neon-drizzle.test.d.ts.map +1 -0
  32. package/dist/examples/drivers/ws-neon-drizzle.test.js +121 -0
  33. package/dist/examples/drivers/ws-neon-drizzle.test.js.map +1 -0
  34. package/dist/examples/drivers/ws-neon.test.d.ts +2 -0
  35. package/dist/examples/drivers/ws-neon.test.d.ts.map +1 -0
  36. package/dist/examples/drivers/ws-neon.test.js +97 -0
  37. package/dist/examples/drivers/ws-neon.test.js.map +1 -0
  38. package/dist/examples/isolated.test.d.ts +2 -0
  39. package/dist/examples/isolated.test.d.ts.map +1 -0
  40. package/dist/examples/isolated.test.js +114 -0
  41. package/dist/examples/isolated.test.js.map +1 -0
  42. package/dist/examples/minimal.test.d.ts +2 -0
  43. package/dist/examples/minimal.test.d.ts.map +1 -0
  44. package/dist/examples/minimal.test.js +19 -0
  45. package/dist/examples/minimal.test.js.map +1 -0
  46. package/dist/examples/neon-testing.d.ts +6 -0
  47. package/dist/examples/neon-testing.d.ts.map +1 -0
  48. package/dist/examples/neon-testing.js +8 -0
  49. package/dist/examples/neon-testing.js.map +1 -0
  50. package/dist/examples/options-validation.test.d.ts +2 -0
  51. package/dist/examples/options-validation.test.d.ts.map +1 -0
  52. package/dist/examples/options-validation.test.js +99 -0
  53. package/dist/examples/options-validation.test.js.map +1 -0
  54. package/dist/examples/recommended.test.d.ts +2 -0
  55. package/dist/examples/recommended.test.d.ts.map +1 -0
  56. package/dist/examples/recommended.test.js +17 -0
  57. package/dist/examples/recommended.test.js.map +1 -0
  58. package/dist/index.d.ts +45 -12
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +85 -22
  61. package/dist/index.js.map +1 -1
  62. package/dist/vitest.config.d.ts +3 -0
  63. package/dist/vitest.config.d.ts.map +1 -0
  64. package/dist/vitest.config.js +16 -0
  65. package/dist/vitest.config.js.map +1 -0
  66. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=options-validation.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recommended.test.d.ts.map
@@ -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 apiKey - The Neon API key, this is used to create and teardown test branches
51
- * @param projectId - The Neon project ID to operate on
52
- * @param parentBranchId - The parent branch ID for the new branch. If omitted or empty, the branch will be created from the project's default branch.
53
- * @param schemaOnly - Whether to create a schema-only branch (default: false)
54
- * @param endpoint - The type of connection to create (pooler is recommended)
55
- * @param deleteBranch - Delete the test branch in afterAll (default: true). Disabling this will leave each test branch in the Neon project after the test suite runs
56
- * @returns A setup/teardown function for Vitest test suites
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
- * Side effects:
59
- * - Sets the `DATABASE_URL` environment variable to the connection URI for the
60
- * new branch
61
- * - Deletes the test branch after the test suite runs
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): void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AA8BA,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;CAC/B;AAED,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,kBAAkB;iBA0BlD,oBAAoB;;EAmGnC"}
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 apiKey - The Neon API key, this is used to create and teardown test branches
24
- * @param projectId - The Neon project ID to operate on
25
- * @param parentBranchId - The parent branch ID for the new branch. If omitted or empty, the branch will be created from the project's default branch.
26
- * @param schemaOnly - Whether to create a schema-only branch (default: false)
27
- * @param endpoint - The type of connection to create (pooler is recommended)
28
- * @param deleteBranch - Delete the test branch in afterAll (default: true). Disabling this will leave each test branch in the Neon project after the test suite runs
29
- * @returns A setup/teardown function for Vitest test suites
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
- * Side effects:
32
- * - Sets the `DATABASE_URL` environment variable to the connection URI for the
33
- * new branch
34
- * - Deletes the test branch after the test suite runs
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
- const testDbSetup = (
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 ID and database client
58
- let branchId;
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
- branchId = data.branch.id;
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 (!branchId) {
155
+ if (!branch?.id) {
100
156
  throw new Error("No branch to delete");
101
157
  }
102
- await apiClient.deleteProjectBranch(options.projectId, branchId);
103
- branchId = undefined;
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 the utility
131
- testDbSetup.deleteAllTestBranches = deleteAllTestBranches;
132
- return testDbSetup;
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -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.6",
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.1.12",
65
+ "vite": "^7.2.2",
64
66
  "vite-tsconfig-paths": "^5.1.4",
65
- "vitest": "^4.0.1"
67
+ "vitest": "^4.0.8"
66
68
  },
67
69
  "browser": {
68
70
  "./dist/vite-plugin.js": "./dist/browser-empty.js"