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,76 @@
1
+ /**
2
+ * pg (node-postgres)
3
+ *
4
+ * Protocol: | TCP
5
+ * Driver: | pg
6
+ * ORM: | -
7
+ * Interactive transactions | ✅
8
+ * Automatic connection lifecycle management | ❌
9
+ *
10
+ * https://www.npmjs.com/package/pg
11
+ */
12
+ import { describe, expect, test } from "vitest";
13
+ import { neonTesting } from "../neon-testing";
14
+ import { Pool } from "pg";
15
+ const endpoints = ["pooler", "direct"];
16
+ describe.each(endpoints)("node-postgres (%s)", (endpoint) => {
17
+ neonTesting({ endpoint });
18
+ test("create table", async () => {
19
+ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
20
+ await pool.query(`
21
+ CREATE TABLE users (
22
+ id SERIAL PRIMARY KEY,
23
+ name TEXT NOT NULL UNIQUE
24
+ )
25
+ `);
26
+ const newUser = await pool.query(`
27
+ INSERT INTO users (name)
28
+ VALUES ('Ellen Ripley')
29
+ RETURNING *
30
+ `);
31
+ expect(newUser.rows[0]).toStrictEqual({ id: 1, name: "Ellen Ripley" });
32
+ const users = await pool.query(`SELECT * FROM users`);
33
+ expect(users.rows).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
34
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
35
+ await pool.end();
36
+ });
37
+ test("tests are not isolated within a test file", async () => {
38
+ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
39
+ const newUser = await pool.query(`
40
+ INSERT INTO users (name)
41
+ VALUES ('Rebecca Jorden')
42
+ RETURNING *
43
+ `);
44
+ expect(newUser.rows).toStrictEqual([{ id: 2, name: "Rebecca Jorden" }]);
45
+ const users = await pool.query(`SELECT * FROM users`);
46
+ expect(users.rows).toStrictEqual([
47
+ // Ellen Ripley is already in the table from the previous test
48
+ { id: 1, name: "Ellen Ripley" },
49
+ { id: 2, name: "Rebecca Jorden" },
50
+ ]);
51
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
52
+ await pool.end();
53
+ });
54
+ test("interactive transactions are supported", async () => {
55
+ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
56
+ try {
57
+ await pool.query("BEGIN");
58
+ await pool.query(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
59
+ // Duplicate unique constraint error - will roll back the transaction
60
+ await pool.query(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
61
+ await pool.query("COMMIT");
62
+ }
63
+ catch {
64
+ await pool.query("ROLLBACK");
65
+ }
66
+ const users = await pool.query(`SELECT * FROM users`);
67
+ expect(users.rows).toStrictEqual([
68
+ { id: 1, name: "Ellen Ripley" },
69
+ { id: 2, name: "Rebecca Jorden" },
70
+ // Private Vasquez is not inserted because of the transaction rollback
71
+ ]);
72
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
73
+ await pool.end();
74
+ });
75
+ });
76
+ //# sourceMappingURL=tcp-pg.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-pg.test.js","sourceRoot":"","sources":["../../../examples/drivers/tcp-pg.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tcp-postgres-drizzle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-postgres-drizzle.test.d.ts","sourceRoot":"","sources":["../../../examples/drivers/tcp-postgres-drizzle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * postgres (Postgres.js)
3
+ *
4
+ * Protocol: | TCP
5
+ * Driver: | postgres
6
+ * ORM: | drizzle-orm
7
+ * Interactive transactions | ✅
8
+ * Automatic connection lifecycle management | ✅
9
+ *
10
+ * https://www.npmjs.com/package/postgres
11
+ * https://www.npmjs.com/package/drizzle-orm
12
+ * https://orm.drizzle.team/docs/get-started-postgresql#postgresjs
13
+ */
14
+ import { describe, expect, test } from "vitest";
15
+ import { neonTesting } from "../neon-testing";
16
+ import postgres from "postgres";
17
+ import { drizzle } from "drizzle-orm/postgres-js";
18
+ import { lazySingleton } from "neon-testing/utils";
19
+ const cases = [
20
+ ["pooler", (url) => drizzle(url)],
21
+ ["direct", (url) => drizzle(url)],
22
+ ["pooler", (url) => drizzle({ client: postgres(url) })],
23
+ ["direct", (url) => drizzle({ client: postgres(url) })],
24
+ ];
25
+ describe.each(cases)("Drizzle Postgres.js (%s)", (endpoint, makeDb) => {
26
+ neonTesting({ endpoint });
27
+ const db = lazySingleton(() => makeDb(process.env.DATABASE_URL));
28
+ test("create table", async () => {
29
+ await db().execute(`
30
+ CREATE TABLE users (
31
+ id SERIAL PRIMARY KEY,
32
+ name TEXT NOT NULL UNIQUE
33
+ )
34
+ `);
35
+ const [newUser] = await db().execute(`
36
+ INSERT INTO users (name)
37
+ VALUES ('Ellen Ripley')
38
+ RETURNING *
39
+ `);
40
+ expect(newUser).toStrictEqual({ id: 1, name: "Ellen Ripley" });
41
+ const users = await db().execute(`SELECT * FROM users`);
42
+ expect([...users]).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
43
+ });
44
+ test("tests are not isolated within a test file", async () => {
45
+ const newUser = await db().execute(`
46
+ INSERT INTO users (name)
47
+ VALUES ('Rebecca Jorden')
48
+ RETURNING *
49
+ `);
50
+ expect([...newUser]).toStrictEqual([{ id: 2, name: "Rebecca Jorden" }]);
51
+ const users = await db().execute(`SELECT * FROM users`);
52
+ expect([...users]).toStrictEqual([
53
+ // Ellen Ripley is already in the table from the previous test
54
+ { id: 1, name: "Ellen Ripley" },
55
+ { id: 2, name: "Rebecca Jorden" },
56
+ ]);
57
+ });
58
+ test("interactive transactions are supported", async () => {
59
+ try {
60
+ await db().execute("BEGIN");
61
+ await db().execute(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
62
+ // Duplicate unique constraint error - will roll back the transaction
63
+ await db().execute(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
64
+ await db().execute("COMMIT");
65
+ }
66
+ catch {
67
+ await db().execute("ROLLBACK");
68
+ }
69
+ const users = await db().execute(`SELECT * FROM users`);
70
+ expect([...users]).toStrictEqual([
71
+ { id: 1, name: "Ellen Ripley" },
72
+ { id: 2, name: "Rebecca Jorden" },
73
+ // Private Vasquez is not inserted because of the transaction rollback
74
+ ]);
75
+ });
76
+ });
77
+ //# sourceMappingURL=tcp-postgres-drizzle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-postgres-drizzle.test.js","sourceRoot":"","sources":["../../../examples/drivers/tcp-postgres-drizzle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tcp-postgres.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-postgres.test.d.ts","sourceRoot":"","sources":["../../../examples/drivers/tcp-postgres.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * postgres (Postgres.js)
3
+ *
4
+ * Protocol: | TCP
5
+ * Driver: | postgres
6
+ * ORM: | -
7
+ * Interactive transactions | ✅
8
+ * Automatic connection lifecycle management | ✅
9
+ *
10
+ * https://www.npmjs.com/package/postgres
11
+ */
12
+ import { describe, expect, test } from "vitest";
13
+ import { neonTesting } from "../neon-testing";
14
+ import postgres from "postgres";
15
+ import { lazySingleton } from "neon-testing/utils";
16
+ const endpoints = ["pooler", "direct"];
17
+ describe.each(endpoints)("Postgres.js (%s)", (endpoint) => {
18
+ neonTesting({ endpoint });
19
+ const sql = lazySingleton(() => postgres(process.env.DATABASE_URL));
20
+ test("create table", async () => {
21
+ await sql() `
22
+ CREATE TABLE users (
23
+ id SERIAL PRIMARY KEY,
24
+ name TEXT NOT NULL UNIQUE
25
+ )
26
+ `;
27
+ const newUser = await sql() `
28
+ INSERT INTO users (name)
29
+ VALUES ('Ellen Ripley')
30
+ RETURNING *
31
+ `;
32
+ expect([...newUser]).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
33
+ const users = await sql() `SELECT * FROM users`;
34
+ expect([...users]).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
35
+ });
36
+ test("tests are not isolated within a test file", async () => {
37
+ const newUser = await sql() `
38
+ INSERT INTO users (name)
39
+ VALUES ('Rebecca Jorden')
40
+ RETURNING *
41
+ `;
42
+ expect([...newUser]).toStrictEqual([{ id: 2, name: "Rebecca Jorden" }]);
43
+ const users = await sql() `SELECT * FROM users`;
44
+ expect([...users]).toStrictEqual([
45
+ // Ellen Ripley is already in the table from the previous test
46
+ { id: 1, name: "Ellen Ripley" },
47
+ { id: 2, name: "Rebecca Jorden" },
48
+ ]);
49
+ });
50
+ test("interactive transactions are supported", async () => {
51
+ try {
52
+ await sql() `BEGIN`;
53
+ await sql() `INSERT INTO users (name) VALUES ('Private Vasquez')`;
54
+ // Duplicate unique constraint error - will roll back the transaction
55
+ await sql() `INSERT INTO users (name) VALUES ('Private Vasquez')`;
56
+ await sql() `COMMIT`;
57
+ }
58
+ catch {
59
+ await sql() `ROLLBACK`;
60
+ }
61
+ const users = await sql() `SELECT * FROM users`;
62
+ expect([...users]).toStrictEqual([
63
+ { id: 1, name: "Ellen Ripley" },
64
+ { id: 2, name: "Rebecca Jorden" },
65
+ // Private Vasquez is not inserted because of the transaction rollback
66
+ ]);
67
+ });
68
+ });
69
+ //# sourceMappingURL=tcp-postgres.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-postgres.test.js","sourceRoot":"","sources":["../../../examples/drivers/tcp-postgres.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAEhD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE;IACxD,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE1B,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC,CAAC,CAAC;IAErE,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,GAAG,EAAE,CAAA;;;;;KAKV,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,GAAG,EAAE,CAAA;;;;KAI1B,CAAC;QACF,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAA,qBAAqB,CAAC;QAC/C,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,MAAM,GAAG,EAAE,CAAA;;;;KAI1B,CAAC;QACF,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAA,qBAAqB,CAAC;QAC/C,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/B,8DAA8D;YAC9D,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,GAAG,EAAE,CAAA,OAAO,CAAC;YACnB,MAAM,GAAG,EAAE,CAAA,qDAAqD,CAAC;YACjE,qEAAqE;YACrE,MAAM,GAAG,EAAE,CAAA,qDAAqD,CAAC;YACjE,MAAM,GAAG,EAAE,CAAA,QAAQ,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,EAAE,CAAA,UAAU,CAAC;QACxB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAA,qBAAqB,CAAC;QAC/C,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YACjC,sEAAsE;SACvE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ws-neon-drizzle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-neon-drizzle.test.d.ts","sourceRoot":"","sources":["../../../examples/drivers/ws-neon-drizzle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * @neondatabase/serverless
3
+ *
4
+ * Protocol: | WebSocket
5
+ * Driver: | @neondatabase/serverless
6
+ * ORM: | drizzle-orm
7
+ * Interactive transactions | ✅
8
+ * Automatic connection lifecycle management | ⚠️ with `autoCloseWebSockets` flag
9
+ *
10
+ * https://www.npmjs.com/package/@neondatabase/serverless
11
+ * https://www.npmjs.com/package/drizzle-orm
12
+ * https://orm.drizzle.team/docs/get-started/neon-new
13
+ * https://orm.drizzle.team/docs/connect-neon
14
+ */
15
+ import { describe, expect, test } from "vitest";
16
+ import { neonTesting } from "../neon-testing";
17
+ import { Pool } from "@neondatabase/serverless";
18
+ import { drizzle } from "drizzle-orm/neon-serverless";
19
+ const cases = [
20
+ [
21
+ "pooler",
22
+ (url) => {
23
+ const db = drizzle(url);
24
+ return {
25
+ sql: (query) => db.execute(query),
26
+ end: () => db.$client.end(),
27
+ };
28
+ },
29
+ ],
30
+ [
31
+ "direct",
32
+ (url) => {
33
+ const db = drizzle(url);
34
+ return {
35
+ sql: (query) => db.execute(query),
36
+ end: () => db.$client.end(),
37
+ };
38
+ },
39
+ ],
40
+ [
41
+ "pooler",
42
+ (url) => {
43
+ const db = drizzle({ client: new Pool({ connectionString: url }) });
44
+ return {
45
+ sql: (query) => db.execute(query),
46
+ end: () => db.$client.end(),
47
+ };
48
+ },
49
+ ],
50
+ [
51
+ "direct",
52
+ (url) => {
53
+ const db = drizzle({ client: new Pool({ connectionString: url }) });
54
+ return {
55
+ sql: (query) => db.execute(query),
56
+ end: () => db.$client.end(),
57
+ };
58
+ },
59
+ ],
60
+ ];
61
+ describe.each(cases)("Drizzle Neon WebSocket (%s)", (endpoint, makeDb) => {
62
+ neonTesting({ endpoint, autoCloseWebSockets: true });
63
+ test("create table", async () => {
64
+ const { end, sql } = makeDb(process.env.DATABASE_URL);
65
+ await sql(`
66
+ CREATE TABLE users (
67
+ id SERIAL PRIMARY KEY,
68
+ name TEXT NOT NULL UNIQUE
69
+ )
70
+ `);
71
+ const newUser = await sql(`
72
+ INSERT INTO users (name)
73
+ VALUES ('Ellen Ripley')
74
+ RETURNING *
75
+ `);
76
+ expect(newUser.rows[0]).toStrictEqual({ id: 1, name: "Ellen Ripley" });
77
+ const users = await sql(`SELECT * FROM users`);
78
+ expect(users.rows).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
79
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
80
+ // await end();
81
+ });
82
+ test("tests are not isolated within a test file", async () => {
83
+ const { end, sql } = makeDb(process.env.DATABASE_URL);
84
+ const newUser = await sql(`
85
+ INSERT INTO users (name)
86
+ VALUES ('Rebecca Jorden')
87
+ RETURNING *
88
+ `);
89
+ expect(newUser.rows).toStrictEqual([{ id: 2, name: "Rebecca Jorden" }]);
90
+ const users = await sql(`SELECT * FROM users`);
91
+ expect(users.rows).toStrictEqual([
92
+ // Ellen Ripley is already in the table from the previous test
93
+ { id: 1, name: "Ellen Ripley" },
94
+ { id: 2, name: "Rebecca Jorden" },
95
+ ]);
96
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
97
+ // await end();
98
+ });
99
+ test("interactive transactions are supported", async () => {
100
+ const { end, sql } = makeDb(process.env.DATABASE_URL);
101
+ try {
102
+ await sql("BEGIN");
103
+ await sql(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
104
+ // Duplicate unique constraint error - will roll back the transaction
105
+ await sql(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
106
+ await sql("COMMIT");
107
+ }
108
+ catch {
109
+ await sql("ROLLBACK");
110
+ }
111
+ const users = await sql(`SELECT * FROM users`);
112
+ expect(users.rows).toStrictEqual([
113
+ { id: 1, name: "Ellen Ripley" },
114
+ { id: 2, name: "Rebecca Jorden" },
115
+ // Private Vasquez is not inserted because of the transaction rollback
116
+ ]);
117
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
118
+ // await end();
119
+ });
120
+ });
121
+ //# sourceMappingURL=ws-neon-drizzle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-neon-drizzle.test.js","sourceRoot":"","sources":["../../../examples/drivers/ws-neon-drizzle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEtD,MAAM,KAAK,GAAG;IACZ;QACE,QAAQ;QACR,CAAC,GAAW,EAAE,EAAE;YACd,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO;gBACL,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF;IACD;QACE,QAAQ;QACR,CAAC,GAAW,EAAE,EAAE;YACd,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO;gBACL,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF;IACD;QACE,QAAQ;QACR,CAAC,GAAW,EAAE,EAAE;YACd,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO;gBACL,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF;IACD;QACE,QAAQ;QACR,CAAC,GAAW,EAAE,EAAE;YACd,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO;gBACL,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF;CACO,CAAC;AAEX,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,6BAA6B,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;IACvE,WAAW,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC,CAAC;QAEvD,MAAM,GAAG,CAAC;;;;;KAKT,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC;;;;KAIzB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAEvE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAEpE,yEAAyE;QACzE,eAAe;IACjB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC;;;;KAIzB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;YAC/B,8DAA8D;YAC9D,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;SAClC,CAAC,CAAC;QAEH,yEAAyE;QACzE,eAAe;IACjB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACjE,qEAAqE;YACrE,MAAM,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;YAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YACjC,sEAAsE;SACvE,CAAC,CAAC;QAEH,yEAAyE;QACzE,eAAe;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ws-neon.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-neon.test.d.ts","sourceRoot":"","sources":["../../../examples/drivers/ws-neon.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @neondatabase/serverless
3
+ *
4
+ * Protocol: | WebSocket
5
+ * Driver: | @neondatabase/serverless
6
+ * ORM: | -
7
+ * Interactive transactions | ✅
8
+ * Automatic connection lifecycle management | ⚠️ with `autoCloseWebSockets` flag
9
+ *
10
+ * https://www.npmjs.com/package/@neondatabase/serverless
11
+ */
12
+ import { describe, expect, test } from "vitest";
13
+ import { neonTesting } from "../neon-testing";
14
+ import { Pool } from "@neondatabase/serverless";
15
+ const cases = [
16
+ [
17
+ "pooler",
18
+ (url) => {
19
+ const pool = new Pool({ connectionString: url });
20
+ return {
21
+ sql: (query) => pool.query(query),
22
+ end: () => pool.end(),
23
+ };
24
+ },
25
+ ],
26
+ [
27
+ "direct",
28
+ (url) => {
29
+ const pool = new Pool({ connectionString: url });
30
+ return {
31
+ sql: (query) => pool.query(query),
32
+ end: () => pool.end(),
33
+ };
34
+ },
35
+ ],
36
+ ];
37
+ describe.each(cases)("Neon WebSocket (%s)", (endpoint, makeDb) => {
38
+ neonTesting({ endpoint, autoCloseWebSockets: true });
39
+ test("create table", async () => {
40
+ const { end, sql } = makeDb(process.env.DATABASE_URL);
41
+ await sql(`
42
+ CREATE TABLE users (
43
+ id SERIAL PRIMARY KEY,
44
+ name TEXT NOT NULL UNIQUE
45
+ )
46
+ `);
47
+ const newUser = await sql(`
48
+ INSERT INTO users (name)
49
+ VALUES ('Ellen Ripley')
50
+ RETURNING *
51
+ `);
52
+ expect(newUser.rows[0]).toStrictEqual({ id: 1, name: "Ellen Ripley" });
53
+ const users = await sql(`SELECT * FROM users`);
54
+ expect(users.rows).toStrictEqual([{ id: 1, name: "Ellen Ripley" }]);
55
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
56
+ // await end();
57
+ });
58
+ test("tests are not isolated within a test file", async () => {
59
+ const { end, sql } = makeDb(process.env.DATABASE_URL);
60
+ const newUser = await sql(`
61
+ INSERT INTO users (name)
62
+ VALUES ('Rebecca Jorden')
63
+ RETURNING *
64
+ `);
65
+ expect(newUser.rows).toStrictEqual([{ id: 2, name: "Rebecca Jorden" }]);
66
+ const users = await sql(`SELECT * FROM users`);
67
+ expect(users.rows).toStrictEqual([
68
+ // Ellen Ripley is already in the table from the previous test
69
+ { id: 1, name: "Ellen Ripley" },
70
+ { id: 2, name: "Rebecca Jorden" },
71
+ ]);
72
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
73
+ // await end();
74
+ });
75
+ test("interactive transactions are supported", async () => {
76
+ const { end, sql } = makeDb(process.env.DATABASE_URL);
77
+ try {
78
+ await sql("BEGIN");
79
+ await sql(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
80
+ // Duplicate unique constraint error - will roll back the transaction
81
+ await sql(`INSERT INTO users (name) VALUES ('Private Vasquez')`);
82
+ await sql("COMMIT");
83
+ }
84
+ catch {
85
+ await sql("ROLLBACK");
86
+ }
87
+ const users = await sql(`SELECT * FROM users`);
88
+ expect(users.rows).toStrictEqual([
89
+ { id: 1, name: "Ellen Ripley" },
90
+ { id: 2, name: "Rebecca Jorden" },
91
+ // Private Vasquez is not inserted because of the transaction rollback
92
+ ]);
93
+ // 👎 Have to manually end the connection unless disabling `deleteBranch`
94
+ // await end();
95
+ });
96
+ });
97
+ //# sourceMappingURL=ws-neon.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-neon.test.js","sourceRoot":"","sources":["../../../examples/drivers/ws-neon.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=isolated.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated.test.d.ts","sourceRoot":"","sources":["../../examples/isolated.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * To isolate tests within a file, reset the Neon branch before each test
3
+ *
4
+ * This file contains a few ways to isolate tests within a file
5
+ */
6
+ import { describe, beforeEach, expect, test } from "vitest";
7
+ import { neonTesting } from "./neon-testing";
8
+ import { neon } from "@neondatabase/serverless";
9
+ neonTesting();
10
+ /**
11
+ * Drop the Postgres schema before each test
12
+ *
13
+ * When you drop the schema you have to re-apply the database migrations/schema
14
+ * before each test
15
+ */
16
+ describe("isolate tests by dropping schema", () => {
17
+ beforeEach(async () => {
18
+ const sql = neon(process.env.DATABASE_URL);
19
+ await sql `DROP SCHEMA IF EXISTS public CASCADE`;
20
+ await sql `CREATE SCHEMA public`;
21
+ await sql `CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)`;
22
+ });
23
+ /**
24
+ * This test is run twice and would fail if the database is shared between
25
+ * tests
26
+ */
27
+ test.each([0, 1])("individual tests are isolated - %s", async () => {
28
+ const sql = neon(process.env.DATABASE_URL);
29
+ expect(await sql `SELECT * FROM users`).toStrictEqual([]);
30
+ await sql `INSERT INTO users (name) VALUES ('Ellen Ripley')`;
31
+ expect(await sql `SELECT * FROM users`).toStrictEqual([
32
+ { id: 1, name: "Ellen Ripley" },
33
+ ]);
34
+ });
35
+ });
36
+ /**
37
+ * Drop the table before each test
38
+ *
39
+ * When you drop tables you have to re-apply the database migrations/schema
40
+ * before each test
41
+ */
42
+ describe("isolate tests by dropping tables", () => {
43
+ beforeEach(async () => {
44
+ const sql = neon(process.env.DATABASE_URL);
45
+ await sql `DROP TABLE IF EXISTS users`;
46
+ await sql `CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)`;
47
+ await sql `DELETE FROM users`;
48
+ });
49
+ /**
50
+ * This test is run twice and would fail if the database is shared between
51
+ * tests
52
+ */
53
+ test.each([0, 1])("individual tests are isolated - %s", async () => {
54
+ const sql = neon(process.env.DATABASE_URL);
55
+ expect(await sql `SELECT * FROM users`).toStrictEqual([]);
56
+ await sql `INSERT INTO users (name) VALUES ('Ellen Ripley')`;
57
+ expect(await sql `SELECT * FROM users`).toStrictEqual([
58
+ { id: 1, name: "Ellen Ripley" },
59
+ ]);
60
+ });
61
+ });
62
+ /**
63
+ * Delete table rows before each test
64
+ *
65
+ * When you delete rows, the tables themselves are intact so there is no need to
66
+ * re-apply the database migrations/schema
67
+ */
68
+ describe("isolate tests by deleting rows", () => {
69
+ beforeEach(async () => {
70
+ const sql = neon(process.env.DATABASE_URL);
71
+ await sql `CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT)`;
72
+ await sql `DELETE FROM users`;
73
+ await sql `ALTER SEQUENCE users_id_seq RESTART WITH 1`;
74
+ });
75
+ /**
76
+ * This test is run twice and would fail if the database is shared between
77
+ * tests
78
+ */
79
+ test.each([0, 1])("individual tests are isolated - %s", async () => {
80
+ const sql = neon(process.env.DATABASE_URL);
81
+ expect(await sql `SELECT * FROM users`).toStrictEqual([]);
82
+ await sql `INSERT INTO users (name) VALUES ('Ellen Ripley')`;
83
+ expect(await sql `SELECT * FROM users`).toStrictEqual([
84
+ { id: 1, name: "Ellen Ripley" },
85
+ ]);
86
+ });
87
+ });
88
+ /**
89
+ * Truncate tables before each test
90
+ *
91
+ * When you truncate tables, the tables themselves are intact so there is no
92
+ * need to re-apply the database migrations/schema
93
+ */
94
+ describe("isolate tests by truncating tables", () => {
95
+ beforeEach(async () => {
96
+ const sql = neon(process.env.DATABASE_URL);
97
+ await sql `CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT)`;
98
+ await sql `TRUNCATE TABLE users`;
99
+ await sql `ALTER SEQUENCE users_id_seq RESTART WITH 1`;
100
+ });
101
+ /**
102
+ * This test is run twice and would fail if the database is shared between
103
+ * tests
104
+ */
105
+ test.each([0, 1])("individual tests are isolated - %s", async () => {
106
+ const sql = neon(process.env.DATABASE_URL);
107
+ expect(await sql `SELECT * FROM users`).toStrictEqual([]);
108
+ await sql `INSERT INTO users (name) VALUES ('Ellen Ripley')`;
109
+ expect(await sql `SELECT * FROM users`).toStrictEqual([
110
+ { id: 1, name: "Ellen Ripley" },
111
+ ]);
112
+ });
113
+ });
114
+ //# sourceMappingURL=isolated.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated.test.js","sourceRoot":"","sources":["../../examples/isolated.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=minimal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal.test.d.ts","sourceRoot":"","sources":["../../examples/minimal.test.ts"],"names":[],"mappings":""}