@simplysm/orm-common 13.0.69 → 13.0.70

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 (204) hide show
  1. package/README.md +54 -1447
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +9 -9
  4. package/dist/create-db-context.js.map +1 -1
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/initialize.d.ts +17 -17
  7. package/dist/ddl/initialize.js +2 -2
  8. package/dist/ddl/initialize.js.map +1 -1
  9. package/dist/ddl/relation-ddl.d.ts +6 -6
  10. package/dist/ddl/schema-ddl.d.ts +4 -4
  11. package/dist/ddl/table-ddl.d.ts +24 -24
  12. package/dist/ddl/table-ddl.js +4 -4
  13. package/dist/ddl/table-ddl.js.map +1 -1
  14. package/dist/errors/db-transaction-error.d.ts +15 -15
  15. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  16. package/dist/exec/executable.d.ts +23 -23
  17. package/dist/exec/executable.js +3 -3
  18. package/dist/exec/executable.js.map +1 -1
  19. package/dist/exec/queryable.d.ts +160 -160
  20. package/dist/exec/queryable.js +119 -119
  21. package/dist/exec/queryable.js.map +1 -1
  22. package/dist/exec/search-parser.d.ts +37 -37
  23. package/dist/exec/search-parser.d.ts.map +1 -1
  24. package/dist/expr/expr-unit.d.ts +4 -4
  25. package/dist/expr/expr.d.ts +257 -257
  26. package/dist/expr/expr.js +265 -265
  27. package/dist/expr/expr.js.map +1 -1
  28. package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
  29. package/dist/query-builder/base/expr-renderer-base.js +2 -2
  30. package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
  31. package/dist/query-builder/base/query-builder-base.d.ts +26 -26
  32. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  33. package/dist/query-builder/base/query-builder-base.js +22 -22
  34. package/dist/query-builder/base/query-builder-base.js.map +1 -1
  35. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
  36. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  37. package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
  38. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
  39. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  40. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  41. package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
  42. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
  43. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
  44. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  45. package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
  46. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
  47. package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
  48. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  49. package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
  50. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
  51. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
  52. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  53. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
  54. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
  55. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
  56. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  57. package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
  58. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
  59. package/dist/query-builder/query-builder.d.ts +1 -1
  60. package/dist/schema/factory/column-builder.d.ts +79 -79
  61. package/dist/schema/factory/column-builder.js +42 -42
  62. package/dist/schema/factory/index-builder.d.ts +39 -39
  63. package/dist/schema/factory/index-builder.js +26 -26
  64. package/dist/schema/factory/relation-builder.d.ts +99 -99
  65. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  66. package/dist/schema/factory/relation-builder.js +38 -38
  67. package/dist/schema/procedure-builder.d.ts +49 -49
  68. package/dist/schema/procedure-builder.d.ts.map +1 -1
  69. package/dist/schema/procedure-builder.js +33 -33
  70. package/dist/schema/table-builder.d.ts +59 -59
  71. package/dist/schema/table-builder.d.ts.map +1 -1
  72. package/dist/schema/table-builder.js +43 -43
  73. package/dist/schema/view-builder.d.ts +49 -49
  74. package/dist/schema/view-builder.d.ts.map +1 -1
  75. package/dist/schema/view-builder.js +32 -32
  76. package/dist/types/column.d.ts +22 -22
  77. package/dist/types/column.js +1 -1
  78. package/dist/types/column.js.map +1 -1
  79. package/dist/types/db.d.ts +40 -40
  80. package/dist/types/expr.d.ts +59 -59
  81. package/dist/types/expr.d.ts.map +1 -1
  82. package/dist/types/query-def.d.ts +44 -44
  83. package/dist/types/query-def.d.ts.map +1 -1
  84. package/dist/utils/result-parser.d.ts +11 -11
  85. package/dist/utils/result-parser.js +3 -3
  86. package/dist/utils/result-parser.js.map +1 -1
  87. package/package.json +5 -5
  88. package/src/create-db-context.ts +20 -20
  89. package/src/ddl/column-ddl.ts +4 -4
  90. package/src/ddl/initialize.ts +259 -259
  91. package/src/ddl/relation-ddl.ts +89 -89
  92. package/src/ddl/schema-ddl.ts +4 -4
  93. package/src/ddl/table-ddl.ts +189 -189
  94. package/src/errors/db-transaction-error.ts +13 -13
  95. package/src/exec/executable.ts +25 -25
  96. package/src/exec/queryable.ts +2033 -2033
  97. package/src/exec/search-parser.ts +57 -57
  98. package/src/expr/expr-unit.ts +4 -4
  99. package/src/expr/expr.ts +2140 -2140
  100. package/src/query-builder/base/expr-renderer-base.ts +237 -237
  101. package/src/query-builder/base/query-builder-base.ts +213 -213
  102. package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
  103. package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
  104. package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
  105. package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
  106. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
  107. package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
  108. package/src/query-builder/query-builder.ts +19 -19
  109. package/src/schema/factory/column-builder.ts +423 -423
  110. package/src/schema/factory/index-builder.ts +164 -164
  111. package/src/schema/factory/relation-builder.ts +453 -453
  112. package/src/schema/procedure-builder.ts +232 -232
  113. package/src/schema/table-builder.ts +319 -319
  114. package/src/schema/view-builder.ts +221 -221
  115. package/src/types/column.ts +188 -188
  116. package/src/types/db.ts +208 -208
  117. package/src/types/expr.ts +697 -697
  118. package/src/types/query-def.ts +513 -513
  119. package/src/utils/result-parser.ts +458 -458
  120. package/tests/db-context/create-db-context.spec.ts +224 -0
  121. package/tests/db-context/define-db-context.spec.ts +68 -0
  122. package/tests/ddl/basic.expected.ts +341 -0
  123. package/tests/ddl/basic.spec.ts +714 -0
  124. package/tests/ddl/column-builder.expected.ts +310 -0
  125. package/tests/ddl/column-builder.spec.ts +637 -0
  126. package/tests/ddl/index-builder.expected.ts +38 -0
  127. package/tests/ddl/index-builder.spec.ts +202 -0
  128. package/tests/ddl/procedure-builder.expected.ts +52 -0
  129. package/tests/ddl/procedure-builder.spec.ts +234 -0
  130. package/tests/ddl/relation-builder.expected.ts +36 -0
  131. package/tests/ddl/relation-builder.spec.ts +372 -0
  132. package/tests/ddl/table-builder.expected.ts +113 -0
  133. package/tests/ddl/table-builder.spec.ts +433 -0
  134. package/tests/ddl/view-builder.expected.ts +38 -0
  135. package/tests/ddl/view-builder.spec.ts +176 -0
  136. package/tests/dml/delete.expected.ts +96 -0
  137. package/tests/dml/delete.spec.ts +160 -0
  138. package/tests/dml/insert.expected.ts +192 -0
  139. package/tests/dml/insert.spec.ts +288 -0
  140. package/tests/dml/update.expected.ts +176 -0
  141. package/tests/dml/update.spec.ts +318 -0
  142. package/tests/dml/upsert.expected.ts +215 -0
  143. package/tests/dml/upsert.spec.ts +242 -0
  144. package/tests/errors/queryable-errors.spec.ts +177 -0
  145. package/tests/escape.spec.ts +100 -0
  146. package/tests/examples/pivot.expected.ts +211 -0
  147. package/tests/examples/pivot.spec.ts +533 -0
  148. package/tests/examples/sampling.expected.ts +69 -0
  149. package/tests/examples/sampling.spec.ts +104 -0
  150. package/tests/examples/unpivot.expected.ts +120 -0
  151. package/tests/examples/unpivot.spec.ts +226 -0
  152. package/tests/exec/search-parser.spec.ts +283 -0
  153. package/tests/executable/basic.expected.ts +18 -0
  154. package/tests/executable/basic.spec.ts +54 -0
  155. package/tests/expr/comparison.expected.ts +282 -0
  156. package/tests/expr/comparison.spec.ts +400 -0
  157. package/tests/expr/conditional.expected.ts +134 -0
  158. package/tests/expr/conditional.spec.ts +276 -0
  159. package/tests/expr/date.expected.ts +332 -0
  160. package/tests/expr/date.spec.ts +526 -0
  161. package/tests/expr/math.expected.ts +62 -0
  162. package/tests/expr/math.spec.ts +106 -0
  163. package/tests/expr/string.expected.ts +218 -0
  164. package/tests/expr/string.spec.ts +356 -0
  165. package/tests/expr/utility.expected.ts +147 -0
  166. package/tests/expr/utility.spec.ts +182 -0
  167. package/tests/select/basic.expected.ts +322 -0
  168. package/tests/select/basic.spec.ts +502 -0
  169. package/tests/select/filter.expected.ts +357 -0
  170. package/tests/select/filter.spec.ts +1068 -0
  171. package/tests/select/group.expected.ts +169 -0
  172. package/tests/select/group.spec.ts +244 -0
  173. package/tests/select/join.expected.ts +582 -0
  174. package/tests/select/join.spec.ts +805 -0
  175. package/tests/select/order.expected.ts +150 -0
  176. package/tests/select/order.spec.ts +189 -0
  177. package/tests/select/recursive-cte.expected.ts +244 -0
  178. package/tests/select/recursive-cte.spec.ts +514 -0
  179. package/tests/select/result-meta.spec.ts +270 -0
  180. package/tests/select/subquery.expected.ts +363 -0
  181. package/tests/select/subquery.spec.ts +537 -0
  182. package/tests/select/view.expected.ts +155 -0
  183. package/tests/select/view.spec.ts +235 -0
  184. package/tests/select/window.expected.ts +345 -0
  185. package/tests/select/window.spec.ts +618 -0
  186. package/tests/setup/MockExecutor.ts +18 -0
  187. package/tests/setup/TestDbContext.ts +59 -0
  188. package/tests/setup/models/Company.ts +13 -0
  189. package/tests/setup/models/Employee.ts +10 -0
  190. package/tests/setup/models/MonthlySales.ts +11 -0
  191. package/tests/setup/models/Post.ts +16 -0
  192. package/tests/setup/models/Sales.ts +10 -0
  193. package/tests/setup/models/User.ts +19 -0
  194. package/tests/setup/procedure/GetAllUsers.ts +9 -0
  195. package/tests/setup/procedure/GetUserById.ts +12 -0
  196. package/tests/setup/test-utils.ts +72 -0
  197. package/tests/setup/views/ActiveUsers.ts +8 -0
  198. package/tests/setup/views/UserSummary.ts +11 -0
  199. package/tests/types/nullable-queryable-record.spec.ts +145 -0
  200. package/tests/utils/result-parser-perf.spec.ts +210 -0
  201. package/tests/utils/result-parser.spec.ts +701 -0
  202. package/docs/expressions.md +0 -172
  203. package/docs/queries.md +0 -444
  204. package/docs/schema.md +0 -245
@@ -0,0 +1,637 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createTestDb } from "../setup/TestDbContext";
3
+ import { createColumnFactory } from "../../src/schema/factory/column-builder";
4
+ import { createQueryBuilder } from "../../src/query-builder/query-builder";
5
+ import { dialects } from "../setup/test-utils";
6
+ import "../setup/test-utils"; // toMatchSql matcher
7
+ import * as expected from "./column-builder.expected";
8
+
9
+ describe("DDL - Column Builder", () => {
10
+ //#region ========== Basic Data Type Tests ==========
11
+
12
+ describe("int type", () => {
13
+ const c = createColumnFactory();
14
+ const column = c.int();
15
+
16
+ const db = createTestDb();
17
+ const def = db.getAddColumnQueryDef(
18
+ { database: "TestDb", schema: "TestSchema", name: "User" },
19
+ "age",
20
+ column,
21
+ );
22
+
23
+ it("should validate QueryDef", () => {
24
+ expect(def).toEqual({
25
+ type: "addColumn",
26
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
27
+ column: {
28
+ name: "age",
29
+ dataType: { type: "int" },
30
+ autoIncrement: undefined,
31
+ nullable: undefined,
32
+ default: undefined,
33
+ },
34
+ });
35
+ });
36
+
37
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
38
+ const builder = createQueryBuilder(dialect);
39
+ expect(builder.build(def)).toMatchSql(expected.intType[dialect]);
40
+ });
41
+ });
42
+
43
+ describe("bigint type", () => {
44
+ const c = createColumnFactory();
45
+ const column = c.bigint();
46
+
47
+ const db = createTestDb();
48
+ const def = db.getAddColumnQueryDef(
49
+ { database: "TestDb", schema: "TestSchema", name: "User" },
50
+ "id",
51
+ column,
52
+ );
53
+
54
+ it("should validate QueryDef", () => {
55
+ expect(def).toEqual({
56
+ type: "addColumn",
57
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
58
+ column: {
59
+ name: "id",
60
+ dataType: { type: "bigint" },
61
+ autoIncrement: undefined,
62
+ nullable: undefined,
63
+ default: undefined,
64
+ },
65
+ });
66
+ });
67
+
68
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
69
+ const builder = createQueryBuilder(dialect);
70
+ expect(builder.build(def)).toMatchSql(expected.bigintType[dialect]);
71
+ });
72
+ });
73
+
74
+ describe("float type", () => {
75
+ const c = createColumnFactory();
76
+ const column = c.float();
77
+
78
+ const db = createTestDb();
79
+ const def = db.getAddColumnQueryDef(
80
+ { database: "TestDb", schema: "TestSchema", name: "Product" },
81
+ "weight",
82
+ column,
83
+ );
84
+
85
+ it("should validate QueryDef", () => {
86
+ expect(def).toEqual({
87
+ type: "addColumn",
88
+ table: { database: "TestDb", schema: "TestSchema", name: "Product" },
89
+ column: {
90
+ name: "weight",
91
+ dataType: { type: "float" },
92
+ autoIncrement: undefined,
93
+ nullable: undefined,
94
+ default: undefined,
95
+ },
96
+ });
97
+ });
98
+
99
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
100
+ const builder = createQueryBuilder(dialect);
101
+ expect(builder.build(def)).toMatchSql(expected.floatType[dialect]);
102
+ });
103
+ });
104
+
105
+ describe("double type", () => {
106
+ const c = createColumnFactory();
107
+ const column = c.double();
108
+
109
+ const db = createTestDb();
110
+ const def = db.getAddColumnQueryDef(
111
+ { database: "TestDb", schema: "TestSchema", name: "Product" },
112
+ "price",
113
+ column,
114
+ );
115
+
116
+ it("should validate QueryDef", () => {
117
+ expect(def).toEqual({
118
+ type: "addColumn",
119
+ table: { database: "TestDb", schema: "TestSchema", name: "Product" },
120
+ column: {
121
+ name: "price",
122
+ dataType: { type: "double" },
123
+ autoIncrement: undefined,
124
+ nullable: undefined,
125
+ default: undefined,
126
+ },
127
+ });
128
+ });
129
+
130
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
131
+ const builder = createQueryBuilder(dialect);
132
+ expect(builder.build(def)).toMatchSql(expected.doubleType[dialect]);
133
+ });
134
+ });
135
+
136
+ describe("decimal type", () => {
137
+ const c = createColumnFactory();
138
+ const column = c.decimal(10, 2);
139
+
140
+ const db = createTestDb();
141
+ const def = db.getAddColumnQueryDef(
142
+ { database: "TestDb", schema: "TestSchema", name: "Product" },
143
+ "amount",
144
+ column,
145
+ );
146
+
147
+ it("should validate QueryDef", () => {
148
+ expect(def).toEqual({
149
+ type: "addColumn",
150
+ table: { database: "TestDb", schema: "TestSchema", name: "Product" },
151
+ column: {
152
+ name: "amount",
153
+ dataType: { type: "decimal", precision: 10, scale: 2 },
154
+ autoIncrement: undefined,
155
+ nullable: undefined,
156
+ default: undefined,
157
+ },
158
+ });
159
+ });
160
+
161
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
162
+ const builder = createQueryBuilder(dialect);
163
+ expect(builder.build(def)).toMatchSql(expected.decimalType[dialect]);
164
+ });
165
+ });
166
+
167
+ describe("varchar type", () => {
168
+ const c = createColumnFactory();
169
+ const column = c.varchar(100);
170
+
171
+ const db = createTestDb();
172
+ const def = db.getAddColumnQueryDef(
173
+ { database: "TestDb", schema: "TestSchema", name: "User" },
174
+ "name",
175
+ column,
176
+ );
177
+
178
+ it("should validate QueryDef", () => {
179
+ expect(def).toEqual({
180
+ type: "addColumn",
181
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
182
+ column: {
183
+ name: "name",
184
+ dataType: { type: "varchar", length: 100 },
185
+ autoIncrement: undefined,
186
+ nullable: undefined,
187
+ default: undefined,
188
+ },
189
+ });
190
+ });
191
+
192
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
193
+ const builder = createQueryBuilder(dialect);
194
+ expect(builder.build(def)).toMatchSql(expected.varcharType[dialect]);
195
+ });
196
+ });
197
+
198
+ describe("char type", () => {
199
+ const c = createColumnFactory();
200
+ const column = c.char(10);
201
+
202
+ const db = createTestDb();
203
+ const def = db.getAddColumnQueryDef(
204
+ { database: "TestDb", schema: "TestSchema", name: "User" },
205
+ "code",
206
+ column,
207
+ );
208
+
209
+ it("should validate QueryDef", () => {
210
+ expect(def).toEqual({
211
+ type: "addColumn",
212
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
213
+ column: {
214
+ name: "code",
215
+ dataType: { type: "char", length: 10 },
216
+ autoIncrement: undefined,
217
+ nullable: undefined,
218
+ default: undefined,
219
+ },
220
+ });
221
+ });
222
+
223
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
224
+ const builder = createQueryBuilder(dialect);
225
+ expect(builder.build(def)).toMatchSql(expected.charType[dialect]);
226
+ });
227
+ });
228
+
229
+ describe("text type", () => {
230
+ const c = createColumnFactory();
231
+ const column = c.text();
232
+
233
+ const db = createTestDb();
234
+ const def = db.getAddColumnQueryDef(
235
+ { database: "TestDb", schema: "TestSchema", name: "Post" },
236
+ "content",
237
+ column,
238
+ );
239
+
240
+ it("should validate QueryDef", () => {
241
+ expect(def).toEqual({
242
+ type: "addColumn",
243
+ table: { database: "TestDb", schema: "TestSchema", name: "Post" },
244
+ column: {
245
+ name: "content",
246
+ dataType: { type: "text" },
247
+ autoIncrement: undefined,
248
+ nullable: undefined,
249
+ default: undefined,
250
+ },
251
+ });
252
+ });
253
+
254
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
255
+ const builder = createQueryBuilder(dialect);
256
+ expect(builder.build(def)).toMatchSql(expected.textType[dialect]);
257
+ });
258
+ });
259
+
260
+ describe("binary type", () => {
261
+ const c = createColumnFactory();
262
+ const column = c.binary();
263
+
264
+ const db = createTestDb();
265
+ const def = db.getAddColumnQueryDef(
266
+ { database: "TestDb", schema: "TestSchema", name: "File" },
267
+ "data",
268
+ column,
269
+ );
270
+
271
+ it("should validate QueryDef", () => {
272
+ expect(def).toEqual({
273
+ type: "addColumn",
274
+ table: { database: "TestDb", schema: "TestSchema", name: "File" },
275
+ column: {
276
+ name: "data",
277
+ dataType: { type: "binary" },
278
+ autoIncrement: undefined,
279
+ nullable: undefined,
280
+ default: undefined,
281
+ },
282
+ });
283
+ });
284
+
285
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
286
+ const builder = createQueryBuilder(dialect);
287
+ expect(builder.build(def)).toMatchSql(expected.binaryType[dialect]);
288
+ });
289
+ });
290
+
291
+ describe("boolean type", () => {
292
+ const c = createColumnFactory();
293
+ const column = c.boolean();
294
+
295
+ const db = createTestDb();
296
+ const def = db.getAddColumnQueryDef(
297
+ { database: "TestDb", schema: "TestSchema", name: "User" },
298
+ "isActive",
299
+ column,
300
+ );
301
+
302
+ it("should validate QueryDef", () => {
303
+ expect(def).toEqual({
304
+ type: "addColumn",
305
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
306
+ column: {
307
+ name: "isActive",
308
+ dataType: { type: "boolean" },
309
+ autoIncrement: undefined,
310
+ nullable: undefined,
311
+ default: undefined,
312
+ },
313
+ });
314
+ });
315
+
316
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
317
+ const builder = createQueryBuilder(dialect);
318
+ expect(builder.build(def)).toMatchSql(expected.booleanType[dialect]);
319
+ });
320
+ });
321
+
322
+ describe("datetime type", () => {
323
+ const c = createColumnFactory();
324
+ const column = c.datetime();
325
+
326
+ const db = createTestDb();
327
+ const def = db.getAddColumnQueryDef(
328
+ { database: "TestDb", schema: "TestSchema", name: "User" },
329
+ "createdAt",
330
+ column,
331
+ );
332
+
333
+ it("should validate QueryDef", () => {
334
+ expect(def).toEqual({
335
+ type: "addColumn",
336
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
337
+ column: {
338
+ name: "createdAt",
339
+ dataType: { type: "datetime" },
340
+ autoIncrement: undefined,
341
+ nullable: undefined,
342
+ default: undefined,
343
+ },
344
+ });
345
+ });
346
+
347
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
348
+ const builder = createQueryBuilder(dialect);
349
+ expect(builder.build(def)).toMatchSql(expected.datetimeType[dialect]);
350
+ });
351
+ });
352
+
353
+ describe("date type", () => {
354
+ const c = createColumnFactory();
355
+ const column = c.date();
356
+
357
+ const db = createTestDb();
358
+ const def = db.getAddColumnQueryDef(
359
+ { database: "TestDb", schema: "TestSchema", name: "User" },
360
+ "birthDate",
361
+ column,
362
+ );
363
+
364
+ it("should validate QueryDef", () => {
365
+ expect(def).toEqual({
366
+ type: "addColumn",
367
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
368
+ column: {
369
+ name: "birthDate",
370
+ dataType: { type: "date" },
371
+ autoIncrement: undefined,
372
+ nullable: undefined,
373
+ default: undefined,
374
+ },
375
+ });
376
+ });
377
+
378
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
379
+ const builder = createQueryBuilder(dialect);
380
+ expect(builder.build(def)).toMatchSql(expected.dateType[dialect]);
381
+ });
382
+ });
383
+
384
+ describe("time type", () => {
385
+ const c = createColumnFactory();
386
+ const column = c.time();
387
+
388
+ const db = createTestDb();
389
+ const def = db.getAddColumnQueryDef(
390
+ { database: "TestDb", schema: "TestSchema", name: "Schedule" },
391
+ "startTime",
392
+ column,
393
+ );
394
+
395
+ it("should validate QueryDef", () => {
396
+ expect(def).toEqual({
397
+ type: "addColumn",
398
+ table: { database: "TestDb", schema: "TestSchema", name: "Schedule" },
399
+ column: {
400
+ name: "startTime",
401
+ dataType: { type: "time" },
402
+ autoIncrement: undefined,
403
+ nullable: undefined,
404
+ default: undefined,
405
+ },
406
+ });
407
+ });
408
+
409
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
410
+ const builder = createQueryBuilder(dialect);
411
+ expect(builder.build(def)).toMatchSql(expected.timeType[dialect]);
412
+ });
413
+ });
414
+
415
+ describe("uuid type", () => {
416
+ const c = createColumnFactory();
417
+ const column = c.uuid();
418
+
419
+ const db = createTestDb();
420
+ const def = db.getAddColumnQueryDef(
421
+ { database: "TestDb", schema: "TestSchema", name: "User" },
422
+ "uuid",
423
+ column,
424
+ );
425
+
426
+ it("should validate QueryDef", () => {
427
+ expect(def).toEqual({
428
+ type: "addColumn",
429
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
430
+ column: {
431
+ name: "uuid",
432
+ dataType: { type: "uuid" },
433
+ autoIncrement: undefined,
434
+ nullable: undefined,
435
+ default: undefined,
436
+ },
437
+ });
438
+ });
439
+
440
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
441
+ const builder = createQueryBuilder(dialect);
442
+ expect(builder.build(def)).toMatchSql(expected.uuidType[dialect]);
443
+ });
444
+ });
445
+
446
+ //#endregion
447
+
448
+ //#region ========== Method Combination Tests ==========
449
+
450
+ describe("nullable specified", () => {
451
+ const c = createColumnFactory();
452
+ const column = c.varchar(100).nullable();
453
+
454
+ const db = createTestDb();
455
+ const def = db.getAddColumnQueryDef(
456
+ { database: "TestDb", schema: "TestSchema", name: "User" },
457
+ "nickname",
458
+ column,
459
+ );
460
+
461
+ it("should validate QueryDef", () => {
462
+ expect(def).toEqual({
463
+ type: "addColumn",
464
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
465
+ column: {
466
+ name: "nickname",
467
+ dataType: { type: "varchar", length: 100 },
468
+ autoIncrement: undefined,
469
+ nullable: true,
470
+ default: undefined,
471
+ },
472
+ });
473
+ });
474
+
475
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
476
+ const builder = createQueryBuilder(dialect);
477
+ expect(builder.build(def)).toMatchSql(expected.nullableColumn[dialect]);
478
+ });
479
+ });
480
+
481
+ describe("default specified", () => {
482
+ const c = createColumnFactory();
483
+ const column = c.int().default(0);
484
+
485
+ const db = createTestDb();
486
+ const def = db.getAddColumnQueryDef(
487
+ { database: "TestDb", schema: "TestSchema", name: "User" },
488
+ "score",
489
+ column,
490
+ );
491
+
492
+ it("should validate QueryDef", () => {
493
+ expect(def).toEqual({
494
+ type: "addColumn",
495
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
496
+ column: {
497
+ name: "score",
498
+ dataType: { type: "int" },
499
+ autoIncrement: undefined,
500
+ nullable: undefined,
501
+ default: 0,
502
+ },
503
+ });
504
+ });
505
+
506
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
507
+ const builder = createQueryBuilder(dialect);
508
+ expect(builder.build(def)).toMatchSql(expected.defaultColumn[dialect]);
509
+ });
510
+ });
511
+
512
+ describe("autoIncrement specified", () => {
513
+ const c = createColumnFactory();
514
+ const column = c.bigint().autoIncrement();
515
+
516
+ const db = createTestDb();
517
+ const def = db.getAddColumnQueryDef(
518
+ { database: "TestDb", schema: "TestSchema", name: "User" },
519
+ "id",
520
+ column,
521
+ );
522
+
523
+ it("should validate QueryDef", () => {
524
+ expect(def).toEqual({
525
+ type: "addColumn",
526
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
527
+ column: {
528
+ name: "id",
529
+ dataType: { type: "bigint" },
530
+ autoIncrement: true,
531
+ nullable: undefined,
532
+ default: undefined,
533
+ },
534
+ });
535
+ });
536
+
537
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
538
+ const builder = createQueryBuilder(dialect);
539
+ expect(builder.build(def)).toMatchSql(expected.autoIncrementColumn[dialect]);
540
+ });
541
+ });
542
+
543
+ describe("description specified", () => {
544
+ const c = createColumnFactory();
545
+ const column = c.varchar(100).description("사용자 이름");
546
+
547
+ const db = createTestDb();
548
+ const def = db.getAddColumnQueryDef(
549
+ { database: "TestDb", schema: "TestSchema", name: "User" },
550
+ "name",
551
+ column,
552
+ );
553
+
554
+ it("should validate QueryDef", () => {
555
+ expect(def).toEqual({
556
+ type: "addColumn",
557
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
558
+ column: {
559
+ name: "name",
560
+ dataType: { type: "varchar", length: 100 },
561
+ autoIncrement: undefined,
562
+ nullable: undefined,
563
+ default: undefined,
564
+ },
565
+ });
566
+ });
567
+
568
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
569
+ const builder = createQueryBuilder(dialect);
570
+ expect(builder.build(def)).toMatchSql(expected.descriptionColumn[dialect]);
571
+ });
572
+ });
573
+
574
+ describe("nullable + default combination", () => {
575
+ const c = createColumnFactory();
576
+ const column = c.varchar(50).nullable().default("Unknown");
577
+
578
+ const db = createTestDb();
579
+ const def = db.getAddColumnQueryDef(
580
+ { database: "TestDb", schema: "TestSchema", name: "User" },
581
+ "status",
582
+ column,
583
+ );
584
+
585
+ it("should validate QueryDef", () => {
586
+ expect(def).toEqual({
587
+ type: "addColumn",
588
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
589
+ column: {
590
+ name: "status",
591
+ dataType: { type: "varchar", length: 50 },
592
+ autoIncrement: undefined,
593
+ nullable: true,
594
+ default: "Unknown",
595
+ },
596
+ });
597
+ });
598
+
599
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
600
+ const builder = createQueryBuilder(dialect);
601
+ expect(builder.build(def)).toMatchSql(expected.nullableDefaultColumn[dialect]);
602
+ });
603
+ });
604
+
605
+ describe("autoIncrement + description combination", () => {
606
+ const c = createColumnFactory();
607
+ const column = c.bigint().autoIncrement().description("Primary Key");
608
+
609
+ const db = createTestDb();
610
+ const def = db.getAddColumnQueryDef(
611
+ { database: "TestDb", schema: "TestSchema", name: "User" },
612
+ "id",
613
+ column,
614
+ );
615
+
616
+ it("should validate QueryDef", () => {
617
+ expect(def).toEqual({
618
+ type: "addColumn",
619
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
620
+ column: {
621
+ name: "id",
622
+ dataType: { type: "bigint" },
623
+ autoIncrement: true,
624
+ nullable: undefined,
625
+ default: undefined,
626
+ },
627
+ });
628
+ });
629
+
630
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
631
+ const builder = createQueryBuilder(dialect);
632
+ expect(builder.build(def)).toMatchSql(expected.autoIncrementDescColumn[dialect]);
633
+ });
634
+ });
635
+
636
+ //#endregion
637
+ });
@@ -0,0 +1,38 @@
1
+ import { mysql, pgsql, tsql } from "@simplysm/core-common";
2
+ import type { ExpectedSql } from "../setup/test-utils";
3
+
4
+ export const singleColumnIndex: ExpectedSql = {
5
+ mysql: mysql`CREATE INDEX \`IDX_User_email\` ON \`TestDb\`.\`User\` (\`email\` ASC)`,
6
+ mssql: tsql`CREATE INDEX [IDX_User_email] ON [TestDb].[TestSchema].[User] ([email] ASC)`,
7
+ postgresql: pgsql`CREATE INDEX "IDX_User_email" ON "TestSchema"."User" ("email" ASC)`,
8
+ };
9
+
10
+ export const uniqueIndex: ExpectedSql = {
11
+ mysql: mysql`CREATE UNIQUE INDEX \`IDX_User_email\` ON \`TestDb\`.\`User\` (\`email\` ASC)`,
12
+ mssql: tsql`CREATE UNIQUE INDEX [IDX_User_email] ON [TestDb].[TestSchema].[User] ([email] ASC)`,
13
+ postgresql: pgsql`CREATE UNIQUE INDEX "IDX_User_email" ON "TestSchema"."User" ("email" ASC)`,
14
+ };
15
+
16
+ export const compositeIndex: ExpectedSql = {
17
+ mysql: mysql`CREATE INDEX \`IDX_User_name_email\` ON \`TestDb\`.\`User\` (\`name\` ASC, \`email\` ASC)`,
18
+ mssql: tsql`CREATE INDEX [IDX_User_name_email] ON [TestDb].[TestSchema].[User] ([name] ASC, [email] ASC)`,
19
+ postgresql: pgsql`CREATE INDEX "IDX_User_name_email" ON "TestSchema"."User" ("name" ASC, "email" ASC)`,
20
+ };
21
+
22
+ export const orderByIndex: ExpectedSql = {
23
+ mysql: mysql`CREATE INDEX \`IDX_User_name_email\` ON \`TestDb\`.\`User\` (\`name\` DESC, \`email\` ASC)`,
24
+ mssql: tsql`CREATE INDEX [IDX_User_name_email] ON [TestDb].[TestSchema].[User] ([name] DESC, [email] ASC)`,
25
+ postgresql: pgsql`CREATE INDEX "IDX_User_name_email" ON "TestSchema"."User" ("name" DESC, "email" ASC)`,
26
+ };
27
+
28
+ export const customNameIndex: ExpectedSql = {
29
+ mysql: mysql`CREATE INDEX \`UQ_User_email\` ON \`TestDb\`.\`User\` (\`email\` ASC)`,
30
+ mssql: tsql`CREATE INDEX [UQ_User_email] ON [TestDb].[TestSchema].[User] ([email] ASC)`,
31
+ postgresql: pgsql`CREATE INDEX "UQ_User_email" ON "TestSchema"."User" ("email" ASC)`,
32
+ };
33
+
34
+ export const uniqueOrderByIndex: ExpectedSql = {
35
+ mysql: mysql`CREATE UNIQUE INDEX \`IDX_User_name_email\` ON \`TestDb\`.\`User\` (\`name\` DESC, \`email\` ASC)`,
36
+ mssql: tsql`CREATE UNIQUE INDEX [IDX_User_name_email] ON [TestDb].[TestSchema].[User] ([name] DESC, [email] ASC)`,
37
+ postgresql: pgsql`CREATE UNIQUE INDEX "IDX_User_name_email" ON "TestSchema"."User" ("name" DESC, "email" ASC)`,
38
+ };