@memberjunction/codegen-lib 5.0.0 → 5.2.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 (33) hide show
  1. package/dist/Angular/angular-codegen.d.ts +12 -0
  2. package/dist/Angular/angular-codegen.d.ts.map +1 -1
  3. package/dist/Angular/angular-codegen.js +63 -0
  4. package/dist/Angular/angular-codegen.js.map +1 -1
  5. package/dist/Database/manage-metadata.d.ts +2 -2
  6. package/dist/Database/manage-metadata.js +2 -2
  7. package/dist/Database/sql_codegen.d.ts +10 -3
  8. package/dist/Database/sql_codegen.d.ts.map +1 -1
  9. package/dist/Database/sql_codegen.js +73 -9
  10. package/dist/Database/sql_codegen.js.map +1 -1
  11. package/dist/EntityNameScanner/EntityNameScanner.d.ts +29 -11
  12. package/dist/EntityNameScanner/EntityNameScanner.d.ts.map +1 -1
  13. package/dist/EntityNameScanner/EntityNameScanner.js +46 -14
  14. package/dist/EntityNameScanner/EntityNameScanner.js.map +1 -1
  15. package/dist/EntityNameScanner/subclass-rename-map.d.ts +20 -0
  16. package/dist/EntityNameScanner/subclass-rename-map.d.ts.map +1 -0
  17. package/dist/EntityNameScanner/subclass-rename-map.js +345 -0
  18. package/dist/EntityNameScanner/subclass-rename-map.js.map +1 -0
  19. package/dist/Misc/action_subclasses_codegen.d.ts +3 -3
  20. package/dist/Misc/action_subclasses_codegen.d.ts.map +1 -1
  21. package/dist/Misc/action_subclasses_codegen.js.map +1 -1
  22. package/dist/runCodeGen.d.ts.map +1 -1
  23. package/dist/runCodeGen.js +24 -3
  24. package/dist/runCodeGen.js.map +1 -1
  25. package/package.json +15 -15
  26. package/dist/Angular/user-view-grid-related-entity-component.d.ts +0 -43
  27. package/dist/Angular/user-view-grid-related-entity-component.d.ts.map +0 -1
  28. package/dist/Angular/user-view-grid-related-entity-component.js +0 -85
  29. package/dist/Angular/user-view-grid-related-entity-component.js.map +0 -1
  30. package/dist/__tests__/metadataConfig.test.d.ts +0 -12
  31. package/dist/__tests__/metadataConfig.test.d.ts.map +0 -1
  32. package/dist/__tests__/metadataConfig.test.js +0 -604
  33. package/dist/__tests__/metadataConfig.test.js.map +0 -1
@@ -1,604 +0,0 @@
1
- /**
2
- * Unit tests for database-metadata-config.json parsing logic.
3
- *
4
- * Tests the three extraction methods on ManageMetadataBase:
5
- * - extractTablesFromConfig (soft PK/FK for regular tables)
6
- * - extractVirtualEntitiesFromConfig (virtual entity definitions)
7
- * - extractISARelationshipsFromConfig (IS-A parent-child declarations)
8
- *
9
- * Also tests deriveEntityNameFromView and the interaction between sections.
10
- */
11
- // Mock heavy dependencies that are not needed for config parsing tests
12
- jest.mock('mssql', () => ({}));
13
- jest.mock('../Config/config', () => ({
14
- configInfo: {},
15
- currentWorkingDirectory: '/tmp',
16
- getSettingValue: jest.fn(),
17
- mj_core_schema: () => '__mj',
18
- outputDir: '/tmp',
19
- }));
20
- jest.mock('@memberjunction/core', () => ({
21
- ApplicationInfo: class {
22
- },
23
- CodeNameFromString: jest.fn((s) => s),
24
- EntityFieldInfo: class {
25
- },
26
- EntityInfo: class {
27
- },
28
- ExtractActualDefaultValue: jest.fn(),
29
- LogError: jest.fn(),
30
- LogStatus: jest.fn(),
31
- Metadata: class {
32
- },
33
- SeverityType: {},
34
- UserInfo: class {
35
- },
36
- }));
37
- jest.mock('@memberjunction/core-entities', () => ({
38
- ApplicationEntity: class {
39
- },
40
- }));
41
- jest.mock('../Misc/status_logging', () => ({
42
- logError: jest.fn(),
43
- logMessage: jest.fn(),
44
- logStatus: jest.fn(),
45
- }));
46
- jest.mock('../Database/sql', () => ({
47
- SQLUtilityBase: class {
48
- },
49
- }));
50
- jest.mock('../Misc/advanced_generation', () => ({
51
- AdvancedGeneration: class {
52
- },
53
- }));
54
- jest.mock('@memberjunction/global', () => ({
55
- convertCamelCaseToHaveSpaces: jest.fn((s) => s.replace(/([A-Z])/g, ' $1').trim()),
56
- generatePluralName: jest.fn((s) => s + 's'),
57
- MJGlobal: { Instance: { ClassFactory: { CreateInstance: jest.fn(() => ({})), Create: jest.fn() } } },
58
- RegisterClass: jest.fn(() => (target) => target),
59
- SafeJSONParse: jest.fn((s) => JSON.parse(s)),
60
- stripTrailingChars: jest.fn((s) => s),
61
- }));
62
- jest.mock('uuid', () => ({ v4: jest.fn(() => 'mock-uuid') }));
63
- jest.mock('../Misc/sql_logging', () => ({
64
- SQLLogging: class {
65
- },
66
- }));
67
- jest.mock('@memberjunction/aiengine', () => ({
68
- AIEngine: class {
69
- },
70
- }));
71
- import { ManageMetadataBase, } from '../Database/manage-metadata.js';
72
- // ---------------------------------------------------------------------------
73
- // Test harness: expose protected methods for testing via a thin subclass
74
- // ---------------------------------------------------------------------------
75
- class TestableManageMetadata extends ManageMetadataBase {
76
- testExtractTables(config) {
77
- return this.extractTablesFromConfig(config);
78
- }
79
- testExtractVirtualEntities(config) {
80
- return this.extractVirtualEntitiesFromConfig(config);
81
- }
82
- testExtractISARelationships(config) {
83
- return this.extractISARelationshipsFromConfig(config);
84
- }
85
- testDeriveEntityName(viewName) {
86
- return this.deriveEntityNameFromView(viewName);
87
- }
88
- }
89
- // ---------------------------------------------------------------------------
90
- // Mock data: various config shapes
91
- // ---------------------------------------------------------------------------
92
- /** Full config with all three sections */
93
- const fullConfig = {
94
- '$schema': './database-metadata-config.schema.json',
95
- 'description': 'Test config with all sections',
96
- 'version': '1.2',
97
- 'VirtualEntities': [
98
- {
99
- ViewName: 'vwCustomerOrderSummary',
100
- SchemaName: 'AdvancedEntities',
101
- EntityName: 'AE Customer Order Summaries',
102
- Description: 'Aggregated customer orders',
103
- PrimaryKey: ['CustomerID'],
104
- ForeignKeys: [
105
- {
106
- FieldName: 'CustomerID',
107
- SchemaName: 'AdvancedEntities',
108
- RelatedTable: 'Customer',
109
- RelatedField: 'ID',
110
- Description: 'FK to Customer',
111
- },
112
- ],
113
- },
114
- {
115
- ViewName: 'vwSalesDashboard',
116
- EntityName: 'Sales Dashboard',
117
- PrimaryKey: ['RegionID'],
118
- },
119
- ],
120
- 'ISARelationships': [
121
- {
122
- ChildEntity: 'AE Meetings',
123
- ParentEntity: 'AE Products',
124
- SchemaName: 'AdvancedEntities',
125
- },
126
- {
127
- ChildEntity: 'AE Webinars',
128
- ParentEntity: 'AE Meetings',
129
- SchemaName: 'AdvancedEntities',
130
- },
131
- {
132
- ChildEntity: 'AE Publications',
133
- ParentEntity: 'AE Products',
134
- SchemaName: 'AdvancedEntities',
135
- },
136
- ],
137
- 'dbo': [
138
- {
139
- TableName: 'Orders',
140
- Description: 'Orders table',
141
- PrimaryKey: [{ FieldName: 'OrderID', Description: 'PK' }],
142
- ForeignKeys: [
143
- {
144
- FieldName: 'CustomerID',
145
- SchemaName: 'dbo',
146
- RelatedTable: 'Customers',
147
- RelatedField: 'ID',
148
- Description: 'FK to Customers',
149
- },
150
- ],
151
- },
152
- ],
153
- 'AdvancedEntities': [
154
- {
155
- TableName: 'Product',
156
- PrimaryKey: [{ FieldName: 'ID' }],
157
- ForeignKeys: [],
158
- },
159
- ],
160
- };
161
- /** Config with only VirtualEntities — no tables, no ISA */
162
- const virtualOnlyConfig = {
163
- '$schema': './schema.json',
164
- 'version': '1.1',
165
- 'VirtualEntities': [
166
- {
167
- ViewName: 'vwMetrics',
168
- PrimaryKey: ['MetricID'],
169
- },
170
- ],
171
- };
172
- /** Config with only ISARelationships — no tables, no virtual entities */
173
- const isaOnlyConfig = {
174
- '$schema': './schema.json',
175
- 'version': '1.2',
176
- 'ISARelationships': [
177
- {
178
- ChildEntity: 'Meetings',
179
- ParentEntity: 'Products',
180
- },
181
- ],
182
- };
183
- /** Config with only schema-as-key tables — no virtual entities, no ISA */
184
- const tablesOnlyConfig = {
185
- '$schema': './schema.json',
186
- 'version': '1.1',
187
- 'dbo': [
188
- {
189
- TableName: 'Users',
190
- PrimaryKey: [{ FieldName: 'UserID' }],
191
- ForeignKeys: [],
192
- },
193
- {
194
- TableName: 'Roles',
195
- PrimaryKey: [{ FieldName: 'RoleID' }],
196
- ForeignKeys: [],
197
- },
198
- ],
199
- 'custom': [
200
- {
201
- TableName: 'Widgets',
202
- PrimaryKey: [{ FieldName: 'ID' }],
203
- ForeignKeys: [
204
- {
205
- FieldName: 'OwnerID',
206
- SchemaName: 'dbo',
207
- RelatedTable: 'Users',
208
- RelatedField: 'UserID',
209
- },
210
- ],
211
- },
212
- ],
213
- };
214
- /** Config with flat Tables array (legacy format) */
215
- const legacyTablesConfig = {
216
- 'Tables': [
217
- {
218
- SchemaName: 'dbo',
219
- TableName: 'LegacyOrders',
220
- PrimaryKey: [{ FieldName: 'OrderID' }],
221
- ForeignKeys: [],
222
- },
223
- {
224
- TableName: 'LegacyItems',
225
- PrimaryKey: [{ FieldName: 'ItemID' }],
226
- ForeignKeys: [
227
- {
228
- FieldName: 'OrderID',
229
- RelatedTable: 'LegacyOrders',
230
- RelatedField: 'OrderID',
231
- },
232
- ],
233
- },
234
- ],
235
- };
236
- /** Empty config — no sections at all */
237
- const emptyConfig = {
238
- '$schema': './schema.json',
239
- 'version': '1.0',
240
- };
241
- /** Config with empty arrays for all sections */
242
- const emptyArraysConfig = {
243
- 'VirtualEntities': [],
244
- 'ISARelationships': [],
245
- 'dbo': [],
246
- };
247
- /** Config with malformed/unexpected values */
248
- const malformedConfig = {
249
- 'VirtualEntities': 'not-an-array',
250
- 'ISARelationships': 42,
251
- 'dbo': { not: 'an-array' },
252
- };
253
- /** Config with VirtualEntities missing optional fields */
254
- const minimalVirtualConfig = {
255
- 'VirtualEntities': [
256
- { ViewName: 'vwSimple' },
257
- { ViewName: 'vwComplex', SchemaName: 'analytics' },
258
- ],
259
- };
260
- /** Config with ISA missing optional SchemaName */
261
- const minimalISAConfig = {
262
- 'ISARelationships': [
263
- { ChildEntity: 'Webinars', ParentEntity: 'Meetings' },
264
- { ChildEntity: 'Meetings', ParentEntity: 'Products', SchemaName: 'myschema' },
265
- ],
266
- };
267
- /** Config combining legacy Tables array with VirtualEntities and ISA */
268
- const mixedFormatConfig = {
269
- 'Tables': [
270
- { SchemaName: 'app', TableName: 'Items', PrimaryKey: [{ FieldName: 'ID' }], ForeignKeys: [] },
271
- ],
272
- 'VirtualEntities': [
273
- { ViewName: 'vwItemSummary', PrimaryKey: ['ItemID'] },
274
- ],
275
- 'ISARelationships': [
276
- { ChildEntity: 'SpecialItems', ParentEntity: 'Items', SchemaName: 'app' },
277
- ],
278
- };
279
- /** Config with multiple schemas having tables, plus ISA and VirtualEntities */
280
- const multiSchemaConfig = {
281
- '$schema': './schema.json',
282
- 'version': '1.2',
283
- 'VirtualEntities': [
284
- { ViewName: 'vwReport1', SchemaName: 'reports', PrimaryKey: ['ReportID'] },
285
- ],
286
- 'ISARelationships': [
287
- { ChildEntity: 'ChildA', ParentEntity: 'ParentA', SchemaName: 'schema1' },
288
- { ChildEntity: 'ChildB', ParentEntity: 'ParentB', SchemaName: 'schema2' },
289
- ],
290
- 'schema1': [
291
- { TableName: 'ParentA', PrimaryKey: [{ FieldName: 'ID' }], ForeignKeys: [] },
292
- ],
293
- 'schema2': [
294
- { TableName: 'ParentB', PrimaryKey: [{ FieldName: 'ID' }], ForeignKeys: [] },
295
- ],
296
- 'reports': [
297
- { TableName: 'ReportData', PrimaryKey: [{ FieldName: 'DataID' }], ForeignKeys: [] },
298
- ],
299
- };
300
- // ---------------------------------------------------------------------------
301
- // Tests
302
- // ---------------------------------------------------------------------------
303
- let manager;
304
- beforeAll(() => {
305
- manager = new TestableManageMetadata();
306
- });
307
- // ===== extractTablesFromConfig =====
308
- describe('extractTablesFromConfig', () => {
309
- test('extracts tables from schema-as-key format', () => {
310
- const tables = manager.testExtractTables(tablesOnlyConfig);
311
- expect(tables).toHaveLength(3);
312
- const dboTables = tables.filter(t => t.SchemaName === 'dbo');
313
- expect(dboTables).toHaveLength(2);
314
- expect(dboTables.map(t => t.TableName).sort()).toEqual(['Roles', 'Users']);
315
- const customTables = tables.filter(t => t.SchemaName === 'custom');
316
- expect(customTables).toHaveLength(1);
317
- expect(customTables[0].TableName).toBe('Widgets');
318
- expect(customTables[0].ForeignKeys).toHaveLength(1);
319
- expect(customTables[0].ForeignKeys[0].FieldName).toBe('OwnerID');
320
- });
321
- test('extracts tables from legacy flat Tables array', () => {
322
- const tables = manager.testExtractTables(legacyTablesConfig);
323
- expect(tables).toHaveLength(2);
324
- expect(tables[0].SchemaName).toBe('dbo');
325
- expect(tables[0].TableName).toBe('LegacyOrders');
326
- // Second table has no SchemaName specified — should default to 'dbo'
327
- expect(tables[1].SchemaName).toBe('dbo');
328
- expect(tables[1].TableName).toBe('LegacyItems');
329
- });
330
- test('skips metadata keys ($schema, description, version)', () => {
331
- const tables = manager.testExtractTables(fullConfig);
332
- // Should only get dbo and AdvancedEntities tables, NOT $schema/description/version
333
- const tableNames = tables.map(t => t.TableName);
334
- expect(tableNames).toContain('Orders');
335
- expect(tableNames).toContain('Product');
336
- expect(tableNames).not.toContain('$schema');
337
- expect(tableNames).not.toContain('description');
338
- });
339
- test('skips VirtualEntities key — does not parse as tables', () => {
340
- const tables = manager.testExtractTables(fullConfig);
341
- // VirtualEntities array items don't have TableName so should be excluded
342
- const tableNames = tables.map(t => t.TableName);
343
- expect(tableNames).not.toContain('vwCustomerOrderSummary');
344
- expect(tableNames).not.toContain('vwSalesDashboard');
345
- });
346
- test('skips ISARelationships key — does not parse as tables', () => {
347
- const tables = manager.testExtractTables(fullConfig);
348
- const tableNames = tables.map(t => t.TableName);
349
- expect(tableNames).not.toContain('AE Meetings');
350
- expect(tableNames).not.toContain('AE Products');
351
- });
352
- test('returns empty array for empty config', () => {
353
- const tables = manager.testExtractTables(emptyConfig);
354
- expect(tables).toEqual([]);
355
- });
356
- test('returns empty array for config with empty arrays', () => {
357
- const tables = manager.testExtractTables(emptyArraysConfig);
358
- expect(tables).toEqual([]);
359
- });
360
- test('handles malformed config gracefully — non-array values skipped', () => {
361
- const tables = manager.testExtractTables(malformedConfig);
362
- // 'dbo' is an object not an array, so it should be skipped
363
- expect(tables).toEqual([]);
364
- });
365
- test('flat Tables format takes priority over schema-as-key', () => {
366
- // When Tables array is present, schema-as-key entries are NOT parsed
367
- const config = {
368
- 'Tables': [{ SchemaName: 'x', TableName: 'T1', PrimaryKey: [], ForeignKeys: [] }],
369
- 'dbo': [{ TableName: 'T2', PrimaryKey: [], ForeignKeys: [] }],
370
- };
371
- const tables = manager.testExtractTables(config);
372
- expect(tables).toHaveLength(1);
373
- expect(tables[0].TableName).toBe('T1');
374
- });
375
- test('preserves PrimaryKey and ForeignKeys from schema-as-key format', () => {
376
- const tables = manager.testExtractTables(fullConfig);
377
- const orders = tables.find(t => t.TableName === 'Orders');
378
- expect(orders).toBeDefined();
379
- expect(orders.PrimaryKey).toHaveLength(1);
380
- expect(orders.PrimaryKey[0].FieldName).toBe('OrderID');
381
- expect(orders.ForeignKeys).toHaveLength(1);
382
- expect(orders.ForeignKeys[0].FieldName).toBe('CustomerID');
383
- expect(orders.ForeignKeys[0].RelatedTable).toBe('Customers');
384
- });
385
- test('extracts from multiple schemas in full config', () => {
386
- const tables = manager.testExtractTables(multiSchemaConfig);
387
- expect(tables.length).toBeGreaterThanOrEqual(3);
388
- const schemas = [...new Set(tables.map(t => t.SchemaName))].sort();
389
- expect(schemas).toEqual(['reports', 'schema1', 'schema2']);
390
- });
391
- });
392
- // ===== extractVirtualEntitiesFromConfig =====
393
- describe('extractVirtualEntitiesFromConfig', () => {
394
- test('extracts virtual entities with all fields', () => {
395
- const ves = manager.testExtractVirtualEntities(fullConfig);
396
- expect(ves).toHaveLength(2);
397
- const summary = ves[0];
398
- expect(summary.ViewName).toBe('vwCustomerOrderSummary');
399
- expect(summary.SchemaName).toBe('AdvancedEntities');
400
- expect(summary.EntityName).toBe('AE Customer Order Summaries');
401
- expect(summary.Description).toBe('Aggregated customer orders');
402
- expect(summary.PrimaryKey).toEqual(['CustomerID']);
403
- expect(summary.ForeignKeys).toHaveLength(1);
404
- expect(summary.ForeignKeys[0].FieldName).toBe('CustomerID');
405
- expect(summary.ForeignKeys[0].RelatedTable).toBe('Customer');
406
- });
407
- test('extracts virtual entity with minimal fields', () => {
408
- const ves = manager.testExtractVirtualEntities(minimalVirtualConfig);
409
- expect(ves).toHaveLength(2);
410
- expect(ves[0].ViewName).toBe('vwSimple');
411
- expect(ves[0].SchemaName).toBeUndefined();
412
- expect(ves[0].EntityName).toBeUndefined();
413
- expect(ves[0].Description).toBeUndefined();
414
- expect(ves[0].PrimaryKey).toBeUndefined();
415
- expect(ves[0].ForeignKeys).toBeUndefined();
416
- expect(ves[1].ViewName).toBe('vwComplex');
417
- expect(ves[1].SchemaName).toBe('analytics');
418
- });
419
- test('returns empty array when VirtualEntities key is missing', () => {
420
- const ves = manager.testExtractVirtualEntities(tablesOnlyConfig);
421
- expect(ves).toEqual([]);
422
- });
423
- test('returns empty array when VirtualEntities is empty', () => {
424
- const ves = manager.testExtractVirtualEntities(emptyArraysConfig);
425
- expect(ves).toEqual([]);
426
- });
427
- test('returns empty array when VirtualEntities is not an array', () => {
428
- const ves = manager.testExtractVirtualEntities(malformedConfig);
429
- expect(ves).toEqual([]);
430
- });
431
- test('returns empty array for empty config', () => {
432
- const ves = manager.testExtractVirtualEntities(emptyConfig);
433
- expect(ves).toEqual([]);
434
- });
435
- test('coexists with ISA and table configs', () => {
436
- const ves = manager.testExtractVirtualEntities(mixedFormatConfig);
437
- expect(ves).toHaveLength(1);
438
- expect(ves[0].ViewName).toBe('vwItemSummary');
439
- });
440
- test('multiple virtual entities without ForeignKeys', () => {
441
- const ves = manager.testExtractVirtualEntities(fullConfig);
442
- const dashboard = ves[1];
443
- expect(dashboard.ViewName).toBe('vwSalesDashboard');
444
- expect(dashboard.EntityName).toBe('Sales Dashboard');
445
- expect(dashboard.PrimaryKey).toEqual(['RegionID']);
446
- expect(dashboard.ForeignKeys).toBeUndefined();
447
- });
448
- });
449
- // ===== extractISARelationshipsFromConfig =====
450
- describe('extractISARelationshipsFromConfig', () => {
451
- test('extracts IS-A relationships with all fields', () => {
452
- const rels = manager.testExtractISARelationships(fullConfig);
453
- expect(rels).toHaveLength(3);
454
- expect(rels[0]).toEqual({
455
- ChildEntity: 'AE Meetings',
456
- ParentEntity: 'AE Products',
457
- SchemaName: 'AdvancedEntities',
458
- });
459
- expect(rels[1]).toEqual({
460
- ChildEntity: 'AE Webinars',
461
- ParentEntity: 'AE Meetings',
462
- SchemaName: 'AdvancedEntities',
463
- });
464
- expect(rels[2]).toEqual({
465
- ChildEntity: 'AE Publications',
466
- ParentEntity: 'AE Products',
467
- SchemaName: 'AdvancedEntities',
468
- });
469
- });
470
- test('extracts IS-A relationships with optional SchemaName omitted', () => {
471
- const rels = manager.testExtractISARelationships(minimalISAConfig);
472
- expect(rels).toHaveLength(2);
473
- expect(rels[0].ChildEntity).toBe('Webinars');
474
- expect(rels[0].ParentEntity).toBe('Meetings');
475
- expect(rels[0].SchemaName).toBeUndefined();
476
- expect(rels[1].SchemaName).toBe('myschema');
477
- });
478
- test('returns empty array when ISARelationships key is missing', () => {
479
- const rels = manager.testExtractISARelationships(tablesOnlyConfig);
480
- expect(rels).toEqual([]);
481
- });
482
- test('returns empty array when ISARelationships is empty', () => {
483
- const rels = manager.testExtractISARelationships(emptyArraysConfig);
484
- expect(rels).toEqual([]);
485
- });
486
- test('returns empty array when ISARelationships is not an array', () => {
487
- const rels = manager.testExtractISARelationships(malformedConfig);
488
- expect(rels).toEqual([]);
489
- });
490
- test('returns empty array for empty config', () => {
491
- const rels = manager.testExtractISARelationships(emptyConfig);
492
- expect(rels).toEqual([]);
493
- });
494
- test('coexists with VirtualEntities and table configs', () => {
495
- const rels = manager.testExtractISARelationships(mixedFormatConfig);
496
- expect(rels).toHaveLength(1);
497
- expect(rels[0].ChildEntity).toBe('SpecialItems');
498
- expect(rels[0].ParentEntity).toBe('Items');
499
- expect(rels[0].SchemaName).toBe('app');
500
- });
501
- test('only config with ISA works correctly', () => {
502
- const rels = manager.testExtractISARelationships(isaOnlyConfig);
503
- expect(rels).toHaveLength(1);
504
- expect(rels[0].ChildEntity).toBe('Meetings');
505
- expect(rels[0].ParentEntity).toBe('Products');
506
- expect(rels[0].SchemaName).toBeUndefined();
507
- });
508
- test('multiple schemas in ISA relationships', () => {
509
- const rels = manager.testExtractISARelationships(multiSchemaConfig);
510
- expect(rels).toHaveLength(2);
511
- expect(rels[0].SchemaName).toBe('schema1');
512
- expect(rels[1].SchemaName).toBe('schema2');
513
- });
514
- });
515
- // ===== deriveEntityNameFromView =====
516
- describe('deriveEntityNameFromView', () => {
517
- test('strips "vw" prefix and adds spaces', () => {
518
- expect(manager.testDeriveEntityName('vwCustomerOrderSummary')).toBe('Customer Order Summary');
519
- });
520
- test('strips "v_" prefix and adds spaces', () => {
521
- expect(manager.testDeriveEntityName('v_SalesDashboard')).toBe('Sales Dashboard');
522
- });
523
- test('handles single-word view name', () => {
524
- expect(manager.testDeriveEntityName('vwMetrics')).toBe('Metrics');
525
- });
526
- test('handles view name without prefix', () => {
527
- expect(manager.testDeriveEntityName('SalesReport')).toBe('Sales Report');
528
- });
529
- test('handles all-lowercase name', () => {
530
- expect(manager.testDeriveEntityName('vwsimple')).toBe('simple');
531
- });
532
- test('handles already-spaced result', () => {
533
- expect(manager.testDeriveEntityName('vwABCMetrics')).toBe('ABCMetrics');
534
- });
535
- });
536
- // ===== Cross-section interaction tests =====
537
- describe('cross-section interactions', () => {
538
- test('all three extractors work independently on full config', () => {
539
- const tables = manager.testExtractTables(fullConfig);
540
- const ves = manager.testExtractVirtualEntities(fullConfig);
541
- const isas = manager.testExtractISARelationships(fullConfig);
542
- expect(tables.length).toBeGreaterThan(0);
543
- expect(ves.length).toBeGreaterThan(0);
544
- expect(isas.length).toBeGreaterThan(0);
545
- // Tables should NOT contain items from VirtualEntities or ISA
546
- const tableNames = tables.map(t => t.TableName);
547
- for (const ve of ves) {
548
- expect(tableNames).not.toContain(ve.ViewName);
549
- }
550
- for (const isa of isas) {
551
- expect(tableNames).not.toContain(isa.ChildEntity);
552
- expect(tableNames).not.toContain(isa.ParentEntity);
553
- }
554
- });
555
- test('empty config returns empty from all extractors', () => {
556
- expect(manager.testExtractTables(emptyConfig)).toEqual([]);
557
- expect(manager.testExtractVirtualEntities(emptyConfig)).toEqual([]);
558
- expect(manager.testExtractISARelationships(emptyConfig)).toEqual([]);
559
- });
560
- test('malformed config returns empty from all extractors', () => {
561
- expect(manager.testExtractTables(malformedConfig)).toEqual([]);
562
- expect(manager.testExtractVirtualEntities(malformedConfig)).toEqual([]);
563
- expect(manager.testExtractISARelationships(malformedConfig)).toEqual([]);
564
- });
565
- test('mixed format (legacy Tables + VE + ISA) parses all sections', () => {
566
- const tables = manager.testExtractTables(mixedFormatConfig);
567
- const ves = manager.testExtractVirtualEntities(mixedFormatConfig);
568
- const isas = manager.testExtractISARelationships(mixedFormatConfig);
569
- expect(tables).toHaveLength(1);
570
- expect(tables[0].TableName).toBe('Items');
571
- expect(ves).toHaveLength(1);
572
- expect(ves[0].ViewName).toBe('vwItemSummary');
573
- expect(isas).toHaveLength(1);
574
- expect(isas[0].ChildEntity).toBe('SpecialItems');
575
- });
576
- test('multi-schema config with all sections', () => {
577
- const tables = manager.testExtractTables(multiSchemaConfig);
578
- const ves = manager.testExtractVirtualEntities(multiSchemaConfig);
579
- const isas = manager.testExtractISARelationships(multiSchemaConfig);
580
- // 3 tables across 3 schemas
581
- expect(tables).toHaveLength(3);
582
- // 1 virtual entity
583
- expect(ves).toHaveLength(1);
584
- expect(ves[0].SchemaName).toBe('reports');
585
- // 2 ISA relationships
586
- expect(isas).toHaveLength(2);
587
- });
588
- test('virtual-only config has no tables and no ISA', () => {
589
- expect(manager.testExtractTables(virtualOnlyConfig)).toEqual([]);
590
- expect(manager.testExtractVirtualEntities(virtualOnlyConfig)).toHaveLength(1);
591
- expect(manager.testExtractISARelationships(virtualOnlyConfig)).toEqual([]);
592
- });
593
- test('ISA-only config has no tables and no virtual entities', () => {
594
- expect(manager.testExtractTables(isaOnlyConfig)).toEqual([]);
595
- expect(manager.testExtractVirtualEntities(isaOnlyConfig)).toEqual([]);
596
- expect(manager.testExtractISARelationships(isaOnlyConfig)).toHaveLength(1);
597
- });
598
- test('tables-only config has no virtual entities and no ISA', () => {
599
- expect(manager.testExtractTables(tablesOnlyConfig).length).toBeGreaterThan(0);
600
- expect(manager.testExtractVirtualEntities(tablesOnlyConfig)).toEqual([]);
601
- expect(manager.testExtractISARelationships(tablesOnlyConfig)).toEqual([]);
602
- });
603
- });
604
- //# sourceMappingURL=metadataConfig.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadataConfig.test.js","sourceRoot":"","sources":["../../src/__tests__/metadataConfig.test.ts"],"names":[],"mappings":"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"}