@geekmidas/testkit 0.0.2 → 0.0.4

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 (78) hide show
  1. package/PostgresKyselyMigrator.spec +471 -0
  2. package/dist/Factory.mjs +1 -1
  3. package/dist/{KyselyFactory-DiiWtMYe.cjs → KyselyFactory-BGvSMLtd.cjs} +11 -12
  4. package/dist/{KyselyFactory-DZewtWtJ.mjs → KyselyFactory-ionH4gvk.mjs} +12 -13
  5. package/dist/KyselyFactory.cjs +2 -1
  6. package/dist/KyselyFactory.mjs +3 -2
  7. package/dist/{ObjectionFactory-MAf2m8LI.mjs → ObjectionFactory-CFrtXe7i.mjs} +1 -1
  8. package/dist/ObjectionFactory.cjs +1 -1
  9. package/dist/ObjectionFactory.mjs +2 -2
  10. package/dist/{PostgresKyselyMigrator-ChMJpPrQ.mjs → PostgresKyselyMigrator-CbtiZgfI.mjs} +1 -1
  11. package/dist/{PostgresKyselyMigrator-rY3hO_-1.cjs → PostgresKyselyMigrator-Cxf2Dp9y.cjs} +3 -2
  12. package/dist/PostgresKyselyMigrator.cjs +2 -2
  13. package/dist/PostgresKyselyMigrator.mjs +2 -2
  14. package/dist/{PostgresMigrator-BJ2-5A_b.cjs → PostgresMigrator-eqyAFSf-.cjs} +2 -39
  15. package/dist/PostgresMigrator.cjs +1 -1
  16. package/dist/PostgresMigrator.mjs +1 -1
  17. package/dist/VitestKyselyTransactionIsolator-DXjWQtDN.mjs +12 -0
  18. package/dist/VitestKyselyTransactionIsolator-Dh2AgJDd.cjs +17 -0
  19. package/dist/VitestKyselyTransactionIsolator.cjs +5 -0
  20. package/dist/VitestKyselyTransactionIsolator.mjs +5 -0
  21. package/dist/VitestTransactionIsolator-pLwsDo_A.mjs +40 -0
  22. package/dist/VitestTransactionIsolator-zK5NJ7DQ.cjs +51 -0
  23. package/dist/VitestTransactionIsolator.cjs +5 -0
  24. package/dist/VitestTransactionIsolator.mjs +4 -0
  25. package/dist/__tests__/Factory.spec.cjs +139 -0
  26. package/dist/__tests__/Factory.spec.mjs +139 -0
  27. package/dist/__tests__/KyselyFactory.spec.cjs +221 -15008
  28. package/dist/__tests__/KyselyFactory.spec.mjs +220 -15034
  29. package/dist/__tests__/ObjectionFactory.spec.cjs +387 -0
  30. package/dist/__tests__/ObjectionFactory.spec.mjs +386 -0
  31. package/dist/__tests__/PostgresMigrator.spec.cjs +257 -0
  32. package/dist/__tests__/PostgresMigrator.spec.mjs +256 -0
  33. package/dist/__tests__/faker.spec.cjs +115 -0
  34. package/dist/__tests__/faker.spec.mjs +115 -0
  35. package/dist/__tests__/integration.spec.cjs +279 -0
  36. package/dist/__tests__/integration.spec.mjs +279 -0
  37. package/dist/chunk-DWy1uDak.cjs +39 -0
  38. package/dist/dist-BM2KvLG1.mjs +5618 -0
  39. package/dist/dist-DE3gAxQI.cjs +5736 -0
  40. package/dist/example.cjs +2 -1
  41. package/dist/example.mjs +3 -2
  42. package/dist/faker-cGCFcrj2.mjs +85 -0
  43. package/dist/faker-h6CkRloU.cjs +121 -0
  44. package/dist/faker.cjs +8 -0
  45. package/dist/faker.mjs +3 -0
  46. package/dist/helpers-BnARb5Ap.mjs +19 -0
  47. package/dist/helpers-C2NH7xcz.cjs +135 -0
  48. package/dist/helpers-C_RZk04R.cjs +31 -0
  49. package/dist/helpers-CukcFAU9.mjs +111 -0
  50. package/dist/helpers.cjs +7 -0
  51. package/dist/helpers.mjs +6 -0
  52. package/dist/kysely.cjs +16 -4
  53. package/dist/kysely.mjs +16 -5
  54. package/dist/objection.cjs +1 -1
  55. package/dist/objection.mjs +2 -2
  56. package/dist/vi.bdSIJ99Y-BgRxGeO2.mjs +9382 -0
  57. package/dist/vi.bdSIJ99Y-CFuzUeY6.cjs +9393 -0
  58. package/package.json +11 -6
  59. package/src/Factory.ts +3 -1
  60. package/src/KyselyFactory.ts +30 -36
  61. package/src/VitestKyselyTransactionIsolator.ts +23 -0
  62. package/src/VitestTransactionIsolator.ts +70 -0
  63. package/src/__tests__/Factory.spec.ts +164 -0
  64. package/src/__tests__/KyselyFactory.spec.ts +432 -64
  65. package/src/__tests__/ObjectionFactory.spec.ts +532 -0
  66. package/src/__tests__/PostgresMigrator.spec.ts +366 -0
  67. package/src/__tests__/faker.spec.ts +142 -0
  68. package/src/__tests__/integration.spec.ts +442 -0
  69. package/src/faker.ts +112 -0
  70. package/src/helpers.ts +28 -0
  71. package/src/kysely.ts +14 -0
  72. package/test/globalSetup.ts +41 -40
  73. package/test/helpers.ts +273 -0
  74. /package/dist/{Factory-DlzMkMzb.mjs → Factory-D52Lsc6Z.mjs} +0 -0
  75. /package/dist/{ObjectionFactory-DeFYWbzt.cjs → ObjectionFactory-BlkzSEqo.cjs} +0 -0
  76. /package/dist/{PostgresMigrator-BKaNTth5.mjs → PostgresMigrator-DqeuPy-e.mjs} +0 -0
  77. /package/dist/{magic-string.es-CxbtJGk_.mjs → magic-string.es-C6yzoryu.mjs} +0 -0
  78. /package/dist/{magic-string.es-KiPEzMtt.cjs → magic-string.es-jdtJrR0A.cjs} +0 -0
@@ -0,0 +1,279 @@
1
+ require('../Factory-DREHoms3.cjs');
2
+ require('../faker-h6CkRloU.cjs');
3
+ const require_KyselyFactory = require('../KyselyFactory-BGvSMLtd.cjs');
4
+ const require_dist = require('../dist-DE3gAxQI.cjs');
5
+ const require_vi_bdSIJ99Y = require('../vi.bdSIJ99Y-CFuzUeY6.cjs');
6
+ require('../VitestTransactionIsolator-zK5NJ7DQ.cjs');
7
+ require('../VitestKyselyTransactionIsolator-Dh2AgJDd.cjs');
8
+ const require_helpers = require('../helpers-C_RZk04R.cjs');
9
+ const require_helpers$1 = require('../helpers-C2NH7xcz.cjs');
10
+
11
+ //#region src/__tests__/integration.spec.ts
12
+ const db = require_helpers.createKyselyDb(require_helpers$1.TEST_DATABASE_CONFIG);
13
+ const it = require_helpers.wrapVitestKyselyTransaction(db, require_helpers$1.createTestTables);
14
+ require_dist.describe("Testkit Integration Tests", () => {
15
+ require_dist.beforeAll(async () => {});
16
+ require_dist.describe("Complex Factory Scenarios", () => {
17
+ it("should handle complex multi-table data creation", async ({ trx }) => {
18
+ const userBuilder = require_KyselyFactory.KyselyFactory.createBuilder("users", async (attrs) => ({
19
+ name: "John Doe",
20
+ email: `user${Date.now()}-${Math.random()}@example.com`,
21
+ role: "user",
22
+ createdAt: /* @__PURE__ */ new Date(),
23
+ updatedAt: /* @__PURE__ */ new Date()
24
+ }));
25
+ const postBuilder = require_KyselyFactory.KyselyFactory.createBuilder("posts", async (attrs, factory$1) => {
26
+ if (!attrs.userId) {
27
+ const user = await factory$1.insert("user");
28
+ return {
29
+ title: "Default Post Title",
30
+ content: "Default post content...",
31
+ userId: user.id,
32
+ published: false,
33
+ createdAt: /* @__PURE__ */ new Date(),
34
+ updatedAt: /* @__PURE__ */ new Date()
35
+ };
36
+ }
37
+ return {
38
+ title: "Default Post Title",
39
+ content: "Default post content...",
40
+ published: false,
41
+ createdAt: /* @__PURE__ */ new Date(),
42
+ updatedAt: /* @__PURE__ */ new Date()
43
+ };
44
+ });
45
+ const commentBuilder = require_KyselyFactory.KyselyFactory.createBuilder("comments", async (attrs, factory$1) => {
46
+ let postId = attrs.postId;
47
+ let userId = attrs.userId;
48
+ if (!postId) {
49
+ const post = await factory$1.insert("post");
50
+ postId = post.id;
51
+ }
52
+ if (!userId) {
53
+ const user = await factory$1.insert("user");
54
+ userId = user.id;
55
+ }
56
+ return {
57
+ content: "Default comment content",
58
+ postId,
59
+ userId,
60
+ createdAt: /* @__PURE__ */ new Date()
61
+ };
62
+ });
63
+ const builders = {
64
+ user: userBuilder,
65
+ post: postBuilder,
66
+ comment: commentBuilder
67
+ };
68
+ const factory = new require_KyselyFactory.KyselyFactory(builders, {}, trx);
69
+ const author = await factory.insert("user", {
70
+ name: "Jane Author",
71
+ email: "jane@author.com",
72
+ role: "admin"
73
+ });
74
+ const posts = await factory.insertMany(3, "post", (idx) => ({
75
+ title: `Post ${idx + 1}`,
76
+ content: `Content for post ${idx + 1}`,
77
+ userId: author.id,
78
+ published: idx < 2
79
+ }));
80
+ const comments = await factory.insertMany(5, "comment", (idx) => ({
81
+ content: `Comment ${idx + 1} on first post`,
82
+ postId: posts[0].id
83
+ }));
84
+ require_vi_bdSIJ99Y.globalExpect(author.name).toBe("Jane Author");
85
+ require_vi_bdSIJ99Y.globalExpect(author.role).toBe("admin");
86
+ require_vi_bdSIJ99Y.globalExpect(posts).toHaveLength(3);
87
+ require_vi_bdSIJ99Y.globalExpect(posts[0].title).toBe("Post 1");
88
+ require_vi_bdSIJ99Y.globalExpect(posts[0].published).toBe(true);
89
+ require_vi_bdSIJ99Y.globalExpect(posts[2].published).toBe(false);
90
+ require_vi_bdSIJ99Y.globalExpect(comments).toHaveLength(5);
91
+ comments.forEach((comment, idx) => {
92
+ require_vi_bdSIJ99Y.globalExpect(comment.content).toBe(`Comment ${idx + 1} on first post`);
93
+ require_vi_bdSIJ99Y.globalExpect(comment.postId).toBe(posts[0].id);
94
+ });
95
+ const authorPosts = await trx.selectFrom("posts").selectAll().where("userId", "=", author.id).execute();
96
+ require_vi_bdSIJ99Y.globalExpect(authorPosts).toHaveLength(3);
97
+ const firstPostComments = await trx.selectFrom("comments").selectAll().where("postId", "=", posts[0].id).execute();
98
+ require_vi_bdSIJ99Y.globalExpect(firstPostComments).toHaveLength(5);
99
+ });
100
+ it("should handle seeds for complex scenarios", async ({ trx }) => {
101
+ const c = await trx.selectFrom("users").select(trx.fn.count("id").as("count")).executeTakeFirst();
102
+ const userBuilder = require_KyselyFactory.KyselyFactory.createBuilder("users", async (attrs) => ({
103
+ name: "Default User",
104
+ email: `user${Date.now()}-${Math.random()}@example.com`,
105
+ role: "user",
106
+ createdAt: /* @__PURE__ */ new Date(),
107
+ updatedAt: /* @__PURE__ */ new Date()
108
+ }));
109
+ const postBuilder = require_KyselyFactory.KyselyFactory.createBuilder("posts", async (attrs, factory$1) => {
110
+ if (!attrs.userId) {
111
+ const user = await factory$1.insert("user");
112
+ return {
113
+ title: "Default Post",
114
+ content: "Default content",
115
+ userId: user.id,
116
+ published: false,
117
+ createdAt: /* @__PURE__ */ new Date(),
118
+ updatedAt: /* @__PURE__ */ new Date()
119
+ };
120
+ }
121
+ return {
122
+ title: "Default Post",
123
+ content: "Default content",
124
+ published: false,
125
+ createdAt: /* @__PURE__ */ new Date(),
126
+ updatedAt: /* @__PURE__ */ new Date()
127
+ };
128
+ });
129
+ const builders = {
130
+ user: userBuilder,
131
+ post: postBuilder
132
+ };
133
+ const seeds = {
134
+ blogWithAdminAndPosts: require_KyselyFactory.KyselyFactory.createSeed(async (attrs, factory$1, db$1) => {
135
+ const admin = await factory$1.insert("user", {
136
+ name: "Blog Admin",
137
+ email: "admin@blog.com",
138
+ role: "admin"
139
+ });
140
+ const postCount = attrs.postCount || 3;
141
+ const posts = await factory$1.insertMany(postCount, "post", (idx) => ({
142
+ title: `Admin Post ${idx + 1}`,
143
+ content: `Content for admin post ${idx + 1}`,
144
+ userId: admin.id,
145
+ published: true
146
+ }));
147
+ return {
148
+ admin,
149
+ posts,
150
+ summary: {
151
+ adminId: admin.id,
152
+ postIds: posts.map((p) => p.id),
153
+ totalPosts: posts.length
154
+ }
155
+ };
156
+ }),
157
+ usersWithPosts: require_KyselyFactory.KyselyFactory.createSeed(async (attrs, factory$1, db$1) => {
158
+ const userCount = attrs.userCount || 2;
159
+ const postsPerUser = attrs.postsPerUser || 2;
160
+ const results = [];
161
+ for (let i = 0; i < userCount; i++) {
162
+ const user = await factory$1.insert("user", {
163
+ name: `User ${i + 1}`,
164
+ email: `user${i + 1}@example.com`
165
+ });
166
+ const posts = await factory$1.insertMany(postsPerUser, "post", (postIdx) => ({
167
+ title: `User ${i + 1} Post ${postIdx + 1}`,
168
+ content: `Content from user ${i + 1}, post ${postIdx + 1}`,
169
+ userId: user.id,
170
+ published: postIdx === 0
171
+ }));
172
+ results.push({
173
+ user,
174
+ posts
175
+ });
176
+ }
177
+ return results;
178
+ })
179
+ };
180
+ const factory = new require_KyselyFactory.KyselyFactory(builders, seeds, trx);
181
+ const blogData = await factory.seed("blogWithAdminAndPosts", { postCount: 5 });
182
+ require_vi_bdSIJ99Y.globalExpect(blogData.admin.name).toBe("Blog Admin");
183
+ require_vi_bdSIJ99Y.globalExpect(blogData.admin.role).toBe("admin");
184
+ require_vi_bdSIJ99Y.globalExpect(blogData.posts).toHaveLength(5);
185
+ require_vi_bdSIJ99Y.globalExpect(blogData.summary.totalPosts).toBe(5);
186
+ const userData = await factory.seed("usersWithPosts", {
187
+ userCount: 3,
188
+ postsPerUser: 4
189
+ });
190
+ require_vi_bdSIJ99Y.globalExpect(userData).toHaveLength(3);
191
+ const totalUsers = await trx.selectFrom("users").select(trx.fn.count("id").as("count")).executeTakeFirst();
192
+ const totalPosts = await trx.selectFrom("posts").select(trx.fn.count("id").as("count")).executeTakeFirst();
193
+ require_vi_bdSIJ99Y.globalExpect(Number(totalUsers?.count)).toBe(4);
194
+ require_vi_bdSIJ99Y.globalExpect(Number(totalPosts?.count)).toBe(17);
195
+ });
196
+ it("should handle transaction isolation properly", async ({ trx }) => {
197
+ const userBuilder = require_KyselyFactory.KyselyFactory.createBuilder("users", async (attrs, factory, db$1, faker) => ({
198
+ name: "Test User",
199
+ email: faker.internet.email(),
200
+ role: "user",
201
+ createdAt: /* @__PURE__ */ new Date(),
202
+ updatedAt: /* @__PURE__ */ new Date()
203
+ }));
204
+ const builders = { user: userBuilder };
205
+ const factory1 = new require_KyselyFactory.KyselyFactory(builders, {}, trx);
206
+ const user = await factory1.insert("user", {
207
+ name: "Transaction User",
208
+ email: "transaction@test.com"
209
+ });
210
+ const userInTrx = await trx.selectFrom("users").selectAll().where("id", "=", user.id).executeTakeFirst();
211
+ require_vi_bdSIJ99Y.globalExpect(userInTrx).toBeDefined();
212
+ require_vi_bdSIJ99Y.globalExpect(userInTrx?.name).toBe("Transaction User");
213
+ });
214
+ });
215
+ require_dist.describe("Performance and Edge Cases", () => {
216
+ it("should handle creating many records efficiently", async ({ trx }) => {
217
+ const userBuilder = require_KyselyFactory.KyselyFactory.createBuilder("users", async (attrs, factory$1, db$1, faker) => ({
218
+ name: `User ${Math.random()}`,
219
+ email: faker.internet.email().toLowerCase(),
220
+ role: "user",
221
+ createdAt: /* @__PURE__ */ new Date(),
222
+ updatedAt: /* @__PURE__ */ new Date()
223
+ }));
224
+ const builders = { user: userBuilder };
225
+ const factory = new require_KyselyFactory.KyselyFactory(builders, {}, trx);
226
+ const startTime = Date.now();
227
+ const users = await factory.insertMany(100, "user");
228
+ const endTime = Date.now();
229
+ const duration = endTime - startTime;
230
+ require_vi_bdSIJ99Y.globalExpect(users).toHaveLength(100);
231
+ require_vi_bdSIJ99Y.globalExpect(duration).toBeLessThan(5e3);
232
+ const emails = users.map((u) => u.email);
233
+ const uniqueEmails = new Set(emails);
234
+ require_vi_bdSIJ99Y.globalExpect(uniqueEmails.size).toBe(100);
235
+ });
236
+ it("should handle complex attribute generation", async ({ trx }) => {
237
+ const userBuilder = require_KyselyFactory.KyselyFactory.createBuilder("users", async (attrs, factory$1, db$1, faker) => {
238
+ return {
239
+ name: `Generated User ${attrs.id}`,
240
+ email: faker.internet.email().toLowerCase(),
241
+ role: "user"
242
+ };
243
+ });
244
+ const postBuilder = require_KyselyFactory.KyselyFactory.createBuilder("posts", async (attrs, factory$1) => {
245
+ let userId = attrs.userId;
246
+ if (!userId) {
247
+ const user = await factory$1.insert("user");
248
+ userId = user.id;
249
+ }
250
+ return {
251
+ title: `Auto-generated Post`,
252
+ content: `This is auto-generated content for post. Lorem ipsum dolor sit amet.`,
253
+ published: true,
254
+ userId,
255
+ createdAt: /* @__PURE__ */ new Date(),
256
+ updatedAt: /* @__PURE__ */ new Date()
257
+ };
258
+ });
259
+ const builders = {
260
+ user: userBuilder,
261
+ post: postBuilder
262
+ };
263
+ const factory = new require_KyselyFactory.KyselyFactory(builders, {}, trx);
264
+ const posts = await factory.insertMany(10, "post", (i) => ({ published: i % 2 === 0 }));
265
+ require_vi_bdSIJ99Y.globalExpect(posts).toHaveLength(10);
266
+ const users = await trx.selectFrom("users").selectAll().execute();
267
+ users.forEach((user) => {
268
+ require_vi_bdSIJ99Y.globalExpect(user.email).toBe(user.email.toLowerCase());
269
+ require_vi_bdSIJ99Y.globalExpect(user.name).not.toMatch(/^\s|\s$/);
270
+ });
271
+ const publishedPosts = posts.filter((p) => p.published);
272
+ const unpublishedPosts = posts.filter((p) => !p.published);
273
+ require_vi_bdSIJ99Y.globalExpect(publishedPosts).toHaveLength(5);
274
+ require_vi_bdSIJ99Y.globalExpect(unpublishedPosts).toHaveLength(5);
275
+ });
276
+ });
277
+ });
278
+
279
+ //#endregion
@@ -0,0 +1,279 @@
1
+ import { beforeAll, describe } from "../dist-BM2KvLG1.mjs";
2
+ import "../Factory-D52Lsc6Z.mjs";
3
+ import "../faker-cGCFcrj2.mjs";
4
+ import { KyselyFactory } from "../KyselyFactory-ionH4gvk.mjs";
5
+ import { globalExpect } from "../vi.bdSIJ99Y-BgRxGeO2.mjs";
6
+ import "../VitestTransactionIsolator-pLwsDo_A.mjs";
7
+ import "../VitestKyselyTransactionIsolator-DXjWQtDN.mjs";
8
+ import { createKyselyDb, wrapVitestKyselyTransaction } from "../helpers-BnARb5Ap.mjs";
9
+ import { TEST_DATABASE_CONFIG, createTestTables } from "../helpers-CukcFAU9.mjs";
10
+
11
+ //#region src/__tests__/integration.spec.ts
12
+ const db = createKyselyDb(TEST_DATABASE_CONFIG);
13
+ const it = wrapVitestKyselyTransaction(db, createTestTables);
14
+ describe("Testkit Integration Tests", () => {
15
+ beforeAll(async () => {});
16
+ describe("Complex Factory Scenarios", () => {
17
+ it("should handle complex multi-table data creation", async ({ trx }) => {
18
+ const userBuilder = KyselyFactory.createBuilder("users", async (attrs) => ({
19
+ name: "John Doe",
20
+ email: `user${Date.now()}-${Math.random()}@example.com`,
21
+ role: "user",
22
+ createdAt: /* @__PURE__ */ new Date(),
23
+ updatedAt: /* @__PURE__ */ new Date()
24
+ }));
25
+ const postBuilder = KyselyFactory.createBuilder("posts", async (attrs, factory$1) => {
26
+ if (!attrs.userId) {
27
+ const user = await factory$1.insert("user");
28
+ return {
29
+ title: "Default Post Title",
30
+ content: "Default post content...",
31
+ userId: user.id,
32
+ published: false,
33
+ createdAt: /* @__PURE__ */ new Date(),
34
+ updatedAt: /* @__PURE__ */ new Date()
35
+ };
36
+ }
37
+ return {
38
+ title: "Default Post Title",
39
+ content: "Default post content...",
40
+ published: false,
41
+ createdAt: /* @__PURE__ */ new Date(),
42
+ updatedAt: /* @__PURE__ */ new Date()
43
+ };
44
+ });
45
+ const commentBuilder = KyselyFactory.createBuilder("comments", async (attrs, factory$1) => {
46
+ let postId = attrs.postId;
47
+ let userId = attrs.userId;
48
+ if (!postId) {
49
+ const post = await factory$1.insert("post");
50
+ postId = post.id;
51
+ }
52
+ if (!userId) {
53
+ const user = await factory$1.insert("user");
54
+ userId = user.id;
55
+ }
56
+ return {
57
+ content: "Default comment content",
58
+ postId,
59
+ userId,
60
+ createdAt: /* @__PURE__ */ new Date()
61
+ };
62
+ });
63
+ const builders = {
64
+ user: userBuilder,
65
+ post: postBuilder,
66
+ comment: commentBuilder
67
+ };
68
+ const factory = new KyselyFactory(builders, {}, trx);
69
+ const author = await factory.insert("user", {
70
+ name: "Jane Author",
71
+ email: "jane@author.com",
72
+ role: "admin"
73
+ });
74
+ const posts = await factory.insertMany(3, "post", (idx) => ({
75
+ title: `Post ${idx + 1}`,
76
+ content: `Content for post ${idx + 1}`,
77
+ userId: author.id,
78
+ published: idx < 2
79
+ }));
80
+ const comments = await factory.insertMany(5, "comment", (idx) => ({
81
+ content: `Comment ${idx + 1} on first post`,
82
+ postId: posts[0].id
83
+ }));
84
+ globalExpect(author.name).toBe("Jane Author");
85
+ globalExpect(author.role).toBe("admin");
86
+ globalExpect(posts).toHaveLength(3);
87
+ globalExpect(posts[0].title).toBe("Post 1");
88
+ globalExpect(posts[0].published).toBe(true);
89
+ globalExpect(posts[2].published).toBe(false);
90
+ globalExpect(comments).toHaveLength(5);
91
+ comments.forEach((comment, idx) => {
92
+ globalExpect(comment.content).toBe(`Comment ${idx + 1} on first post`);
93
+ globalExpect(comment.postId).toBe(posts[0].id);
94
+ });
95
+ const authorPosts = await trx.selectFrom("posts").selectAll().where("userId", "=", author.id).execute();
96
+ globalExpect(authorPosts).toHaveLength(3);
97
+ const firstPostComments = await trx.selectFrom("comments").selectAll().where("postId", "=", posts[0].id).execute();
98
+ globalExpect(firstPostComments).toHaveLength(5);
99
+ });
100
+ it("should handle seeds for complex scenarios", async ({ trx }) => {
101
+ const c = await trx.selectFrom("users").select(trx.fn.count("id").as("count")).executeTakeFirst();
102
+ const userBuilder = KyselyFactory.createBuilder("users", async (attrs) => ({
103
+ name: "Default User",
104
+ email: `user${Date.now()}-${Math.random()}@example.com`,
105
+ role: "user",
106
+ createdAt: /* @__PURE__ */ new Date(),
107
+ updatedAt: /* @__PURE__ */ new Date()
108
+ }));
109
+ const postBuilder = KyselyFactory.createBuilder("posts", async (attrs, factory$1) => {
110
+ if (!attrs.userId) {
111
+ const user = await factory$1.insert("user");
112
+ return {
113
+ title: "Default Post",
114
+ content: "Default content",
115
+ userId: user.id,
116
+ published: false,
117
+ createdAt: /* @__PURE__ */ new Date(),
118
+ updatedAt: /* @__PURE__ */ new Date()
119
+ };
120
+ }
121
+ return {
122
+ title: "Default Post",
123
+ content: "Default content",
124
+ published: false,
125
+ createdAt: /* @__PURE__ */ new Date(),
126
+ updatedAt: /* @__PURE__ */ new Date()
127
+ };
128
+ });
129
+ const builders = {
130
+ user: userBuilder,
131
+ post: postBuilder
132
+ };
133
+ const seeds = {
134
+ blogWithAdminAndPosts: KyselyFactory.createSeed(async (attrs, factory$1, db$1) => {
135
+ const admin = await factory$1.insert("user", {
136
+ name: "Blog Admin",
137
+ email: "admin@blog.com",
138
+ role: "admin"
139
+ });
140
+ const postCount = attrs.postCount || 3;
141
+ const posts = await factory$1.insertMany(postCount, "post", (idx) => ({
142
+ title: `Admin Post ${idx + 1}`,
143
+ content: `Content for admin post ${idx + 1}`,
144
+ userId: admin.id,
145
+ published: true
146
+ }));
147
+ return {
148
+ admin,
149
+ posts,
150
+ summary: {
151
+ adminId: admin.id,
152
+ postIds: posts.map((p) => p.id),
153
+ totalPosts: posts.length
154
+ }
155
+ };
156
+ }),
157
+ usersWithPosts: KyselyFactory.createSeed(async (attrs, factory$1, db$1) => {
158
+ const userCount = attrs.userCount || 2;
159
+ const postsPerUser = attrs.postsPerUser || 2;
160
+ const results = [];
161
+ for (let i = 0; i < userCount; i++) {
162
+ const user = await factory$1.insert("user", {
163
+ name: `User ${i + 1}`,
164
+ email: `user${i + 1}@example.com`
165
+ });
166
+ const posts = await factory$1.insertMany(postsPerUser, "post", (postIdx) => ({
167
+ title: `User ${i + 1} Post ${postIdx + 1}`,
168
+ content: `Content from user ${i + 1}, post ${postIdx + 1}`,
169
+ userId: user.id,
170
+ published: postIdx === 0
171
+ }));
172
+ results.push({
173
+ user,
174
+ posts
175
+ });
176
+ }
177
+ return results;
178
+ })
179
+ };
180
+ const factory = new KyselyFactory(builders, seeds, trx);
181
+ const blogData = await factory.seed("blogWithAdminAndPosts", { postCount: 5 });
182
+ globalExpect(blogData.admin.name).toBe("Blog Admin");
183
+ globalExpect(blogData.admin.role).toBe("admin");
184
+ globalExpect(blogData.posts).toHaveLength(5);
185
+ globalExpect(blogData.summary.totalPosts).toBe(5);
186
+ const userData = await factory.seed("usersWithPosts", {
187
+ userCount: 3,
188
+ postsPerUser: 4
189
+ });
190
+ globalExpect(userData).toHaveLength(3);
191
+ const totalUsers = await trx.selectFrom("users").select(trx.fn.count("id").as("count")).executeTakeFirst();
192
+ const totalPosts = await trx.selectFrom("posts").select(trx.fn.count("id").as("count")).executeTakeFirst();
193
+ globalExpect(Number(totalUsers?.count)).toBe(4);
194
+ globalExpect(Number(totalPosts?.count)).toBe(17);
195
+ });
196
+ it("should handle transaction isolation properly", async ({ trx }) => {
197
+ const userBuilder = KyselyFactory.createBuilder("users", async (attrs, factory, db$1, faker) => ({
198
+ name: "Test User",
199
+ email: faker.internet.email(),
200
+ role: "user",
201
+ createdAt: /* @__PURE__ */ new Date(),
202
+ updatedAt: /* @__PURE__ */ new Date()
203
+ }));
204
+ const builders = { user: userBuilder };
205
+ const factory1 = new KyselyFactory(builders, {}, trx);
206
+ const user = await factory1.insert("user", {
207
+ name: "Transaction User",
208
+ email: "transaction@test.com"
209
+ });
210
+ const userInTrx = await trx.selectFrom("users").selectAll().where("id", "=", user.id).executeTakeFirst();
211
+ globalExpect(userInTrx).toBeDefined();
212
+ globalExpect(userInTrx?.name).toBe("Transaction User");
213
+ });
214
+ });
215
+ describe("Performance and Edge Cases", () => {
216
+ it("should handle creating many records efficiently", async ({ trx }) => {
217
+ const userBuilder = KyselyFactory.createBuilder("users", async (attrs, factory$1, db$1, faker) => ({
218
+ name: `User ${Math.random()}`,
219
+ email: faker.internet.email().toLowerCase(),
220
+ role: "user",
221
+ createdAt: /* @__PURE__ */ new Date(),
222
+ updatedAt: /* @__PURE__ */ new Date()
223
+ }));
224
+ const builders = { user: userBuilder };
225
+ const factory = new KyselyFactory(builders, {}, trx);
226
+ const startTime = Date.now();
227
+ const users = await factory.insertMany(100, "user");
228
+ const endTime = Date.now();
229
+ const duration = endTime - startTime;
230
+ globalExpect(users).toHaveLength(100);
231
+ globalExpect(duration).toBeLessThan(5e3);
232
+ const emails = users.map((u) => u.email);
233
+ const uniqueEmails = new Set(emails);
234
+ globalExpect(uniqueEmails.size).toBe(100);
235
+ });
236
+ it("should handle complex attribute generation", async ({ trx }) => {
237
+ const userBuilder = KyselyFactory.createBuilder("users", async (attrs, factory$1, db$1, faker) => {
238
+ return {
239
+ name: `Generated User ${attrs.id}`,
240
+ email: faker.internet.email().toLowerCase(),
241
+ role: "user"
242
+ };
243
+ });
244
+ const postBuilder = KyselyFactory.createBuilder("posts", async (attrs, factory$1) => {
245
+ let userId = attrs.userId;
246
+ if (!userId) {
247
+ const user = await factory$1.insert("user");
248
+ userId = user.id;
249
+ }
250
+ return {
251
+ title: `Auto-generated Post`,
252
+ content: `This is auto-generated content for post. Lorem ipsum dolor sit amet.`,
253
+ published: true,
254
+ userId,
255
+ createdAt: /* @__PURE__ */ new Date(),
256
+ updatedAt: /* @__PURE__ */ new Date()
257
+ };
258
+ });
259
+ const builders = {
260
+ user: userBuilder,
261
+ post: postBuilder
262
+ };
263
+ const factory = new KyselyFactory(builders, {}, trx);
264
+ const posts = await factory.insertMany(10, "post", (i) => ({ published: i % 2 === 0 }));
265
+ globalExpect(posts).toHaveLength(10);
266
+ const users = await trx.selectFrom("users").selectAll().execute();
267
+ users.forEach((user) => {
268
+ globalExpect(user.email).toBe(user.email.toLowerCase());
269
+ globalExpect(user.name).not.toMatch(/^\s|\s$/);
270
+ });
271
+ const publishedPosts = posts.filter((p) => p.published);
272
+ const unpublishedPosts = posts.filter((p) => !p.published);
273
+ globalExpect(publishedPosts).toHaveLength(5);
274
+ globalExpect(unpublishedPosts).toHaveLength(5);
275
+ });
276
+ });
277
+ });
278
+
279
+ //#endregion
@@ -0,0 +1,39 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
13
+ key = keys[i];
14
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
15
+ get: ((k) => from[k]).bind(null, key),
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
+ });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
22
+ value: mod,
23
+ enumerable: true
24
+ }) : target, mod));
25
+
26
+ //#endregion
27
+
28
+ Object.defineProperty(exports, '__commonJS', {
29
+ enumerable: true,
30
+ get: function () {
31
+ return __commonJS;
32
+ }
33
+ });
34
+ Object.defineProperty(exports, '__toESM', {
35
+ enumerable: true,
36
+ get: function () {
37
+ return __toESM;
38
+ }
39
+ });