@geekmidas/testkit 0.4.0 → 1.0.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 (209) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/Factory-BFVnMMCC.mjs.map +1 -1
  3. package/dist/{Factory-c16c27Y6.d.cts → Factory-BOX312yd.d.cts} +3 -2
  4. package/dist/Factory-BOX312yd.d.cts.map +1 -0
  5. package/dist/Factory-BhjUOBWN.cjs.map +1 -1
  6. package/dist/{Factory-BcGJjLc8.d.mts → Factory-SFupxRC2.d.mts} +2 -1
  7. package/dist/Factory-SFupxRC2.d.mts.map +1 -0
  8. package/dist/Factory.d.cts +2 -2
  9. package/dist/Factory.d.mts +1 -1
  10. package/dist/KyselyFactory-BFqVIn_0.cjs.map +1 -1
  11. package/dist/KyselyFactory-DMswpwji.mjs.map +1 -1
  12. package/dist/{KyselyFactory-uZ45h7YU.d.cts → KyselyFactory-Dy5zzV4B.d.cts} +4 -3
  13. package/dist/KyselyFactory-Dy5zzV4B.d.cts.map +1 -0
  14. package/dist/{KyselyFactory-Cj-EultY.d.mts → KyselyFactory-vAxYodck.d.mts} +3 -2
  15. package/dist/KyselyFactory-vAxYodck.d.mts.map +1 -0
  16. package/dist/KyselyFactory.d.cts +3 -3
  17. package/dist/KyselyFactory.d.mts +2 -2
  18. package/dist/{ObjectionFactory-DL4qkuF1.d.mts → ObjectionFactory-BWjB49-i.d.mts} +3 -2
  19. package/dist/ObjectionFactory-BWjB49-i.d.mts.map +1 -0
  20. package/dist/ObjectionFactory-BeFBYcan.cjs.map +1 -1
  21. package/dist/{ObjectionFactory-CdhzKs4f.d.cts → ObjectionFactory-CD-WFuMJ.d.cts} +4 -3
  22. package/dist/ObjectionFactory-CD-WFuMJ.d.cts.map +1 -0
  23. package/dist/ObjectionFactory-QCJ7u0Ql.mjs.map +1 -1
  24. package/dist/ObjectionFactory.d.cts +3 -3
  25. package/dist/ObjectionFactory.d.mts +2 -2
  26. package/dist/{PostgresKyselyMigrator-upT-hmrz.mjs → PostgresKyselyMigrator-6sE1KOni.mjs} +2 -2
  27. package/dist/PostgresKyselyMigrator-6sE1KOni.mjs.map +1 -0
  28. package/dist/{PostgresKyselyMigrator-CIx3AFSR.d.mts → PostgresKyselyMigrator-CBltSOq5.d.cts} +3 -2
  29. package/dist/PostgresKyselyMigrator-CBltSOq5.d.cts.map +1 -0
  30. package/dist/{PostgresKyselyMigrator-CfytARcA.cjs → PostgresKyselyMigrator-D6IbPq8t.cjs} +2 -2
  31. package/dist/PostgresKyselyMigrator-D6IbPq8t.cjs.map +1 -0
  32. package/dist/{PostgresKyselyMigrator-CQ3aUoy_.d.cts → PostgresKyselyMigrator-DrVWncqd.d.mts} +3 -2
  33. package/dist/PostgresKyselyMigrator-DrVWncqd.d.mts.map +1 -0
  34. package/dist/PostgresKyselyMigrator.cjs +2 -2
  35. package/dist/PostgresKyselyMigrator.d.cts +2 -2
  36. package/dist/PostgresKyselyMigrator.d.mts +2 -2
  37. package/dist/PostgresKyselyMigrator.mjs +2 -2
  38. package/dist/{PostgresMigrator-DbuJGAVy.mjs → PostgresMigrator-BjjenqSd.mjs} +2 -2
  39. package/dist/PostgresMigrator-BjjenqSd.mjs.map +1 -0
  40. package/dist/{PostgresMigrator-D5UkK1_K.d.cts → PostgresMigrator-Bres0U6E.d.cts} +2 -1
  41. package/dist/PostgresMigrator-Bres0U6E.d.cts.map +1 -0
  42. package/dist/{PostgresMigrator-DFcNdCvD.cjs → PostgresMigrator-D6dQn0x2.cjs} +2 -2
  43. package/dist/PostgresMigrator-D6dQn0x2.cjs.map +1 -0
  44. package/dist/{PostgresMigrator-DQaRxoaY.d.mts → PostgresMigrator-S-YYosAC.d.mts} +2 -1
  45. package/dist/PostgresMigrator-S-YYosAC.d.mts.map +1 -0
  46. package/dist/PostgresMigrator.cjs +1 -1
  47. package/dist/PostgresMigrator.d.cts +1 -1
  48. package/dist/PostgresMigrator.d.mts +1 -1
  49. package/dist/PostgresMigrator.mjs +1 -1
  50. package/dist/{PostgresObjectionMigrator-CZHHcCOv.d.cts → PostgresObjectionMigrator-CPfBAP7r.d.cts} +3 -2
  51. package/dist/PostgresObjectionMigrator-CPfBAP7r.d.cts.map +1 -0
  52. package/dist/{PostgresObjectionMigrator-BG6ymgnt.cjs → PostgresObjectionMigrator-DK8ODIHQ.cjs} +2 -2
  53. package/dist/PostgresObjectionMigrator-DK8ODIHQ.cjs.map +1 -0
  54. package/dist/{PostgresObjectionMigrator-D_hCcrQu.d.mts → PostgresObjectionMigrator-DVEqB5tp.d.mts} +3 -2
  55. package/dist/PostgresObjectionMigrator-DVEqB5tp.d.mts.map +1 -0
  56. package/dist/{PostgresObjectionMigrator-DPj2pOpX.mjs → PostgresObjectionMigrator-D_QxXbIN.mjs} +2 -2
  57. package/dist/PostgresObjectionMigrator-D_QxXbIN.mjs.map +1 -0
  58. package/dist/PostgresObjectionMigrator.cjs +2 -2
  59. package/dist/PostgresObjectionMigrator.d.cts +2 -2
  60. package/dist/PostgresObjectionMigrator.d.mts +2 -2
  61. package/dist/PostgresObjectionMigrator.mjs +2 -2
  62. package/dist/{VitestKyselyTransactionIsolator-D3EZZhjZ.d.cts → VitestKyselyTransactionIsolator-CduJlHoT.d.cts} +4 -3
  63. package/dist/VitestKyselyTransactionIsolator-CduJlHoT.d.cts.map +1 -0
  64. package/dist/{VitestKyselyTransactionIsolator-Dxlp1u0f.d.mts → VitestKyselyTransactionIsolator-Cswnnj0k.d.mts} +4 -3
  65. package/dist/VitestKyselyTransactionIsolator-Cswnnj0k.d.mts.map +1 -0
  66. package/dist/{VitestKyselyTransactionIsolator-EvDLk5zg.cjs → VitestKyselyTransactionIsolator-D7RRXOBa.cjs} +2 -2
  67. package/dist/VitestKyselyTransactionIsolator-D7RRXOBa.cjs.map +1 -0
  68. package/dist/{VitestKyselyTransactionIsolator-CNURW8y6.mjs → VitestKyselyTransactionIsolator-DceyIqr4.mjs} +2 -2
  69. package/dist/VitestKyselyTransactionIsolator-DceyIqr4.mjs.map +1 -0
  70. package/dist/VitestKyselyTransactionIsolator.cjs +1 -1
  71. package/dist/VitestKyselyTransactionIsolator.d.cts +2 -2
  72. package/dist/VitestKyselyTransactionIsolator.d.mts +2 -2
  73. package/dist/VitestKyselyTransactionIsolator.mjs +1 -1
  74. package/dist/{VitestObjectionTransactionIsolator-1TpsPqfG.d.cts → VitestObjectionTransactionIsolator-BXoR6xdG.d.cts} +4 -3
  75. package/dist/VitestObjectionTransactionIsolator-BXoR6xdG.d.cts.map +1 -0
  76. package/dist/{VitestObjectionTransactionIsolator-CM5KTAFA.cjs → VitestObjectionTransactionIsolator-CdLRrzNf.cjs} +2 -2
  77. package/dist/VitestObjectionTransactionIsolator-CdLRrzNf.cjs.map +1 -0
  78. package/dist/{VitestObjectionTransactionIsolator-jQFaCz0u.mjs → VitestObjectionTransactionIsolator-OF2osYY5.mjs} +2 -2
  79. package/dist/VitestObjectionTransactionIsolator-OF2osYY5.mjs.map +1 -0
  80. package/dist/{VitestObjectionTransactionIsolator-i9jIgU8Q.d.mts → VitestObjectionTransactionIsolator-x6hY5j4u.d.mts} +4 -3
  81. package/dist/VitestObjectionTransactionIsolator-x6hY5j4u.d.mts.map +1 -0
  82. package/dist/VitestObjectionTransactionIsolator.cjs +1 -1
  83. package/dist/VitestObjectionTransactionIsolator.d.cts +2 -2
  84. package/dist/VitestObjectionTransactionIsolator.d.mts +2 -2
  85. package/dist/VitestObjectionTransactionIsolator.mjs +1 -1
  86. package/dist/{VitestTransactionIsolator-BvR19bYn.d.mts → VitestTransactionIsolator-BNWJqh9f.d.mts} +3 -2
  87. package/dist/VitestTransactionIsolator-BNWJqh9f.d.mts.map +1 -0
  88. package/dist/VitestTransactionIsolator-CMfJXZP8.cjs.map +1 -1
  89. package/dist/{VitestTransactionIsolator-CwQaxZLP.d.cts → VitestTransactionIsolator-CSroc7Df.d.cts} +3 -2
  90. package/dist/VitestTransactionIsolator-CSroc7Df.d.cts.map +1 -0
  91. package/dist/VitestTransactionIsolator-DQ7tLqgV.mjs.map +1 -1
  92. package/dist/VitestTransactionIsolator.d.cts +1 -1
  93. package/dist/VitestTransactionIsolator.d.mts +1 -1
  94. package/dist/aws.cjs.map +1 -1
  95. package/dist/aws.d.cts +2 -0
  96. package/dist/aws.d.cts.map +1 -0
  97. package/dist/aws.d.mts +2 -0
  98. package/dist/aws.d.mts.map +1 -0
  99. package/dist/aws.mjs.map +1 -1
  100. package/dist/benchmark.cjs.map +1 -1
  101. package/dist/benchmark.d.cts +1 -0
  102. package/dist/benchmark.d.cts.map +1 -0
  103. package/dist/benchmark.d.mts +1 -0
  104. package/dist/benchmark.d.mts.map +1 -0
  105. package/dist/benchmark.mjs.map +1 -1
  106. package/dist/better-auth.cjs +29 -30
  107. package/dist/better-auth.cjs.map +1 -1
  108. package/dist/better-auth.d.cts +2 -2
  109. package/dist/better-auth.d.cts.map +1 -0
  110. package/dist/better-auth.d.mts.map +1 -0
  111. package/dist/better-auth.mjs +29 -30
  112. package/dist/better-auth.mjs.map +1 -1
  113. package/dist/directory-B-Ozljzk.mjs.map +1 -1
  114. package/dist/directory-BVC8g7cX.cjs.map +1 -1
  115. package/dist/{directory-BXavAeJZ.d.mts → directory-CVrfTq1I.d.mts} +2 -1
  116. package/dist/directory-CVrfTq1I.d.mts.map +1 -0
  117. package/dist/{directory-Mi7tdOuD.d.cts → directory-DAnMWi50.d.cts} +2 -1
  118. package/dist/directory-DAnMWi50.d.cts.map +1 -0
  119. package/dist/faker-B14IEMIN.cjs.map +1 -1
  120. package/dist/faker-BGKYFoCT.mjs.map +1 -1
  121. package/dist/{faker-DvxiCtxc.d.cts → faker-Cg76aFNO.d.cts} +3 -3
  122. package/dist/faker-Cg76aFNO.d.cts.map +1 -0
  123. package/dist/faker-DHh7xs4u.d.mts.map +1 -0
  124. package/dist/faker.d.cts +1 -1
  125. package/dist/helpers.cjs.map +1 -1
  126. package/dist/helpers.d.cts +1 -0
  127. package/dist/helpers.d.cts.map +1 -0
  128. package/dist/helpers.d.mts +1 -0
  129. package/dist/helpers.d.mts.map +1 -0
  130. package/dist/helpers.mjs.map +1 -1
  131. package/dist/kysely.cjs +3 -3
  132. package/dist/kysely.cjs.map +1 -1
  133. package/dist/kysely.d.cts +8 -7
  134. package/dist/kysely.d.cts.map +1 -0
  135. package/dist/kysely.d.mts +7 -6
  136. package/dist/kysely.d.mts.map +1 -0
  137. package/dist/kysely.mjs +3 -3
  138. package/dist/kysely.mjs.map +1 -1
  139. package/dist/logger.cjs.map +1 -1
  140. package/dist/logger.d.cts +1 -0
  141. package/dist/logger.d.cts.map +1 -0
  142. package/dist/logger.d.mts +1 -0
  143. package/dist/logger.d.mts.map +1 -0
  144. package/dist/logger.mjs.map +1 -1
  145. package/dist/objection.cjs +3 -3
  146. package/dist/objection.cjs.map +1 -1
  147. package/dist/objection.d.cts +8 -7
  148. package/dist/objection.d.cts.map +1 -0
  149. package/dist/objection.d.mts +7 -6
  150. package/dist/objection.d.mts.map +1 -0
  151. package/dist/objection.mjs +3 -3
  152. package/dist/objection.mjs.map +1 -1
  153. package/dist/os/directory.d.cts +1 -1
  154. package/dist/os/directory.d.mts +1 -1
  155. package/dist/os/index.d.cts +1 -1
  156. package/dist/os/index.d.mts +1 -1
  157. package/dist/timer.cjs.map +1 -1
  158. package/dist/timer.d.cts +2 -0
  159. package/dist/timer.d.cts.map +1 -0
  160. package/dist/timer.d.mts +2 -0
  161. package/dist/timer.d.mts.map +1 -0
  162. package/dist/timer.mjs.map +1 -1
  163. package/package.json +5 -5
  164. package/src/Factory.ts +72 -72
  165. package/src/KyselyFactory.ts +330 -330
  166. package/src/ObjectionFactory.ts +354 -355
  167. package/src/PostgresKyselyMigrator.ts +37 -37
  168. package/src/PostgresMigrator.ts +107 -107
  169. package/src/PostgresObjectionMigrator.ts +91 -91
  170. package/src/VitestKyselyTransactionIsolator.ts +27 -27
  171. package/src/VitestObjectionTransactionIsolator.ts +39 -39
  172. package/src/VitestTransactionIsolator.ts +196 -195
  173. package/src/__tests__/Factory.spec.ts +163 -155
  174. package/src/__tests__/KyselyFactory.spec.ts +443 -439
  175. package/src/__tests__/ObjectionFactory.spec.ts +563 -557
  176. package/src/__tests__/PostgresKyselyMigrator.spec.ts +641 -641
  177. package/src/__tests__/PostgresMigrator.spec.ts +341 -341
  178. package/src/__tests__/PostgresObjectionMigrator.spec.ts +578 -578
  179. package/src/__tests__/VitestObjectionTransactionIsolator.spec.ts +114 -114
  180. package/src/__tests__/benchmark.spec.ts +140 -0
  181. package/src/__tests__/better-auth.spec.ts +15 -15
  182. package/src/__tests__/faker.spec.ts +226 -137
  183. package/src/__tests__/integration.spec.ts +597 -597
  184. package/src/__tests__/utilities.spec.ts +211 -0
  185. package/src/aws.ts +104 -104
  186. package/src/benchmark.ts +12 -12
  187. package/src/better-auth.ts +286 -301
  188. package/src/faker.ts +153 -153
  189. package/src/helpers.ts +6 -6
  190. package/src/kysely.ts +33 -33
  191. package/src/logger.ts +10 -10
  192. package/src/objection.ts +31 -31
  193. package/src/os/directory.ts +11 -10
  194. package/src/timer.ts +1 -1
  195. package/test/globalSetup.ts +45 -45
  196. package/test/helpers.ts +189 -189
  197. package/test/migrations/1749664623372_user.ts +13 -13
  198. package/tsconfig.json +9 -0
  199. package/vitest.config.ts +4 -4
  200. package/dist/PostgresKyselyMigrator-CfytARcA.cjs.map +0 -1
  201. package/dist/PostgresKyselyMigrator-upT-hmrz.mjs.map +0 -1
  202. package/dist/PostgresMigrator-DFcNdCvD.cjs.map +0 -1
  203. package/dist/PostgresMigrator-DbuJGAVy.mjs.map +0 -1
  204. package/dist/PostgresObjectionMigrator-BG6ymgnt.cjs.map +0 -1
  205. package/dist/PostgresObjectionMigrator-DPj2pOpX.mjs.map +0 -1
  206. package/dist/VitestKyselyTransactionIsolator-CNURW8y6.mjs.map +0 -1
  207. package/dist/VitestKyselyTransactionIsolator-EvDLk5zg.cjs.map +0 -1
  208. package/dist/VitestObjectionTransactionIsolator-CM5KTAFA.cjs.map +0 -1
  209. package/dist/VitestObjectionTransactionIsolator-jQFaCz0u.mjs.map +0 -1
@@ -1,170 +1,178 @@
1
1
  import { beforeEach, describe, expect, it } from 'vitest';
2
2
  import {
3
- Factory,
4
- type FactorySeed,
5
- type MixedFactoryBuilder,
3
+ Factory,
4
+ type FactorySeed,
5
+ type MixedFactoryBuilder,
6
6
  } from '../Factory';
7
7
 
8
8
  // Create a concrete implementation for testing
9
9
  class TestFactory extends Factory<
10
- { testBuilder: (attrs: any) => any },
11
- { testSeed: (attrs: any, factory: any, db: any) => any }
10
+ { testBuilder: (attrs: any) => any },
11
+ { testSeed: (attrs: any, factory: any, db: any) => any }
12
12
  > {
13
- async insert(builderName: any, attrs?: any) {
14
- return Promise.resolve({ id: 1, ...attrs });
15
- }
16
-
17
- async insertMany(count: number, builderName: any, attrs?: any) {
18
- const results: any[] = [];
19
- for (let i = 0; i < count; i++) {
20
- const newAttrs = typeof attrs === 'function' ? attrs(i) : attrs;
21
- results.push(await this.insert(builderName, newAttrs));
22
- }
23
- return results;
24
- }
25
-
26
- seed(seedName: any, attrs?: any): any {
27
- return Promise.resolve({ seedResult: true, ...attrs });
28
- }
13
+ async insert(_builderName: any, attrs?: any) {
14
+ return Promise.resolve({ id: 1, ...attrs });
15
+ }
16
+
17
+ async insertMany(count: number, builderName: any, attrs?: any) {
18
+ const results: any[] = [];
19
+ for (let i = 0; i < count; i++) {
20
+ const newAttrs = typeof attrs === 'function' ? attrs(i) : attrs;
21
+ results.push(await this.insert(builderName, newAttrs));
22
+ }
23
+ return results;
24
+ }
25
+
26
+ seed(_seedName: any, attrs?: any): any {
27
+ return Promise.resolve({ seedResult: true, ...attrs });
28
+ }
29
29
  }
30
30
 
31
31
  describe('Factory', () => {
32
- describe('abstract class functionality', () => {
33
- it('should be instantiable through concrete implementation', () => {
34
- const factory = new TestFactory();
35
- expect(factory).toBeInstanceOf(Factory);
36
- expect(factory).toBeInstanceOf(TestFactory);
37
- });
38
-
39
- it('should have abstract methods defined', () => {
40
- const factory = new TestFactory();
41
- expect(typeof factory.insert).toBe('function');
42
- expect(typeof factory.insertMany).toBe('function');
43
- expect(typeof factory.seed).toBe('function');
44
- });
45
- });
46
-
47
- describe('createSeed static method', () => {
48
- it('should return the seed function unchanged', () => {
49
- const seedFn = async ({
50
- attrs,
51
- factory,
52
- db,
53
- }: { attrs: any; factory: any; db: any }) => {
54
- return { id: 1, name: 'test' };
55
- };
56
-
57
- const result = Factory.createSeed(seedFn);
58
-
59
- expect(result).toBe(seedFn);
60
- expect(typeof result).toBe('function');
61
- });
62
-
63
- it('should work with different seed function signatures', () => {
64
- const simpleSeed = async () => ({ simple: true });
65
- const complexSeed = async ({
66
- attrs,
67
- }: {
68
- attrs: { name: string };
69
- factory: any;
70
- db: any;
71
- }) => {
72
- return { name: attrs.name, created: true };
73
- };
74
-
75
- const result1 = Factory.createSeed(simpleSeed);
76
- const result2 = Factory.createSeed(complexSeed);
77
-
78
- expect(result1).toBe(simpleSeed);
79
- expect(result2).toBe(complexSeed);
80
- });
81
- });
82
-
83
- describe('concrete implementation behavior', () => {
84
- let factory: TestFactory;
85
-
86
- beforeEach(() => {
87
- factory = new TestFactory();
88
- });
89
-
90
- it('should implement insert method', async () => {
91
- const result = await factory.insert('testBuilder', { name: 'test' });
92
- expect(result).toEqual({ id: 1, name: 'test' });
93
- });
94
-
95
- it('should implement insertMany method', async () => {
96
- const results = await factory.insertMany(3, 'testBuilder', {
97
- name: 'test',
98
- });
99
- expect(results).toHaveLength(3);
100
- expect(results[0]).toEqual({ id: 1, name: 'test' });
101
- });
102
-
103
- it('should implement insertMany with function attributes', async () => {
104
- const results = await factory.insertMany(2, 'testBuilder', (idx) => ({
105
- name: `test${idx}`,
106
- }));
107
- expect(results).toHaveLength(2);
108
- expect(results[0]).toEqual({ id: 1, name: 'test0' });
109
- expect(results[1]).toEqual({ id: 1, name: 'test1' });
110
- });
111
-
112
- it('should implement seed method', async () => {
113
- const result = await factory.seed('testSeed', { custom: 'value' });
114
- expect(result).toEqual({ seedResult: true, custom: 'value' });
115
- });
116
- });
117
-
118
- describe('type definitions', () => {
119
- it('should properly type MixedFactoryBuilder', () => {
120
- // Test that the type allows both sync and async returns
121
- const syncBuilder: MixedFactoryBuilder = (attrs, factory, db) => ({
122
- sync: true,
123
- });
124
- const asyncBuilder: MixedFactoryBuilder = async (attrs, factory, db) => ({
125
- async: true,
126
- });
127
-
128
- expect(typeof syncBuilder).toBe('function');
129
- expect(typeof asyncBuilder).toBe('function');
130
- });
131
-
132
- it('should properly type FactorySeed', () => {
133
- // Test that FactorySeed requires async return with object parameter
134
- const seed: FactorySeed = async ({ attrs, factory, db }) => ({
135
- seeded: true,
136
- });
137
-
138
- expect(typeof seed).toBe('function');
139
- });
140
- });
32
+ describe('abstract class functionality', () => {
33
+ it('should be instantiable through concrete implementation', () => {
34
+ const factory = new TestFactory();
35
+ expect(factory).toBeInstanceOf(Factory);
36
+ expect(factory).toBeInstanceOf(TestFactory);
37
+ });
38
+
39
+ it('should have abstract methods defined', () => {
40
+ const factory = new TestFactory();
41
+ expect(typeof factory.insert).toBe('function');
42
+ expect(typeof factory.insertMany).toBe('function');
43
+ expect(typeof factory.seed).toBe('function');
44
+ });
45
+ });
46
+
47
+ describe('createSeed static method', () => {
48
+ it('should return the seed function unchanged', () => {
49
+ const seedFn = async ({
50
+ attrs,
51
+ factory,
52
+ db,
53
+ }: {
54
+ attrs: any;
55
+ factory: any;
56
+ db: any;
57
+ }) => {
58
+ return { id: 1, name: 'test' };
59
+ };
60
+
61
+ const result = Factory.createSeed(seedFn);
62
+
63
+ expect(result).toBe(seedFn);
64
+ expect(typeof result).toBe('function');
65
+ });
66
+
67
+ it('should work with different seed function signatures', () => {
68
+ const simpleSeed = async () => ({ simple: true });
69
+ const complexSeed = async ({
70
+ attrs,
71
+ }: {
72
+ attrs: { name: string };
73
+ factory: any;
74
+ db: any;
75
+ }) => {
76
+ return { name: attrs.name, created: true };
77
+ };
78
+
79
+ const result1 = Factory.createSeed(simpleSeed);
80
+ const result2 = Factory.createSeed(complexSeed);
81
+
82
+ expect(result1).toBe(simpleSeed);
83
+ expect(result2).toBe(complexSeed);
84
+ });
85
+ });
86
+
87
+ describe('concrete implementation behavior', () => {
88
+ let factory: TestFactory;
89
+
90
+ beforeEach(() => {
91
+ factory = new TestFactory();
92
+ });
93
+
94
+ it('should implement insert method', async () => {
95
+ const result = await factory.insert('testBuilder', { name: 'test' });
96
+ expect(result).toEqual({ id: 1, name: 'test' });
97
+ });
98
+
99
+ it('should implement insertMany method', async () => {
100
+ const results = await factory.insertMany(3, 'testBuilder', {
101
+ name: 'test',
102
+ });
103
+ expect(results).toHaveLength(3);
104
+ expect(results[0]).toEqual({ id: 1, name: 'test' });
105
+ });
106
+
107
+ it('should implement insertMany with function attributes', async () => {
108
+ const results = await factory.insertMany(2, 'testBuilder', (idx) => ({
109
+ name: `test${idx}`,
110
+ }));
111
+ expect(results).toHaveLength(2);
112
+ expect(results[0]).toEqual({ id: 1, name: 'test0' });
113
+ expect(results[1]).toEqual({ id: 1, name: 'test1' });
114
+ });
115
+
116
+ it('should implement seed method', async () => {
117
+ const result = await factory.seed('testSeed', { custom: 'value' });
118
+ expect(result).toEqual({ seedResult: true, custom: 'value' });
119
+ });
120
+ });
121
+
122
+ describe('type definitions', () => {
123
+ it('should properly type MixedFactoryBuilder', () => {
124
+ // Test that the type allows both sync and async returns
125
+ const syncBuilder: MixedFactoryBuilder = (_attrs, _factory, _db) => ({
126
+ sync: true,
127
+ });
128
+ const asyncBuilder: MixedFactoryBuilder = async (
129
+ _attrs,
130
+ _factory,
131
+ _db,
132
+ ) => ({
133
+ async: true,
134
+ });
135
+
136
+ expect(typeof syncBuilder).toBe('function');
137
+ expect(typeof asyncBuilder).toBe('function');
138
+ });
139
+
140
+ it('should properly type FactorySeed', () => {
141
+ // Test that FactorySeed requires async return with object parameter
142
+ const seed: FactorySeed = async ({ attrs, factory, db }) => ({
143
+ seeded: true,
144
+ });
145
+
146
+ expect(typeof seed).toBe('function');
147
+ });
148
+ });
141
149
  });
142
150
 
143
151
  // Test the type exports
144
152
  describe('Factory types', () => {
145
- it('should export MixedFactoryBuilder type', () => {
146
- const builder: MixedFactoryBuilder<
147
- { name: string },
148
- TestFactory,
149
- { id: number; name: string },
150
- any
151
- > = (attrs, factory, db) => {
152
- return { id: 1, name: attrs.name };
153
- };
154
-
155
- expect(typeof builder).toBe('function');
156
- });
157
-
158
- it('should export FactorySeed type', () => {
159
- const seed: FactorySeed<
160
- { count: number },
161
- TestFactory,
162
- { created: number },
163
- any
164
- > = async ({ attrs }) => {
165
- return { created: attrs.count };
166
- };
167
-
168
- expect(typeof seed).toBe('function');
169
- });
153
+ it('should export MixedFactoryBuilder type', () => {
154
+ const builder: MixedFactoryBuilder<
155
+ { name: string },
156
+ TestFactory,
157
+ { id: number; name: string },
158
+ any
159
+ > = (attrs, _factory, _db) => {
160
+ return { id: 1, name: attrs.name };
161
+ };
162
+
163
+ expect(typeof builder).toBe('function');
164
+ });
165
+
166
+ it('should export FactorySeed type', () => {
167
+ const seed: FactorySeed<
168
+ { count: number },
169
+ TestFactory,
170
+ { created: number },
171
+ any
172
+ > = async ({ attrs }) => {
173
+ return { created: attrs.count };
174
+ };
175
+
176
+ expect(typeof seed).toBe('function');
177
+ });
170
178
  });