befly 3.10.0 → 3.10.2
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.
- package/.gitignore +0 -0
- package/README.md +10 -13
- package/configs/presetFields.ts +10 -0
- package/configs/presetRegexp.ts +225 -0
- package/docs/README.md +17 -11
- package/docs/api/api.md +15 -1
- package/docs/guide/quickstart.md +19 -5
- package/docs/infra/redis.md +23 -11
- package/docs/quickstart.md +5 -335
- package/docs/reference/addon.md +0 -15
- package/docs/reference/config.md +1 -1
- package/docs/reference/logger.md +3 -3
- package/docs/reference/sync.md +99 -73
- package/docs/reference/table.md +1 -1
- package/package.json +15 -16
- package/docs/cipher.md +0 -582
- package/docs/database.md +0 -1176
- package/tests/_mocks/mockSqliteDb.ts +0 -204
- package/tests/addonHelper-cache.test.ts +0 -32
- package/tests/api-integration-array-number.test.ts +0 -282
- package/tests/apiHandler-routePath-only.test.ts +0 -32
- package/tests/befly-config-env.test.ts +0 -78
- package/tests/cacheHelper.test.ts +0 -323
- package/tests/cacheKeys.test.ts +0 -41
- package/tests/checkApi-routePath-strict.test.ts +0 -166
- package/tests/checkMenu.test.ts +0 -346
- package/tests/checkTable-smoke.test.ts +0 -157
- package/tests/cipher.test.ts +0 -249
- package/tests/dbDialect-cache.test.ts +0 -23
- package/tests/dbDialect.test.ts +0 -46
- package/tests/dbHelper-advanced.test.ts +0 -723
- package/tests/dbHelper-all-array-types.test.ts +0 -316
- package/tests/dbHelper-array-serialization.test.ts +0 -258
- package/tests/dbHelper-batch-write.test.ts +0 -90
- package/tests/dbHelper-columns.test.ts +0 -234
- package/tests/dbHelper-execute.test.ts +0 -187
- package/tests/dbHelper-joins.test.ts +0 -221
- package/tests/fields-redis-cache.test.ts +0 -127
- package/tests/fields-validate.test.ts +0 -99
- package/tests/fixtures/scanFilesAddon/node_modules/@befly-addon/demo/apis/sub/b.ts +0 -3
- package/tests/fixtures/scanFilesApis/a.ts +0 -3
- package/tests/fixtures/scanFilesApis/sub/b.ts +0 -3
- package/tests/getClientIp.test.ts +0 -54
- package/tests/integration.test.ts +0 -189
- package/tests/jwt.test.ts +0 -65
- package/tests/loadPlugins-order-smoke.test.ts +0 -75
- package/tests/logger.test.ts +0 -325
- package/tests/redisHelper.test.ts +0 -495
- package/tests/redisKeys.test.ts +0 -9
- package/tests/scanConfig.test.ts +0 -144
- package/tests/scanFiles-routePath.test.ts +0 -46
- package/tests/smoke-sql.test.ts +0 -24
- package/tests/sqlBuilder-advanced.test.ts +0 -608
- package/tests/sqlBuilder.test.ts +0 -209
- package/tests/sync-connection.test.ts +0 -183
- package/tests/sync-init-guard.test.ts +0 -105
- package/tests/syncApi-insBatch-fields-consistent.test.ts +0 -61
- package/tests/syncApi-obsolete-records.test.ts +0 -69
- package/tests/syncApi-type-compat.test.ts +0 -72
- package/tests/syncDev-permissions.test.ts +0 -81
- package/tests/syncMenu-disableMenus-hard-delete.test.ts +0 -88
- package/tests/syncMenu-duplicate-path.test.ts +0 -122
- package/tests/syncMenu-obsolete-records.test.ts +0 -161
- package/tests/syncMenu-parentPath-from-tree.test.ts +0 -75
- package/tests/syncMenu-paths.test.ts +0 -59
- package/tests/syncTable-apply.test.ts +0 -279
- package/tests/syncTable-array-number.test.ts +0 -160
- package/tests/syncTable-constants.test.ts +0 -101
- package/tests/syncTable-db-integration.test.ts +0 -237
- package/tests/syncTable-ddl.test.ts +0 -245
- package/tests/syncTable-helpers.test.ts +0 -99
- package/tests/syncTable-schema.test.ts +0 -99
- package/tests/syncTable-testkit.test.ts +0 -25
- package/tests/syncTable-types.test.ts +0 -122
- package/tests/tableRef-and-deserialize.test.ts +0 -67
- package/tests/util.test.ts +0 -100
- package/tests/validator-array-number.test.ts +0 -310
- package/tests/validator-default.test.ts +0 -373
- package/tests/validator.test.ts +0 -679
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* syncTable 变更应用模块测试
|
|
3
|
-
*
|
|
4
|
-
* 测试 apply.ts 中的函数:
|
|
5
|
-
* - compareFieldDefinition
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, test, expect } from "bun:test";
|
|
9
|
-
|
|
10
|
-
import { syncTable } from "../sync/syncTable.js";
|
|
11
|
-
|
|
12
|
-
describe("compareFieldDefinition", () => {
|
|
13
|
-
describe("长度变化检测", () => {
|
|
14
|
-
test("string 类型长度变化被检测到", () => {
|
|
15
|
-
const existingColumn = {
|
|
16
|
-
type: "varchar",
|
|
17
|
-
max: 50,
|
|
18
|
-
nullable: false,
|
|
19
|
-
defaultValue: "",
|
|
20
|
-
comment: "用户名"
|
|
21
|
-
};
|
|
22
|
-
const fieldDef = {
|
|
23
|
-
name: "用户名",
|
|
24
|
-
type: "string",
|
|
25
|
-
max: 100,
|
|
26
|
-
nullable: false,
|
|
27
|
-
default: null
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
31
|
-
const lengthChange = changes.find((c: any) => c.type === "length");
|
|
32
|
-
|
|
33
|
-
expect(lengthChange).toBeDefined();
|
|
34
|
-
expect(lengthChange.current).toBe(50);
|
|
35
|
-
expect(lengthChange.expected).toBe(100);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test("长度相同无变化", () => {
|
|
39
|
-
const existingColumn = {
|
|
40
|
-
type: "varchar",
|
|
41
|
-
max: 100,
|
|
42
|
-
nullable: false,
|
|
43
|
-
defaultValue: "",
|
|
44
|
-
comment: "用户名"
|
|
45
|
-
};
|
|
46
|
-
const fieldDef = {
|
|
47
|
-
name: "用户名",
|
|
48
|
-
type: "string",
|
|
49
|
-
max: 100,
|
|
50
|
-
nullable: false,
|
|
51
|
-
default: null
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
55
|
-
const lengthChange = changes.find((c: any) => c.type === "length");
|
|
56
|
-
|
|
57
|
-
expect(lengthChange).toBeUndefined();
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe("注释变化检测", () => {
|
|
62
|
-
test("注释变化被检测到", () => {
|
|
63
|
-
const existingColumn = {
|
|
64
|
-
type: "varchar",
|
|
65
|
-
max: 100,
|
|
66
|
-
nullable: false,
|
|
67
|
-
defaultValue: "",
|
|
68
|
-
comment: "旧注释"
|
|
69
|
-
};
|
|
70
|
-
const fieldDef = {
|
|
71
|
-
name: "新注释",
|
|
72
|
-
type: "string",
|
|
73
|
-
max: 100,
|
|
74
|
-
nullable: false,
|
|
75
|
-
default: null
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
79
|
-
const commentChange = changes.find((c: any) => c.type === "comment");
|
|
80
|
-
|
|
81
|
-
expect(commentChange).toBeDefined();
|
|
82
|
-
expect(commentChange.current).toBe("旧注释");
|
|
83
|
-
expect(commentChange.expected).toBe("新注释");
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test("注释相同无变化", () => {
|
|
87
|
-
const existingColumn = {
|
|
88
|
-
type: "varchar",
|
|
89
|
-
max: 100,
|
|
90
|
-
nullable: false,
|
|
91
|
-
defaultValue: "",
|
|
92
|
-
comment: "用户名"
|
|
93
|
-
};
|
|
94
|
-
const fieldDef = {
|
|
95
|
-
name: "用户名",
|
|
96
|
-
type: "string",
|
|
97
|
-
max: 100,
|
|
98
|
-
nullable: false,
|
|
99
|
-
default: null
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
103
|
-
const commentChange = changes.find((c: any) => c.type === "comment");
|
|
104
|
-
|
|
105
|
-
expect(commentChange).toBeUndefined();
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
describe("数据类型变化检测", () => {
|
|
110
|
-
test("类型变化被检测到", () => {
|
|
111
|
-
const existingColumn = {
|
|
112
|
-
type: "bigint",
|
|
113
|
-
max: null,
|
|
114
|
-
nullable: false,
|
|
115
|
-
defaultValue: 0,
|
|
116
|
-
comment: "数量"
|
|
117
|
-
};
|
|
118
|
-
const fieldDef = {
|
|
119
|
-
name: "数量",
|
|
120
|
-
type: "string",
|
|
121
|
-
max: 100,
|
|
122
|
-
nullable: false,
|
|
123
|
-
default: null
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
127
|
-
const typeChange = changes.find((c: any) => c.type === "datatype");
|
|
128
|
-
|
|
129
|
-
expect(typeChange).toBeDefined();
|
|
130
|
-
expect(typeChange.current).toBe("bigint");
|
|
131
|
-
expect(typeChange.expected).toBe("varchar");
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
test("类型相同无变化", () => {
|
|
135
|
-
const existingColumn = {
|
|
136
|
-
type: "bigint",
|
|
137
|
-
max: null,
|
|
138
|
-
nullable: false,
|
|
139
|
-
defaultValue: 0,
|
|
140
|
-
comment: "数量"
|
|
141
|
-
};
|
|
142
|
-
const fieldDef = {
|
|
143
|
-
name: "数量",
|
|
144
|
-
type: "number",
|
|
145
|
-
max: null,
|
|
146
|
-
nullable: false,
|
|
147
|
-
default: 0
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
151
|
-
const typeChange = changes.find((c: any) => c.type === "datatype");
|
|
152
|
-
|
|
153
|
-
expect(typeChange).toBeUndefined();
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
describe("可空性变化检测", () => {
|
|
158
|
-
test("nullable 变化被检测到", () => {
|
|
159
|
-
const existingColumn = {
|
|
160
|
-
type: "varchar",
|
|
161
|
-
max: 100,
|
|
162
|
-
nullable: false,
|
|
163
|
-
defaultValue: "",
|
|
164
|
-
comment: "用户名"
|
|
165
|
-
};
|
|
166
|
-
const fieldDef = {
|
|
167
|
-
name: "用户名",
|
|
168
|
-
type: "string",
|
|
169
|
-
max: 100,
|
|
170
|
-
nullable: true,
|
|
171
|
-
default: null
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
175
|
-
const nullableChange = changes.find((c: any) => c.type === "nullable");
|
|
176
|
-
|
|
177
|
-
expect(nullableChange).toBeDefined();
|
|
178
|
-
expect(nullableChange.current).toBe(false);
|
|
179
|
-
expect(nullableChange.expected).toBe(true);
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
describe("默认值变化检测", () => {
|
|
184
|
-
test("默认值变化被检测到", () => {
|
|
185
|
-
const existingColumn = {
|
|
186
|
-
type: "varchar",
|
|
187
|
-
max: 100,
|
|
188
|
-
nullable: false,
|
|
189
|
-
defaultValue: "old",
|
|
190
|
-
comment: "用户名"
|
|
191
|
-
};
|
|
192
|
-
const fieldDef = {
|
|
193
|
-
name: "用户名",
|
|
194
|
-
type: "string",
|
|
195
|
-
max: 100,
|
|
196
|
-
nullable: false,
|
|
197
|
-
default: "new"
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
201
|
-
const defaultChange = changes.find((c: any) => c.type === "default");
|
|
202
|
-
|
|
203
|
-
expect(defaultChange).toBeDefined();
|
|
204
|
-
expect(defaultChange.current).toBe("old");
|
|
205
|
-
expect(defaultChange.expected).toBe("new");
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
test("null 默认值被正确处理", () => {
|
|
209
|
-
const existingColumn = {
|
|
210
|
-
type: "varchar",
|
|
211
|
-
max: 100,
|
|
212
|
-
nullable: false,
|
|
213
|
-
defaultValue: "",
|
|
214
|
-
comment: "用户名"
|
|
215
|
-
};
|
|
216
|
-
const fieldDef = {
|
|
217
|
-
name: "用户名",
|
|
218
|
-
type: "string",
|
|
219
|
-
max: 100,
|
|
220
|
-
nullable: false,
|
|
221
|
-
default: null // null 会被解析为空字符串
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
225
|
-
const defaultChange = changes.find((c: any) => c.type === "default");
|
|
226
|
-
|
|
227
|
-
// null -> '' (空字符串),与现有值相同,无变化
|
|
228
|
-
expect(defaultChange).toBeUndefined();
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
describe("多变化组合", () => {
|
|
233
|
-
test("多个变化同时被检测", () => {
|
|
234
|
-
const existingColumn = {
|
|
235
|
-
type: "varchar",
|
|
236
|
-
max: 50,
|
|
237
|
-
nullable: false,
|
|
238
|
-
defaultValue: "old",
|
|
239
|
-
comment: "旧注释"
|
|
240
|
-
};
|
|
241
|
-
const fieldDef = {
|
|
242
|
-
name: "新注释",
|
|
243
|
-
type: "string",
|
|
244
|
-
max: 100,
|
|
245
|
-
nullable: true,
|
|
246
|
-
default: "new"
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
250
|
-
|
|
251
|
-
expect(changes.length).toBe(4); // length, comment, nullable, default
|
|
252
|
-
expect(changes.some((c: any) => c.type === "length")).toBe(true);
|
|
253
|
-
expect(changes.some((c: any) => c.type === "comment")).toBe(true);
|
|
254
|
-
expect(changes.some((c: any) => c.type === "nullable")).toBe(true);
|
|
255
|
-
expect(changes.some((c: any) => c.type === "default")).toBe(true);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
test("无变化返回空数组", () => {
|
|
259
|
-
const existingColumn = {
|
|
260
|
-
type: "varchar",
|
|
261
|
-
max: 100,
|
|
262
|
-
nullable: false,
|
|
263
|
-
defaultValue: "",
|
|
264
|
-
comment: "用户名"
|
|
265
|
-
};
|
|
266
|
-
const fieldDef = {
|
|
267
|
-
name: "用户名",
|
|
268
|
-
type: "string",
|
|
269
|
-
max: 100,
|
|
270
|
-
nullable: false,
|
|
271
|
-
default: null
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
const changes = syncTable.TestKit.compareFieldDefinition("mysql", existingColumn as any, fieldDef as any);
|
|
275
|
-
|
|
276
|
-
expect(changes.length).toBe(0);
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
});
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 测试 syncTable 对 array_number_string 和 array_number_text 类型的支持
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, expect, test } from "bun:test";
|
|
6
|
-
|
|
7
|
-
import { syncTable } from "../sync/syncTable.js";
|
|
8
|
-
|
|
9
|
-
describe("syncTable - array_number 类型支持", () => {
|
|
10
|
-
// ==================== 类型判断测试 ====================
|
|
11
|
-
|
|
12
|
-
test("isStringOrArrayType: array_number_string 需要长度", () => {
|
|
13
|
-
expect(syncTable.TestKit.isStringOrArrayType("array_number_string")).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test("isStringOrArrayType: array_number_text 不需要长度", () => {
|
|
17
|
-
expect(syncTable.TestKit.isStringOrArrayType("array_number_text")).toBe(false);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// ==================== SQL 类型映射测试 ====================
|
|
21
|
-
|
|
22
|
-
test("getSqlType: array_number_string 生成 VARCHAR(max)", () => {
|
|
23
|
-
const sqlType = syncTable.TestKit.getSqlType("mysql", "array_number_string", 500);
|
|
24
|
-
expect(sqlType).toMatch(/VARCHAR\(500\)/i);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test("getSqlType: array_number_text 生成 TEXT/MEDIUMTEXT", () => {
|
|
28
|
-
const sqlType = syncTable.TestKit.getSqlType("mysql", "array_number_text", null);
|
|
29
|
-
expect(sqlType).toMatch(/TEXT/i);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test("getSqlType: array_number_string 使用 max 参数", () => {
|
|
33
|
-
const sqlType1 = syncTable.TestKit.getSqlType("mysql", "array_number_string", 200);
|
|
34
|
-
const sqlType2 = syncTable.TestKit.getSqlType("mysql", "array_number_string", 1000);
|
|
35
|
-
|
|
36
|
-
expect(sqlType1).toMatch(/VARCHAR\(200\)/i);
|
|
37
|
-
expect(sqlType2).toMatch(/VARCHAR\(1000\)/i);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// ==================== 默认值处理测试 ====================
|
|
41
|
-
|
|
42
|
-
test('resolveDefaultValue: array_number_string null 时返回 "[]"', () => {
|
|
43
|
-
const result = syncTable.TestKit.resolveDefaultValue(null, "array_number_string");
|
|
44
|
-
expect(result).toBe("[]");
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test("resolveDefaultValue: array_number_string 有默认值时保留", () => {
|
|
48
|
-
const result = syncTable.TestKit.resolveDefaultValue("[1,2,3]", "array_number_string");
|
|
49
|
-
expect(result).toBe("[1,2,3]");
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('resolveDefaultValue: array_number_text null 时返回 "null"', () => {
|
|
53
|
-
const result = syncTable.TestKit.resolveDefaultValue(null, "array_number_text");
|
|
54
|
-
expect(result).toBe("null");
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test("resolveDefaultValue: array_number_text 有默认值时保留", () => {
|
|
58
|
-
const result = syncTable.TestKit.resolveDefaultValue("[100,200]", "array_number_text");
|
|
59
|
-
expect(result).toBe("[100,200]");
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test('resolveDefaultValue: 字符串 "null" 也视为 null', () => {
|
|
63
|
-
const result1 = syncTable.TestKit.resolveDefaultValue("null", "array_number_string");
|
|
64
|
-
const result2 = syncTable.TestKit.resolveDefaultValue("null", "array_number_text");
|
|
65
|
-
|
|
66
|
-
expect(result1).toBe("[]");
|
|
67
|
-
expect(result2).toBe("null");
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// ==================== SQL DEFAULT 子句测试 ====================
|
|
71
|
-
|
|
72
|
-
test("generateDefaultSql: array_number_string 生成 DEFAULT 子句", () => {
|
|
73
|
-
const sql = syncTable.TestKit.generateDefaultSql("[]", "array_number_string");
|
|
74
|
-
expect(sql).toBe(" DEFAULT '[]'");
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test("generateDefaultSql: array_number_string 自定义默认值", () => {
|
|
78
|
-
const sql = syncTable.TestKit.generateDefaultSql("[10,20,30]", "array_number_string");
|
|
79
|
-
expect(sql).toBe(" DEFAULT '[10,20,30]'");
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("generateDefaultSql: array_number_text 不生成 DEFAULT", () => {
|
|
83
|
-
const sql = syncTable.TestKit.generateDefaultSql("[]", "array_number_text");
|
|
84
|
-
expect(sql).toBe("");
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("generateDefaultSql: array_number_text null 时不生成 DEFAULT", () => {
|
|
88
|
-
const sql = syncTable.TestKit.generateDefaultSql("null", "array_number_text");
|
|
89
|
-
expect(sql).toBe("");
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// ==================== 单引号转义测试 ====================
|
|
93
|
-
|
|
94
|
-
test("generateDefaultSql: 默认值包含单引号时正确转义", () => {
|
|
95
|
-
const sql = syncTable.TestKit.generateDefaultSql("[1,'test',2]", "array_number_string");
|
|
96
|
-
expect(sql).toBe(" DEFAULT '[1,''test'',2]'");
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// ==================== 完整流程测试 ====================
|
|
100
|
-
|
|
101
|
-
test("完整流程: array_number_string 字段定义", () => {
|
|
102
|
-
// 模拟字段定义:"标签ID|array_number_string|0|500|[]|0"
|
|
103
|
-
const fieldType = "array_number_string";
|
|
104
|
-
const fieldMax = 500;
|
|
105
|
-
const fieldDefault = null;
|
|
106
|
-
|
|
107
|
-
// 1. 判断是否需要长度
|
|
108
|
-
expect(syncTable.TestKit.isStringOrArrayType(fieldType)).toBe(true);
|
|
109
|
-
|
|
110
|
-
// 2. 获取 SQL 类型
|
|
111
|
-
const sqlType = syncTable.TestKit.getSqlType("mysql", fieldType, fieldMax);
|
|
112
|
-
expect(sqlType).toMatch(/VARCHAR\(500\)/i);
|
|
113
|
-
|
|
114
|
-
// 3. 处理默认值
|
|
115
|
-
const actualDefault = syncTable.TestKit.resolveDefaultValue(fieldDefault, fieldType);
|
|
116
|
-
expect(actualDefault).toBe("[]");
|
|
117
|
-
|
|
118
|
-
// 4. 生成 DEFAULT 子句
|
|
119
|
-
const defaultSql = syncTable.TestKit.generateDefaultSql(actualDefault, fieldType);
|
|
120
|
-
expect(defaultSql).toBe(" DEFAULT '[]'");
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test("完整流程: array_number_text 字段定义", () => {
|
|
124
|
-
// 模拟字段定义:"关联ID|array_number_text|||null|0"
|
|
125
|
-
const fieldType = "array_number_text";
|
|
126
|
-
const fieldMax = null;
|
|
127
|
-
const fieldDefault = null;
|
|
128
|
-
|
|
129
|
-
// 1. 判断是否需要长度
|
|
130
|
-
expect(syncTable.TestKit.isStringOrArrayType(fieldType)).toBe(false);
|
|
131
|
-
|
|
132
|
-
// 2. 获取 SQL 类型
|
|
133
|
-
const sqlType = syncTable.TestKit.getSqlType("mysql", fieldType, fieldMax);
|
|
134
|
-
expect(sqlType).toMatch(/TEXT/i);
|
|
135
|
-
|
|
136
|
-
// 3. 处理默认值
|
|
137
|
-
const actualDefault = syncTable.TestKit.resolveDefaultValue(fieldDefault, fieldType);
|
|
138
|
-
expect(actualDefault).toBe("null");
|
|
139
|
-
|
|
140
|
-
// 4. 生成 DEFAULT 子句(TEXT 类型不支持)
|
|
141
|
-
const defaultSql = syncTable.TestKit.generateDefaultSql(actualDefault, fieldType);
|
|
142
|
-
expect(defaultSql).toBe("");
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("完整流程: array_number_string 自定义默认值", () => {
|
|
146
|
-
// 模拟字段定义:"分数|array_number_string|2|10|[60,70,80]|0"
|
|
147
|
-
const fieldType = "array_number_string";
|
|
148
|
-
const fieldMax = 10;
|
|
149
|
-
const fieldDefault = "[60,70,80]";
|
|
150
|
-
|
|
151
|
-
const sqlType = syncTable.TestKit.getSqlType("mysql", fieldType, fieldMax);
|
|
152
|
-
expect(sqlType).toMatch(/VARCHAR\(10\)/i);
|
|
153
|
-
|
|
154
|
-
const actualDefault = syncTable.TestKit.resolveDefaultValue(fieldDefault, fieldType);
|
|
155
|
-
expect(actualDefault).toBe("[60,70,80]");
|
|
156
|
-
|
|
157
|
-
const defaultSql = syncTable.TestKit.generateDefaultSql(actualDefault, fieldType);
|
|
158
|
-
expect(defaultSql).toBe(" DEFAULT '[60,70,80]'");
|
|
159
|
-
});
|
|
160
|
-
});
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* syncTable 常量模块测试
|
|
3
|
-
*
|
|
4
|
-
* 测试 constants.ts 中的常量:
|
|
5
|
-
* - DB_VERSION_REQUIREMENTS
|
|
6
|
-
* - SYSTEM_INDEX_FIELDS
|
|
7
|
-
* - SYSTEM_INDEX_FIELDS
|
|
8
|
-
* - CHANGE_TYPE_LABELS
|
|
9
|
-
* - MYSQL_TABLE_CONFIG
|
|
10
|
-
* - typeMapping
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { describe, test, expect } from "bun:test";
|
|
14
|
-
|
|
15
|
-
import { syncTable } from "../sync/syncTable.js";
|
|
16
|
-
|
|
17
|
-
describe("DB_VERSION_REQUIREMENTS", () => {
|
|
18
|
-
test("MySQL 最低版本为 8", () => {
|
|
19
|
-
expect(syncTable.TestKit.DB_VERSION_REQUIREMENTS.MYSQL_MIN_MAJOR).toBe(8);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test("PostgreSQL 最低版本为 17", () => {
|
|
23
|
-
expect(syncTable.TestKit.DB_VERSION_REQUIREMENTS.POSTGRES_MIN_MAJOR).toBe(17);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test("SQLite 最低版本为 3.50.0", () => {
|
|
27
|
-
expect(syncTable.TestKit.DB_VERSION_REQUIREMENTS.SQLITE_MIN_VERSION).toBe("3.50.0");
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe("SYSTEM_INDEX_FIELDS", () => {
|
|
32
|
-
test("包含 created_at", () => {
|
|
33
|
-
expect(syncTable.TestKit.SYSTEM_INDEX_FIELDS).toContain("created_at");
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test("包含 updated_at", () => {
|
|
37
|
-
expect(syncTable.TestKit.SYSTEM_INDEX_FIELDS).toContain("updated_at");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test("包含 state", () => {
|
|
41
|
-
expect(syncTable.TestKit.SYSTEM_INDEX_FIELDS).toContain("state");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("共 3 个系统索引字段", () => {
|
|
45
|
-
expect(syncTable.TestKit.SYSTEM_INDEX_FIELDS.length).toBe(3);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe("CHANGE_TYPE_LABELS", () => {
|
|
50
|
-
test('length 对应 "长度"', () => {
|
|
51
|
-
expect((syncTable.TestKit.CHANGE_TYPE_LABELS as any).length).toBe("长度");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test('datatype 对应 "类型"', () => {
|
|
55
|
-
expect(syncTable.TestKit.CHANGE_TYPE_LABELS.datatype).toBe("类型");
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('comment 对应 "注释"', () => {
|
|
59
|
-
expect(syncTable.TestKit.CHANGE_TYPE_LABELS.comment).toBe("注释");
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test('default 对应 "默认值"', () => {
|
|
63
|
-
expect(syncTable.TestKit.CHANGE_TYPE_LABELS.default).toBe("默认值");
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe("MYSQL_TABLE_CONFIG", () => {
|
|
68
|
-
test("ENGINE 为 InnoDB", () => {
|
|
69
|
-
expect(syncTable.TestKit.MYSQL_TABLE_CONFIG.ENGINE).toBe("InnoDB");
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("CHARSET 为 utf8mb4", () => {
|
|
73
|
-
expect(syncTable.TestKit.MYSQL_TABLE_CONFIG.CHARSET).toBe("utf8mb4");
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test("COLLATE 为 utf8mb4_0900_ai_ci", () => {
|
|
77
|
-
expect(syncTable.TestKit.MYSQL_TABLE_CONFIG.COLLATE).toBe("utf8mb4_0900_ai_ci");
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
describe("getTypeMapping (MySQL)", () => {
|
|
82
|
-
test("number 映射为 BIGINT", () => {
|
|
83
|
-
expect(syncTable.TestKit.getTypeMapping("mysql").number).toBe("BIGINT");
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test("string 映射为 VARCHAR", () => {
|
|
87
|
-
expect(syncTable.TestKit.getTypeMapping("mysql").string).toBe("VARCHAR");
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test("text 映射为 MEDIUMTEXT", () => {
|
|
91
|
-
expect(syncTable.TestKit.getTypeMapping("mysql").text).toBe("MEDIUMTEXT");
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test("array_string 映射为 VARCHAR", () => {
|
|
95
|
-
expect(syncTable.TestKit.getTypeMapping("mysql").array_string).toBe("VARCHAR");
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
test("array_text 映射为 MEDIUMTEXT", () => {
|
|
99
|
-
expect(syncTable.TestKit.getTypeMapping("mysql").array_text).toBe("MEDIUMTEXT");
|
|
100
|
-
});
|
|
101
|
-
});
|