@geekmidas/testkit 0.4.0 → 0.6.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/dist/Factory-BFVnMMCC.mjs.map +1 -1
  2. package/dist/Factory-BhjUOBWN.cjs.map +1 -1
  3. package/dist/{Factory-c16c27Y6.d.cts → Factory-Bx0AJXZB.d.cts} +3 -2
  4. package/dist/Factory-Bx0AJXZB.d.cts.map +1 -0
  5. package/dist/{Factory-BcGJjLc8.d.mts → Factory-SFupxRC2.d.mts} +2 -1
  6. package/dist/Factory-SFupxRC2.d.mts.map +1 -0
  7. package/dist/Factory.d.cts +2 -2
  8. package/dist/Factory.d.mts +1 -1
  9. package/dist/KyselyFactory-BFqVIn_0.cjs.map +1 -1
  10. package/dist/KyselyFactory-DMswpwji.mjs.map +1 -1
  11. package/dist/{KyselyFactory-uZ45h7YU.d.cts → KyselyFactory-KLeKH43i.d.cts} +4 -3
  12. package/dist/KyselyFactory-KLeKH43i.d.cts.map +1 -0
  13. package/dist/{KyselyFactory-Cj-EultY.d.mts → KyselyFactory-vAxYodck.d.mts} +3 -2
  14. package/dist/KyselyFactory-vAxYodck.d.mts.map +1 -0
  15. package/dist/KyselyFactory.d.cts +3 -3
  16. package/dist/KyselyFactory.d.mts +2 -2
  17. package/dist/{ObjectionFactory-DL4qkuF1.d.mts → ObjectionFactory-BWjB49-i.d.mts} +3 -2
  18. package/dist/ObjectionFactory-BWjB49-i.d.mts.map +1 -0
  19. package/dist/ObjectionFactory-BeFBYcan.cjs.map +1 -1
  20. package/dist/ObjectionFactory-QCJ7u0Ql.mjs.map +1 -1
  21. package/dist/{ObjectionFactory-CdhzKs4f.d.cts → ObjectionFactory-aMGvAKt9.d.cts} +4 -3
  22. package/dist/ObjectionFactory-aMGvAKt9.d.cts.map +1 -0
  23. package/dist/ObjectionFactory.d.cts +3 -3
  24. package/dist/ObjectionFactory.d.mts +2 -2
  25. package/dist/{PostgresKyselyMigrator-upT-hmrz.mjs → PostgresKyselyMigrator-6sE1KOni.mjs} +2 -2
  26. package/dist/PostgresKyselyMigrator-6sE1KOni.mjs.map +1 -0
  27. package/dist/{PostgresKyselyMigrator-CIx3AFSR.d.mts → PostgresKyselyMigrator-CBltSOq5.d.cts} +3 -2
  28. package/dist/PostgresKyselyMigrator-CBltSOq5.d.cts.map +1 -0
  29. package/dist/{PostgresKyselyMigrator-CfytARcA.cjs → PostgresKyselyMigrator-D6IbPq8t.cjs} +2 -2
  30. package/dist/PostgresKyselyMigrator-D6IbPq8t.cjs.map +1 -0
  31. package/dist/{PostgresKyselyMigrator-CQ3aUoy_.d.cts → PostgresKyselyMigrator-DrVWncqd.d.mts} +3 -2
  32. package/dist/PostgresKyselyMigrator-DrVWncqd.d.mts.map +1 -0
  33. package/dist/PostgresKyselyMigrator.cjs +2 -2
  34. package/dist/PostgresKyselyMigrator.d.cts +2 -2
  35. package/dist/PostgresKyselyMigrator.d.mts +2 -2
  36. package/dist/PostgresKyselyMigrator.mjs +2 -2
  37. package/dist/{PostgresMigrator-DbuJGAVy.mjs → PostgresMigrator-BjjenqSd.mjs} +2 -2
  38. package/dist/PostgresMigrator-BjjenqSd.mjs.map +1 -0
  39. package/dist/{PostgresMigrator-D5UkK1_K.d.cts → PostgresMigrator-Bres0U6E.d.cts} +2 -1
  40. package/dist/PostgresMigrator-Bres0U6E.d.cts.map +1 -0
  41. package/dist/{PostgresMigrator-DFcNdCvD.cjs → PostgresMigrator-D6dQn0x2.cjs} +2 -2
  42. package/dist/PostgresMigrator-D6dQn0x2.cjs.map +1 -0
  43. package/dist/{PostgresMigrator-DQaRxoaY.d.mts → PostgresMigrator-S-YYosAC.d.mts} +2 -1
  44. package/dist/PostgresMigrator-S-YYosAC.d.mts.map +1 -0
  45. package/dist/PostgresMigrator.cjs +1 -1
  46. package/dist/PostgresMigrator.d.cts +1 -1
  47. package/dist/PostgresMigrator.d.mts +1 -1
  48. package/dist/PostgresMigrator.mjs +1 -1
  49. package/dist/{PostgresObjectionMigrator-CZHHcCOv.d.cts → PostgresObjectionMigrator-CPfBAP7r.d.cts} +3 -2
  50. package/dist/PostgresObjectionMigrator-CPfBAP7r.d.cts.map +1 -0
  51. package/dist/{PostgresObjectionMigrator-BG6ymgnt.cjs → PostgresObjectionMigrator-DK8ODIHQ.cjs} +2 -2
  52. package/dist/PostgresObjectionMigrator-DK8ODIHQ.cjs.map +1 -0
  53. package/dist/{PostgresObjectionMigrator-D_hCcrQu.d.mts → PostgresObjectionMigrator-DVEqB5tp.d.mts} +3 -2
  54. package/dist/PostgresObjectionMigrator-DVEqB5tp.d.mts.map +1 -0
  55. package/dist/{PostgresObjectionMigrator-DPj2pOpX.mjs → PostgresObjectionMigrator-D_QxXbIN.mjs} +2 -2
  56. package/dist/PostgresObjectionMigrator-D_QxXbIN.mjs.map +1 -0
  57. package/dist/PostgresObjectionMigrator.cjs +2 -2
  58. package/dist/PostgresObjectionMigrator.d.cts +2 -2
  59. package/dist/PostgresObjectionMigrator.d.mts +2 -2
  60. package/dist/PostgresObjectionMigrator.mjs +2 -2
  61. package/dist/{VitestKyselyTransactionIsolator-D3EZZhjZ.d.cts → VitestKyselyTransactionIsolator-CduJlHoT.d.cts} +4 -3
  62. package/dist/VitestKyselyTransactionIsolator-CduJlHoT.d.cts.map +1 -0
  63. package/dist/{VitestKyselyTransactionIsolator-Dxlp1u0f.d.mts → VitestKyselyTransactionIsolator-Cswnnj0k.d.mts} +4 -3
  64. package/dist/VitestKyselyTransactionIsolator-Cswnnj0k.d.mts.map +1 -0
  65. package/dist/{VitestKyselyTransactionIsolator-EvDLk5zg.cjs → VitestKyselyTransactionIsolator-D7RRXOBa.cjs} +2 -2
  66. package/dist/VitestKyselyTransactionIsolator-D7RRXOBa.cjs.map +1 -0
  67. package/dist/{VitestKyselyTransactionIsolator-CNURW8y6.mjs → VitestKyselyTransactionIsolator-DceyIqr4.mjs} +2 -2
  68. package/dist/VitestKyselyTransactionIsolator-DceyIqr4.mjs.map +1 -0
  69. package/dist/VitestKyselyTransactionIsolator.cjs +1 -1
  70. package/dist/VitestKyselyTransactionIsolator.d.cts +2 -2
  71. package/dist/VitestKyselyTransactionIsolator.d.mts +2 -2
  72. package/dist/VitestKyselyTransactionIsolator.mjs +1 -1
  73. package/dist/{VitestObjectionTransactionIsolator-1TpsPqfG.d.cts → VitestObjectionTransactionIsolator-BXoR6xdG.d.cts} +4 -3
  74. package/dist/VitestObjectionTransactionIsolator-BXoR6xdG.d.cts.map +1 -0
  75. package/dist/{VitestObjectionTransactionIsolator-CM5KTAFA.cjs → VitestObjectionTransactionIsolator-CdLRrzNf.cjs} +2 -2
  76. package/dist/VitestObjectionTransactionIsolator-CdLRrzNf.cjs.map +1 -0
  77. package/dist/{VitestObjectionTransactionIsolator-jQFaCz0u.mjs → VitestObjectionTransactionIsolator-OF2osYY5.mjs} +2 -2
  78. package/dist/VitestObjectionTransactionIsolator-OF2osYY5.mjs.map +1 -0
  79. package/dist/{VitestObjectionTransactionIsolator-i9jIgU8Q.d.mts → VitestObjectionTransactionIsolator-x6hY5j4u.d.mts} +4 -3
  80. package/dist/VitestObjectionTransactionIsolator-x6hY5j4u.d.mts.map +1 -0
  81. package/dist/VitestObjectionTransactionIsolator.cjs +1 -1
  82. package/dist/VitestObjectionTransactionIsolator.d.cts +2 -2
  83. package/dist/VitestObjectionTransactionIsolator.d.mts +2 -2
  84. package/dist/VitestObjectionTransactionIsolator.mjs +1 -1
  85. package/dist/{VitestTransactionIsolator-BvR19bYn.d.mts → VitestTransactionIsolator-BNWJqh9f.d.mts} +3 -2
  86. package/dist/VitestTransactionIsolator-BNWJqh9f.d.mts.map +1 -0
  87. package/dist/VitestTransactionIsolator-CMfJXZP8.cjs.map +1 -1
  88. package/dist/{VitestTransactionIsolator-CwQaxZLP.d.cts → VitestTransactionIsolator-CSroc7Df.d.cts} +3 -2
  89. package/dist/VitestTransactionIsolator-CSroc7Df.d.cts.map +1 -0
  90. package/dist/VitestTransactionIsolator-DQ7tLqgV.mjs.map +1 -1
  91. package/dist/VitestTransactionIsolator.d.cts +1 -1
  92. package/dist/VitestTransactionIsolator.d.mts +1 -1
  93. package/dist/aws.cjs.map +1 -1
  94. package/dist/aws.d.cts +2 -0
  95. package/dist/aws.d.cts.map +1 -0
  96. package/dist/aws.d.mts +2 -0
  97. package/dist/aws.d.mts.map +1 -0
  98. package/dist/aws.mjs.map +1 -1
  99. package/dist/benchmark.cjs.map +1 -1
  100. package/dist/benchmark.d.cts +1 -0
  101. package/dist/benchmark.d.cts.map +1 -0
  102. package/dist/benchmark.d.mts +1 -0
  103. package/dist/benchmark.d.mts.map +1 -0
  104. package/dist/benchmark.mjs.map +1 -1
  105. package/dist/better-auth.cjs +29 -30
  106. package/dist/better-auth.cjs.map +1 -1
  107. package/dist/better-auth.d.cts +2 -2
  108. package/dist/better-auth.d.cts.map +1 -0
  109. package/dist/better-auth.d.mts.map +1 -0
  110. package/dist/better-auth.mjs +29 -30
  111. package/dist/better-auth.mjs.map +1 -1
  112. package/dist/directory-B-Ozljzk.mjs.map +1 -1
  113. package/dist/directory-BVC8g7cX.cjs.map +1 -1
  114. package/dist/{directory-BXavAeJZ.d.mts → directory-CVrfTq1I.d.mts} +2 -1
  115. package/dist/directory-CVrfTq1I.d.mts.map +1 -0
  116. package/dist/directory-Cys9g76X.d.cts +13 -0
  117. package/dist/directory-Cys9g76X.d.cts.map +1 -0
  118. package/dist/faker-B14IEMIN.cjs.map +1 -1
  119. package/dist/faker-BGKYFoCT.mjs.map +1 -1
  120. package/dist/{faker-DvxiCtxc.d.cts → faker-BSH1EMtg.d.cts} +3 -3
  121. package/dist/faker-BSH1EMtg.d.cts.map +1 -0
  122. package/dist/faker-DHh7xs4u.d.mts.map +1 -0
  123. package/dist/faker.d.cts +1 -1
  124. package/dist/helpers.cjs.map +1 -1
  125. package/dist/helpers.d.cts +1 -0
  126. package/dist/helpers.d.cts.map +1 -0
  127. package/dist/helpers.d.mts +1 -0
  128. package/dist/helpers.d.mts.map +1 -0
  129. package/dist/helpers.mjs.map +1 -1
  130. package/dist/kysely.cjs +3 -3
  131. package/dist/kysely.cjs.map +1 -1
  132. package/dist/kysely.d.cts +8 -7
  133. package/dist/kysely.d.cts.map +1 -0
  134. package/dist/kysely.d.mts +7 -6
  135. package/dist/kysely.d.mts.map +1 -0
  136. package/dist/kysely.mjs +3 -3
  137. package/dist/kysely.mjs.map +1 -1
  138. package/dist/logger.cjs.map +1 -1
  139. package/dist/logger.d.cts +1 -0
  140. package/dist/logger.d.cts.map +1 -0
  141. package/dist/logger.d.mts +1 -0
  142. package/dist/logger.d.mts.map +1 -0
  143. package/dist/logger.mjs.map +1 -1
  144. package/dist/objection.cjs +3 -3
  145. package/dist/objection.cjs.map +1 -1
  146. package/dist/objection.d.cts +8 -7
  147. package/dist/objection.d.cts.map +1 -0
  148. package/dist/objection.d.mts +7 -6
  149. package/dist/objection.d.mts.map +1 -0
  150. package/dist/objection.mjs +3 -3
  151. package/dist/objection.mjs.map +1 -1
  152. package/dist/os/directory.d.cts +1 -1
  153. package/dist/os/directory.d.mts +1 -1
  154. package/dist/os/index.d.cts +1 -1
  155. package/dist/os/index.d.mts +1 -1
  156. package/dist/timer.cjs.map +1 -1
  157. package/dist/timer.d.cts +2 -0
  158. package/dist/timer.d.cts.map +1 -0
  159. package/dist/timer.d.mts +2 -0
  160. package/dist/timer.d.mts.map +1 -0
  161. package/dist/timer.mjs.map +1 -1
  162. package/package.json +5 -5
  163. package/src/Factory.ts +72 -72
  164. package/src/KyselyFactory.ts +330 -330
  165. package/src/ObjectionFactory.ts +354 -355
  166. package/src/PostgresKyselyMigrator.ts +37 -37
  167. package/src/PostgresMigrator.ts +107 -107
  168. package/src/PostgresObjectionMigrator.ts +91 -91
  169. package/src/VitestKyselyTransactionIsolator.ts +27 -27
  170. package/src/VitestObjectionTransactionIsolator.ts +39 -39
  171. package/src/VitestTransactionIsolator.ts +196 -195
  172. package/src/__tests__/Factory.spec.ts +163 -155
  173. package/src/__tests__/KyselyFactory.spec.ts +443 -439
  174. package/src/__tests__/ObjectionFactory.spec.ts +563 -557
  175. package/src/__tests__/PostgresKyselyMigrator.spec.ts +641 -641
  176. package/src/__tests__/PostgresMigrator.spec.ts +341 -341
  177. package/src/__tests__/PostgresObjectionMigrator.spec.ts +578 -578
  178. package/src/__tests__/VitestObjectionTransactionIsolator.spec.ts +114 -114
  179. package/src/__tests__/benchmark.spec.ts +140 -0
  180. package/src/__tests__/better-auth.spec.ts +15 -15
  181. package/src/__tests__/faker.spec.ts +226 -137
  182. package/src/__tests__/integration.spec.ts +597 -597
  183. package/src/__tests__/utilities.spec.ts +211 -0
  184. package/src/aws.ts +104 -104
  185. package/src/benchmark.ts +12 -12
  186. package/src/better-auth.ts +286 -301
  187. package/src/faker.ts +153 -153
  188. package/src/helpers.ts +6 -6
  189. package/src/kysely.ts +33 -33
  190. package/src/logger.ts +10 -10
  191. package/src/objection.ts +31 -31
  192. package/src/os/directory.ts +11 -10
  193. package/src/timer.ts +1 -1
  194. package/test/globalSetup.ts +45 -45
  195. package/test/helpers.ts +189 -189
  196. package/test/migrations/1749664623372_user.ts +13 -13
  197. package/tsconfig.json +9 -0
  198. package/vitest.config.ts +4 -4
  199. package/dist/PostgresKyselyMigrator-CfytARcA.cjs.map +0 -1
  200. package/dist/PostgresKyselyMigrator-upT-hmrz.mjs.map +0 -1
  201. package/dist/PostgresMigrator-DFcNdCvD.cjs.map +0 -1
  202. package/dist/PostgresMigrator-DbuJGAVy.mjs.map +0 -1
  203. package/dist/PostgresObjectionMigrator-BG6ymgnt.cjs.map +0 -1
  204. package/dist/PostgresObjectionMigrator-DPj2pOpX.mjs.map +0 -1
  205. package/dist/VitestKyselyTransactionIsolator-CNURW8y6.mjs.map +0 -1
  206. package/dist/VitestKyselyTransactionIsolator-EvDLk5zg.cjs.map +0 -1
  207. package/dist/VitestObjectionTransactionIsolator-CM5KTAFA.cjs.map +0 -1
  208. package/dist/VitestObjectionTransactionIsolator-jQFaCz0u.mjs.map +0 -1
  209. package/dist/directory-Mi7tdOuD.d.cts +0 -12
@@ -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
  });