@proteinjs/db 1.19.0 → 1.20.1

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 (105) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/generated/index.js +1 -1
  3. package/dist/generated/index.js.map +1 -1
  4. package/dist/generated/test/index.d.ts +1 -1
  5. package/dist/generated/test/index.d.ts.map +1 -1
  6. package/dist/generated/test/index.js +52 -34
  7. package/dist/generated/test/index.js.map +1 -1
  8. package/dist/index.d.ts +0 -6
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +0 -6
  11. package/dist/index.js.map +1 -1
  12. package/dist/src/Db.d.ts +2 -2
  13. package/dist/src/Db.d.ts.map +1 -1
  14. package/dist/src/Db.js +6 -3
  15. package/dist/src/Db.js.map +1 -1
  16. package/dist/src/TableWatcherRunner.d.ts.map +1 -1
  17. package/dist/src/TableWatcherRunner.js +4 -1
  18. package/dist/src/TableWatcherRunner.js.map +1 -1
  19. package/dist/src/schema/TableManager.d.ts.map +1 -1
  20. package/dist/src/schema/TableManager.js +4 -1
  21. package/dist/src/schema/TableManager.js.map +1 -1
  22. package/dist/test/index.d.ts +13 -0
  23. package/dist/test/index.d.ts.map +1 -0
  24. package/dist/test/index.js +29 -0
  25. package/dist/test/index.js.map +1 -0
  26. package/dist/test/reusable/CascadeDeleteTests.d.ts +1 -189
  27. package/dist/test/reusable/CascadeDeleteTests.d.ts.map +1 -1
  28. package/dist/test/reusable/CascadeDeleteTests.js +36 -393
  29. package/dist/test/reusable/CascadeDeleteTests.js.map +1 -1
  30. package/dist/test/reusable/ColumnTypesTests.d.ts +1 -52
  31. package/dist/test/reusable/ColumnTypesTests.d.ts.map +1 -1
  32. package/dist/test/reusable/ColumnTypesTests.js +20 -86
  33. package/dist/test/reusable/ColumnTypesTests.js.map +1 -1
  34. package/dist/test/reusable/CrudTests.d.ts +1 -50
  35. package/dist/test/reusable/CrudTests.d.ts.map +1 -1
  36. package/dist/test/reusable/CrudTests.js +37 -126
  37. package/dist/test/reusable/CrudTests.js.map +1 -1
  38. package/dist/test/reusable/DynamicReferenceColumnTests.d.ts +3 -0
  39. package/dist/test/reusable/DynamicReferenceColumnTests.d.ts.map +1 -0
  40. package/dist/test/reusable/DynamicReferenceColumnTests.js +429 -0
  41. package/dist/test/reusable/DynamicReferenceColumnTests.js.map +1 -0
  42. package/dist/test/reusable/TableManagerTests.d.ts +1 -2
  43. package/dist/test/reusable/TableManagerTests.d.ts.map +1 -1
  44. package/dist/test/reusable/TableManagerTests.js +57 -152
  45. package/dist/test/reusable/TableManagerTests.js.map +1 -1
  46. package/dist/test/reusable/TransactionTests.d.ts +1 -51
  47. package/dist/test/reusable/TransactionTests.d.ts.map +1 -1
  48. package/dist/test/reusable/TransactionTests.js +24 -111
  49. package/dist/test/reusable/TransactionTests.js.map +1 -1
  50. package/dist/test/util/DbTestEnvironment.d.ts +12 -0
  51. package/dist/test/util/DbTestEnvironment.d.ts.map +1 -0
  52. package/dist/test/util/DbTestEnvironment.js +125 -0
  53. package/dist/test/util/DbTestEnvironment.js.map +1 -0
  54. package/dist/test/util/tables/cascadeDeleteTestTables.d.ts +191 -0
  55. package/dist/test/util/tables/cascadeDeleteTestTables.d.ts.map +1 -0
  56. package/dist/test/util/tables/cascadeDeleteTestTables.js +234 -0
  57. package/dist/test/util/tables/cascadeDeleteTestTables.js.map +1 -0
  58. package/dist/test/util/tables/columnTypesTestTables.d.ts +47 -0
  59. package/dist/test/util/tables/columnTypesTestTables.d.ts.map +1 -0
  60. package/dist/test/util/tables/columnTypesTestTables.js +49 -0
  61. package/dist/test/util/tables/columnTypesTestTables.js.map +1 -0
  62. package/dist/test/util/tables/crudTestTables.d.ts +48 -0
  63. package/dist/test/util/tables/crudTestTables.d.ts.map +1 -0
  64. package/dist/test/util/tables/crudTestTables.js +58 -0
  65. package/dist/test/util/tables/crudTestTables.js.map +1 -0
  66. package/dist/test/util/tables/dynamicReferenceColumnTestTables.d.ts +76 -0
  67. package/dist/test/util/tables/dynamicReferenceColumnTestTables.d.ts.map +1 -0
  68. package/dist/test/util/tables/dynamicReferenceColumnTestTables.js +131 -0
  69. package/dist/test/util/tables/dynamicReferenceColumnTestTables.js.map +1 -0
  70. package/dist/test/util/tables/tableManagerTestTables.d.ts +86 -0
  71. package/dist/test/util/tables/tableManagerTestTables.d.ts.map +1 -0
  72. package/dist/test/util/tables/tableManagerTestTables.js +131 -0
  73. package/dist/test/util/tables/tableManagerTestTables.js.map +1 -0
  74. package/dist/test/util/tables/transactionTestTables.d.ts +48 -0
  75. package/dist/test/util/tables/transactionTestTables.d.ts.map +1 -0
  76. package/dist/test/util/tables/transactionTestTables.js +58 -0
  77. package/dist/test/util/tables/transactionTestTables.js.map +1 -0
  78. package/generated/index.ts +18 -15
  79. package/generated/test/index.ts +67 -46
  80. package/index.ts +0 -7
  81. package/package.json +29 -17
  82. package/src/Db.ts +8 -3
  83. package/src/TableWatcherRunner.ts +4 -1
  84. package/src/schema/TableManager.ts +4 -1
  85. package/test/index.ts +13 -0
  86. package/test/reusable/CascadeDeleteTests.ts +38 -320
  87. package/test/reusable/ColumnTypesTests.ts +9 -85
  88. package/test/reusable/CrudTests.ts +26 -97
  89. package/test/reusable/DynamicReferenceColumnTests.ts +342 -0
  90. package/test/reusable/TableManagerTests.ts +18 -97
  91. package/test/reusable/TransactionTests.ts +26 -93
  92. package/test/util/DbTestEnvironment.ts +46 -0
  93. package/test/util/tables/cascadeDeleteTestTables.ts +232 -0
  94. package/test/util/tables/columnTypesTestTables.ts +63 -0
  95. package/test/util/tables/crudTestTables.ts +44 -0
  96. package/test/util/tables/dynamicReferenceColumnTestTables.ts +87 -0
  97. package/test/util/tables/tableManagerTestTables.ts +98 -0
  98. package/test/util/tables/transactionTestTables.ts +44 -0
  99. package/tsconfig.json +7 -1
  100. package/LICENSE +0 -21
  101. package/dist/test/reusable/DynamicReferenceColumn.d.ts +0 -77
  102. package/dist/test/reusable/DynamicReferenceColumn.d.ts.map +0 -1
  103. package/dist/test/reusable/DynamicReferenceColumn.js +0 -656
  104. package/dist/test/reusable/DynamicReferenceColumn.js.map +0 -1
  105. package/test/reusable/DynamicReferenceColumn.ts +0 -487
@@ -1,656 +0,0 @@
1
- "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
- return new (P || (P = Promise))(function (resolve, reject) {
20
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
- step((generator = generator.apply(thisArg, _arguments || [])).next());
24
- });
25
- };
26
- var __generator = (this && this.__generator) || function (thisArg, body) {
27
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
- function verb(n) { return function (v) { return step([n, v]); }; }
30
- function step(op) {
31
- if (f) throw new TypeError("Generator is already executing.");
32
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
- if (y = 0, t) op = [op[0] & 2, t.value];
35
- switch (op[0]) {
36
- case 0: case 1: t = op; break;
37
- case 4: _.label++; return { value: op[1], done: false };
38
- case 5: _.label++; y = op[1]; op = [0]; continue;
39
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
- default:
41
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
- if (t[2]) _.ops.pop();
46
- _.trys.pop(); continue;
47
- }
48
- op = body.call(thisArg, _);
49
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
- }
52
- };
53
- Object.defineProperty(exports, "__esModule", { value: true });
54
- exports.dynamicReferenceColumnTests = exports.getDynamicReferenceColumnTestTable = void 0;
55
- var Columns_1 = require("../../src/Columns");
56
- var Db_1 = require("../../src/Db");
57
- var Reference_1 = require("../../src/reference/Reference");
58
- var Table_1 = require("../../src/Table");
59
- var Record_1 = require("../../src/Record");
60
- var db_query_1 = require("@proteinjs/db-query");
61
- var ProjectAssignmentTable = /** @class */ (function (_super) {
62
- __extends(ProjectAssignmentTable, _super);
63
- function ProjectAssignmentTable() {
64
- var _this = _super !== null && _super.apply(this, arguments) || this;
65
- _this.name = 'db_test_project_assignments';
66
- _this.columns = (0, Record_1.withRecordColumns)({
67
- projectName: new Columns_1.StringColumn('project_name'),
68
- employeeTableName: new Columns_1.DynamicReferenceTableNameColumn('employee_table_name', 'employee_ref'),
69
- employeeRef: new Columns_1.DynamicReferenceColumn('employee_ref', 'employee_table_name', true // Enable cascade delete for testing
70
- ),
71
- projectLeadTableName: new Columns_1.DynamicReferenceTableNameColumn('project_lead_table_name', 'project_lead_ref', {
72
- defaultValue: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
73
- return [2 /*return*/, 'TEST_DEFAULT_VALUE'];
74
- }); }); },
75
- updateValue: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
76
- return [2 /*return*/, 'TEST_UPDATE_VALUE'];
77
- }); }); },
78
- }),
79
- projectLeadRef: new Columns_1.DynamicReferenceColumn('project_lead_ref', 'project_lead_table_name', true // Enable cascade delete for testing
80
- ),
81
- startDate: new Columns_1.StringColumn('start_date'),
82
- });
83
- return _this;
84
- }
85
- return ProjectAssignmentTable;
86
- }(Table_1.Table));
87
- var EngineerTable = /** @class */ (function (_super) {
88
- __extends(EngineerTable, _super);
89
- function EngineerTable() {
90
- var _this = _super !== null && _super.apply(this, arguments) || this;
91
- _this.name = 'db_test_engineers';
92
- _this.columns = (0, Record_1.withRecordColumns)({
93
- name: new Columns_1.StringColumn('name'),
94
- yearsOfExperience: new Columns_1.StringColumn('years_of_experience'),
95
- });
96
- return _this;
97
- }
98
- return EngineerTable;
99
- }(Table_1.Table));
100
- var DesignerTable = /** @class */ (function (_super) {
101
- __extends(DesignerTable, _super);
102
- function DesignerTable() {
103
- var _this = _super !== null && _super.apply(this, arguments) || this;
104
- _this.name = 'db_test_designers';
105
- _this.columns = (0, Record_1.withRecordColumns)({
106
- name: new Columns_1.StringColumn('name'),
107
- specialization: new Columns_1.StringColumn('specialization'),
108
- });
109
- return _this;
110
- }
111
- return DesignerTable;
112
- }(Table_1.Table));
113
- var ProjectManagerTable = /** @class */ (function (_super) {
114
- __extends(ProjectManagerTable, _super);
115
- function ProjectManagerTable() {
116
- var _this = _super !== null && _super.apply(this, arguments) || this;
117
- _this.name = 'db_test_project_managers';
118
- _this.columns = (0, Record_1.withRecordColumns)({
119
- name: new Columns_1.StringColumn('name'),
120
- certificate: new Columns_1.StringColumn('certificate'),
121
- });
122
- return _this;
123
- }
124
- return ProjectManagerTable;
125
- }(Table_1.Table));
126
- // Invalid table with missing DynamicReferenceTableNameColumn
127
- var InvalidTableMissingTableName = /** @class */ (function (_super) {
128
- __extends(InvalidTableMissingTableName, _super);
129
- function InvalidTableMissingTableName() {
130
- var _this = _super !== null && _super.apply(this, arguments) || this;
131
- _this.name = 'db_test_invalid_missing_table_name';
132
- _this.columns = (0, Record_1.withRecordColumns)({
133
- // Only has DynamicReferenceColumn without its required table name column
134
- employeeRef: new Columns_1.DynamicReferenceColumn('employee_ref', 'employee_table_name', // References a non-existent column
135
- true),
136
- });
137
- return _this;
138
- }
139
- return InvalidTableMissingTableName;
140
- }(Table_1.Table));
141
- // Invalid table with unused DynamicReferenceTableNameColumn
142
- var InvalidTableUnusedTableName = /** @class */ (function (_super) {
143
- __extends(InvalidTableUnusedTableName, _super);
144
- function InvalidTableUnusedTableName() {
145
- var _this = _super !== null && _super.apply(this, arguments) || this;
146
- _this.name = 'db_test_invalid_unused_table_name';
147
- _this.columns = (0, Record_1.withRecordColumns)({
148
- // Has DynamicReferenceTableNameColumn but no DynamicReferenceColumn using it
149
- employeeTableName: new Columns_1.DynamicReferenceTableNameColumn('employee_table_name', 'employee_ref'),
150
- });
151
- return _this;
152
- }
153
- return InvalidTableUnusedTableName;
154
- }(Table_1.Table));
155
- /** Used for testing purposes only. */
156
- var getDynamicReferenceColumnTestTable = function (tableName) {
157
- var projectAssignmentTable = new ProjectAssignmentTable();
158
- var engineerTable = new EngineerTable();
159
- var designerTable = new DesignerTable();
160
- var projectManagerTable = new ProjectManagerTable();
161
- switch (tableName) {
162
- case projectAssignmentTable.name:
163
- return projectAssignmentTable;
164
- case engineerTable.name:
165
- return engineerTable;
166
- case designerTable.name:
167
- return designerTable;
168
- case projectManagerTable.name:
169
- return projectManagerTable;
170
- default:
171
- throw new Error("Cannot find test table: ".concat(tableName));
172
- }
173
- };
174
- exports.getDynamicReferenceColumnTestTable = getDynamicReferenceColumnTestTable;
175
- // Test suite
176
- var dynamicReferenceColumnTests = function (driver, dropTable) {
177
- return function () {
178
- var projectAssignmentTable;
179
- var engineerTable;
180
- var designerTable;
181
- var projectManagerTable;
182
- var db = new Db_1.Db(driver, exports.getDynamicReferenceColumnTestTable);
183
- beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
184
- return __generator(this, function (_a) {
185
- switch (_a.label) {
186
- case 0:
187
- if (!driver.start) return [3 /*break*/, 2];
188
- return [4 /*yield*/, driver.start()];
189
- case 1:
190
- _a.sent();
191
- _a.label = 2;
192
- case 2: return [4 /*yield*/, driver.getTableManager().loadTable(new ProjectAssignmentTable())];
193
- case 3:
194
- _a.sent();
195
- return [4 /*yield*/, driver.getTableManager().loadTable(new EngineerTable())];
196
- case 4:
197
- _a.sent();
198
- return [4 /*yield*/, driver.getTableManager().loadTable(new DesignerTable())];
199
- case 5:
200
- _a.sent();
201
- return [4 /*yield*/, driver.getTableManager().loadTable(new ProjectManagerTable())];
202
- case 6:
203
- _a.sent();
204
- return [2 /*return*/];
205
- }
206
- });
207
- }); });
208
- beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
209
- return __generator(this, function (_a) {
210
- switch (_a.label) {
211
- case 0: return [4 /*yield*/, driver.getTableManager().loadTable(new ProjectAssignmentTable())];
212
- case 1:
213
- _a.sent();
214
- return [4 /*yield*/, driver.getTableManager().loadTable(new EngineerTable())];
215
- case 2:
216
- _a.sent();
217
- return [4 /*yield*/, driver.getTableManager().loadTable(new DesignerTable())];
218
- case 3:
219
- _a.sent();
220
- return [4 /*yield*/, driver.getTableManager().loadTable(new ProjectManagerTable())];
221
- case 4:
222
- _a.sent();
223
- projectAssignmentTable = new ProjectAssignmentTable();
224
- engineerTable = new EngineerTable();
225
- designerTable = new DesignerTable();
226
- projectManagerTable = new ProjectManagerTable();
227
- return [2 /*return*/];
228
- }
229
- });
230
- }); });
231
- afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
232
- return __generator(this, function (_a) {
233
- switch (_a.label) {
234
- case 0: return [4 /*yield*/, dropTable(new ProjectAssignmentTable())];
235
- case 1:
236
- _a.sent();
237
- return [4 /*yield*/, dropTable(new EngineerTable())];
238
- case 2:
239
- _a.sent();
240
- return [4 /*yield*/, dropTable(new DesignerTable())];
241
- case 3:
242
- _a.sent();
243
- return [4 /*yield*/, dropTable(new ProjectManagerTable())];
244
- case 4:
245
- _a.sent();
246
- return [2 /*return*/];
247
- }
248
- });
249
- }); });
250
- describe('TableManager validation', function () {
251
- test('should throw error when DynamicReferenceTableNameColumn is missing', function () { return __awaiter(void 0, void 0, void 0, function () {
252
- var invalidTable;
253
- return __generator(this, function (_a) {
254
- switch (_a.label) {
255
- case 0:
256
- invalidTable = new InvalidTableMissingTableName();
257
- return [4 /*yield*/, expect(function () { return __awaiter(void 0, void 0, void 0, function () {
258
- return __generator(this, function (_a) {
259
- switch (_a.label) {
260
- case 0: return [4 /*yield*/, driver.getTableManager().loadTable(invalidTable)];
261
- case 1:
262
- _a.sent();
263
- return [2 /*return*/];
264
- }
265
- });
266
- }); }).rejects.toThrow(/missing its required DynamicReferenceTableNameColumn 'employee_table_name'/)];
267
- case 1:
268
- _a.sent();
269
- return [2 /*return*/];
270
- }
271
- });
272
- }); });
273
- test('should throw error when DynamicReferenceTableNameColumn is unused', function () { return __awaiter(void 0, void 0, void 0, function () {
274
- var invalidTable;
275
- return __generator(this, function (_a) {
276
- switch (_a.label) {
277
- case 0:
278
- invalidTable = new InvalidTableUnusedTableName();
279
- return [4 /*yield*/, expect(function () { return __awaiter(void 0, void 0, void 0, function () {
280
- return __generator(this, function (_a) {
281
- switch (_a.label) {
282
- case 0: return [4 /*yield*/, driver.getTableManager().loadTable(invalidTable)];
283
- case 1:
284
- _a.sent();
285
- return [2 /*return*/];
286
- }
287
- });
288
- }); }).rejects.toThrow(/has a DynamicReferenceTableNameColumn 'employee_table_name' but no DynamicReferenceColumn references it/)];
289
- case 1:
290
- _a.sent();
291
- return [2 /*return*/];
292
- }
293
- });
294
- }); });
295
- });
296
- test('should handle references to different types', function () { return __awaiter(void 0, void 0, void 0, function () {
297
- var engineer, designer, engineerAssignment, designerAssignment, fetchedEngineerAssignment, fetchedDesignerAssignment;
298
- var _a, _b, _c, _d;
299
- return __generator(this, function (_e) {
300
- switch (_e.label) {
301
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
302
- name: 'John Doe',
303
- yearsOfExperience: 5,
304
- })];
305
- case 1:
306
- engineer = _e.sent();
307
- return [4 /*yield*/, db.insert(designerTable, {
308
- name: 'Jane Smith',
309
- specialization: 'UI/UX',
310
- })];
311
- case 2:
312
- designer = _e.sent();
313
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
314
- projectName: 'Backend API',
315
- employeeRef: new Reference_1.Reference(engineerTable.name, engineer.id),
316
- startDate: '2024-01-01',
317
- })];
318
- case 3:
319
- engineerAssignment = _e.sent();
320
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
321
- projectName: 'Website Redesign',
322
- employeeRef: new Reference_1.Reference(designerTable.name, designer.id),
323
- startDate: '2024-01-15',
324
- })];
325
- case 4:
326
- designerAssignment = _e.sent();
327
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: engineerAssignment.id })];
328
- case 5:
329
- fetchedEngineerAssignment = _e.sent();
330
- expect((_a = fetchedEngineerAssignment.employeeRef) === null || _a === void 0 ? void 0 : _a._table).toBe(engineerTable.name);
331
- expect((_b = fetchedEngineerAssignment.employeeRef) === null || _b === void 0 ? void 0 : _b._id).toBe(engineer.id);
332
- expect(fetchedEngineerAssignment.employeeTableName).toBe(engineerTable.name);
333
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: designerAssignment.id })];
334
- case 6:
335
- fetchedDesignerAssignment = _e.sent();
336
- expect((_c = fetchedDesignerAssignment.employeeRef) === null || _c === void 0 ? void 0 : _c._table).toBe(designerTable.name);
337
- expect((_d = fetchedDesignerAssignment.employeeRef) === null || _d === void 0 ? void 0 : _d._id).toBe(designer.id);
338
- expect(fetchedDesignerAssignment.employeeTableName).toBe(designerTable.name);
339
- return [2 /*return*/];
340
- }
341
- });
342
- }); });
343
- test('should cascade delete multiple types of records when references are deleted', function () { return __awaiter(void 0, void 0, void 0, function () {
344
- var engineer, projectManager, designer, engineerAssignment, pmAssignment, designerAssignment, deleteQuery, recordsDeleted, remainingEngineers, remainingPMs, remainingDesigners, remainingAssignments;
345
- return __generator(this, function (_a) {
346
- switch (_a.label) {
347
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
348
- name: 'John Doe',
349
- yearsOfExperience: 5,
350
- })];
351
- case 1:
352
- engineer = _a.sent();
353
- return [4 /*yield*/, db.insert(projectManagerTable, {
354
- name: 'Alice Brown',
355
- certificate: 'Scrum Master',
356
- })];
357
- case 2:
358
- projectManager = _a.sent();
359
- return [4 /*yield*/, db.insert(designerTable, {
360
- name: 'Jane Smith',
361
- specialization: 'UI/UX',
362
- })];
363
- case 3:
364
- designer = _a.sent();
365
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
366
- projectName: 'Backend API',
367
- employeeRef: new Reference_1.Reference(engineerTable.name, engineer.id),
368
- startDate: '2024-01-01',
369
- })];
370
- case 4:
371
- engineerAssignment = _a.sent();
372
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
373
- projectName: 'Project Planning',
374
- employeeRef: new Reference_1.Reference(projectManagerTable.name, projectManager.id),
375
- startDate: '2024-01-10',
376
- })];
377
- case 5:
378
- pmAssignment = _a.sent();
379
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
380
- projectName: 'Website Redesign',
381
- employeeRef: new Reference_1.Reference(designerTable.name, designer.id),
382
- startDate: '2024-01-15',
383
- })];
384
- case 6:
385
- designerAssignment = _a.sent();
386
- deleteQuery = new db_query_1.QueryBuilder(projectAssignmentTable.name).condition({
387
- field: 'id',
388
- operator: 'IN',
389
- value: [engineerAssignment.id, pmAssignment.id],
390
- });
391
- return [4 /*yield*/, db.delete(projectAssignmentTable, deleteQuery)];
392
- case 7:
393
- recordsDeleted = _a.sent();
394
- expect(recordsDeleted).toBe(2);
395
- return [4 /*yield*/, db.query(engineerTable, {})];
396
- case 8:
397
- remainingEngineers = _a.sent();
398
- expect(remainingEngineers.length).toBe(0); // Engineer should be deleted
399
- return [4 /*yield*/, db.query(projectManagerTable, {})];
400
- case 9:
401
- remainingPMs = _a.sent();
402
- expect(remainingPMs.length).toBe(0); // PM should be deleted
403
- return [4 /*yield*/, db.query(designerTable, {})];
404
- case 10:
405
- remainingDesigners = _a.sent();
406
- expect(remainingDesigners.length).toBe(1); // Designer should still exist
407
- expect(remainingDesigners[0].id).toBe(designer.id);
408
- return [4 /*yield*/, db.query(projectAssignmentTable, {})];
409
- case 11:
410
- remainingAssignments = _a.sent();
411
- expect(remainingAssignments.length).toBe(1);
412
- expect(remainingAssignments[0].id).toBe(designerAssignment.id);
413
- return [2 /*return*/];
414
- }
415
- });
416
- }); });
417
- test('should allow changing table name when updating reference to new type', function () { return __awaiter(void 0, void 0, void 0, function () {
418
- var engineer, designer, assignment, updatedAssignment;
419
- var _a, _b;
420
- return __generator(this, function (_c) {
421
- switch (_c.label) {
422
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
423
- name: 'John Doe',
424
- yearsOfExperience: 5,
425
- })];
426
- case 1:
427
- engineer = _c.sent();
428
- return [4 /*yield*/, db.insert(designerTable, {
429
- name: 'Jane Smith',
430
- specialization: 'UI/UX',
431
- })];
432
- case 2:
433
- designer = _c.sent();
434
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
435
- projectName: 'Full Stack App',
436
- employeeRef: new Reference_1.Reference(engineerTable.name, engineer.id),
437
- startDate: '2024-01-01',
438
- })];
439
- case 3:
440
- assignment = _c.sent();
441
- // Reassign to designer
442
- return [4 /*yield*/, db.update(projectAssignmentTable, {
443
- employeeRef: new Reference_1.Reference(designerTable.name, designer.id),
444
- }, { id: assignment.id })];
445
- case 4:
446
- // Reassign to designer
447
- _c.sent();
448
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: assignment.id })];
449
- case 5:
450
- updatedAssignment = _c.sent();
451
- expect(updatedAssignment.employeeRef).toBeDefined();
452
- expect((_a = updatedAssignment.employeeRef) === null || _a === void 0 ? void 0 : _a._table).toBe(designerTable.name);
453
- expect((_b = updatedAssignment.employeeRef) === null || _b === void 0 ? void 0 : _b._id).toBe(designer.id);
454
- expect(updatedAssignment.employeeTableName).toBe(designerTable.name);
455
- return [2 /*return*/];
456
- }
457
- });
458
- }); });
459
- describe('DynamicReferenceTableNameColumn behavior', function () {
460
- test('should handle defaultValue logic correctly', function () { return __awaiter(void 0, void 0, void 0, function () {
461
- var engineer, assignment, assignmentNoRef;
462
- return __generator(this, function (_a) {
463
- switch (_a.label) {
464
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
465
- name: 'John Doe',
466
- yearsOfExperience: 5,
467
- })];
468
- case 1:
469
- engineer = _a.sent();
470
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
471
- projectName: 'Test Project',
472
- employeeRef: new Reference_1.Reference(engineerTable.name, engineer.id),
473
- startDate: '2024-01-01',
474
- })];
475
- case 2:
476
- assignment = _a.sent();
477
- // Verify table name was set correctly from reference
478
- expect(assignment.employeeTableName).toBe(engineerTable.name);
479
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
480
- projectName: 'No Reference Project',
481
- employeeRef: null,
482
- startDate: '2024-01-01',
483
- })];
484
- case 3:
485
- assignmentNoRef = _a.sent();
486
- // Verify table name is null when reference is null
487
- expect(assignmentNoRef.employeeTableName).toBeNull();
488
- // Test case 3: Reference without table name should throw
489
- return [4 /*yield*/, expect(db.insert(projectAssignmentTable, {
490
- projectName: 'Invalid Reference',
491
- employeeRef: new Reference_1.Reference('', engineer.id),
492
- startDate: '2024-01-01',
493
- })).rejects.toThrow(/table name must be set in Reference object/)];
494
- case 4:
495
- // Test case 3: Reference without table name should throw
496
- _a.sent();
497
- return [2 /*return*/];
498
- }
499
- });
500
- }); });
501
- test('should handle updateValue logic correctly', function () { return __awaiter(void 0, void 0, void 0, function () {
502
- var engineer, designer, assignment, updatedAssignment, unchangedAssignment;
503
- return __generator(this, function (_a) {
504
- switch (_a.label) {
505
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
506
- name: 'John Doe',
507
- yearsOfExperience: 5,
508
- })];
509
- case 1:
510
- engineer = _a.sent();
511
- return [4 /*yield*/, db.insert(designerTable, {
512
- name: 'Jane Smith',
513
- specialization: 'UI/UX',
514
- })];
515
- case 2:
516
- designer = _a.sent();
517
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
518
- projectName: 'Initial Project',
519
- employeeRef: new Reference_1.Reference(engineerTable.name, engineer.id),
520
- startDate: '2024-01-01',
521
- })];
522
- case 3:
523
- assignment = _a.sent();
524
- // Test case 1: Update reference to new table
525
- return [4 /*yield*/, db.update(projectAssignmentTable, {
526
- employeeRef: new Reference_1.Reference(designerTable.name, designer.id),
527
- }, { id: assignment.id })];
528
- case 4:
529
- // Test case 1: Update reference to new table
530
- _a.sent();
531
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: assignment.id })];
532
- case 5:
533
- updatedAssignment = _a.sent();
534
- expect(updatedAssignment.employeeTableName).toBe(designerTable.name);
535
- // Test case 2: Update without changing reference
536
- return [4 /*yield*/, db.update(projectAssignmentTable, {
537
- projectName: 'Updated Project Name',
538
- }, { id: assignment.id })];
539
- case 6:
540
- // Test case 2: Update without changing reference
541
- _a.sent();
542
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: assignment.id })];
543
- case 7:
544
- unchangedAssignment = _a.sent();
545
- expect(unchangedAssignment.employeeTableName).toBe(designerTable.name); // Should retain previous value
546
- // Test case 3: Update with invalid reference should throw
547
- return [4 /*yield*/, expect(db.update(projectAssignmentTable, {
548
- employeeRef: new Reference_1.Reference('', designer.id), // Empty table name
549
- }, { id: assignment.id })).rejects.toThrow(/table name must be set in Reference object/)];
550
- case 8:
551
- // Test case 3: Update with invalid reference should throw
552
- _a.sent();
553
- return [2 /*return*/];
554
- }
555
- });
556
- }); });
557
- test('should handle null references correctly', function () { return __awaiter(void 0, void 0, void 0, function () {
558
- var engineer, assignment, nullRefAssignment;
559
- return __generator(this, function (_a) {
560
- switch (_a.label) {
561
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
562
- name: 'John Doe',
563
- yearsOfExperience: 5,
564
- })];
565
- case 1:
566
- engineer = _a.sent();
567
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
568
- projectName: 'Initial Project',
569
- employeeRef: new Reference_1.Reference(engineerTable.name, engineer.id),
570
- startDate: '2024-01-01',
571
- })];
572
- case 2:
573
- assignment = _a.sent();
574
- // Update to null reference
575
- return [4 /*yield*/, db.update(projectAssignmentTable, {
576
- employeeRef: null,
577
- }, { id: assignment.id })];
578
- case 3:
579
- // Update to null reference
580
- _a.sent();
581
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: assignment.id })];
582
- case 4:
583
- nullRefAssignment = _a.sent();
584
- expect(nullRefAssignment.employeeRef).toBeNull();
585
- expect(nullRefAssignment.employeeTableName).toBe(engineerTable.name); // Should retain previous value
586
- return [2 /*return*/];
587
- }
588
- });
589
- }); });
590
- test('should handle custom defaultValue override for projectLead', function () { return __awaiter(void 0, void 0, void 0, function () {
591
- var engineer, assignment;
592
- return __generator(this, function (_a) {
593
- switch (_a.label) {
594
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
595
- name: 'John Doe',
596
- yearsOfExperience: 5,
597
- })];
598
- case 1:
599
- engineer = _a.sent();
600
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
601
- projectName: 'Custom Default Test',
602
- projectLeadRef: new Reference_1.Reference(engineerTable.name, engineer.id),
603
- startDate: '2024-01-01',
604
- })];
605
- case 2:
606
- assignment = _a.sent();
607
- // Should use our custom default value instead of the reference's table name
608
- expect(assignment.projectLeadTableName).toBe('TEST_DEFAULT_VALUE');
609
- return [2 /*return*/];
610
- }
611
- });
612
- }); });
613
- test('should handle custom updateValue override for projectLead', function () { return __awaiter(void 0, void 0, void 0, function () {
614
- var engineer, designer, assignment, updatedAssignment;
615
- return __generator(this, function (_a) {
616
- switch (_a.label) {
617
- case 0: return [4 /*yield*/, db.insert(engineerTable, {
618
- name: 'John Doe',
619
- yearsOfExperience: 5,
620
- })];
621
- case 1:
622
- engineer = _a.sent();
623
- return [4 /*yield*/, db.insert(designerTable, {
624
- name: 'Jane Smith',
625
- specialization: 'UI/UX',
626
- })];
627
- case 2:
628
- designer = _a.sent();
629
- return [4 /*yield*/, db.insert(projectAssignmentTable, {
630
- projectName: 'Initial Project',
631
- projectLeadRef: new Reference_1.Reference(engineerTable.name, engineer.id),
632
- startDate: '2024-01-01',
633
- })];
634
- case 3:
635
- assignment = _a.sent();
636
- // Update the reference
637
- return [4 /*yield*/, db.update(projectAssignmentTable, {
638
- projectLeadRef: new Reference_1.Reference(designerTable.name, designer.id),
639
- }, { id: assignment.id })];
640
- case 4:
641
- // Update the reference
642
- _a.sent();
643
- return [4 /*yield*/, db.get(projectAssignmentTable, { id: assignment.id })];
644
- case 5:
645
- updatedAssignment = _a.sent();
646
- // Should use our custom update value instead of the new reference's table name
647
- expect(updatedAssignment.projectLeadTableName).toBe('TEST_UPDATE_VALUE');
648
- return [2 /*return*/];
649
- }
650
- });
651
- }); });
652
- });
653
- };
654
- };
655
- exports.dynamicReferenceColumnTests = dynamicReferenceColumnTests;
656
- //# sourceMappingURL=DynamicReferenceColumn.js.map