@memberjunction/codegen-lib 4.0.0 → 4.1.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 (39) hide show
  1. package/README.md +826 -639
  2. package/dist/Angular/angular-codegen.d.ts +9 -2
  3. package/dist/Angular/angular-codegen.d.ts.map +1 -1
  4. package/dist/Angular/angular-codegen.js +84 -62
  5. package/dist/Angular/angular-codegen.js.map +1 -1
  6. package/dist/Angular/entity-data-grid-related-entity-component.d.ts.map +1 -1
  7. package/dist/Angular/entity-data-grid-related-entity-component.js +2 -1
  8. package/dist/Angular/entity-data-grid-related-entity-component.js.map +1 -1
  9. package/dist/Config/config.d.ts.map +1 -1
  10. package/dist/Config/config.js +10 -0
  11. package/dist/Config/config.js.map +1 -1
  12. package/dist/Database/manage-metadata.d.ts +300 -4
  13. package/dist/Database/manage-metadata.d.ts.map +1 -1
  14. package/dist/Database/manage-metadata.js +1024 -147
  15. package/dist/Database/manage-metadata.js.map +1 -1
  16. package/dist/Database/sql_codegen.d.ts +13 -0
  17. package/dist/Database/sql_codegen.d.ts.map +1 -1
  18. package/dist/Database/sql_codegen.js +74 -17
  19. package/dist/Database/sql_codegen.js.map +1 -1
  20. package/dist/Misc/advanced_generation.d.ts +68 -6
  21. package/dist/Misc/advanced_generation.d.ts.map +1 -1
  22. package/dist/Misc/advanced_generation.js +94 -49
  23. package/dist/Misc/advanced_generation.js.map +1 -1
  24. package/dist/Misc/entity_subclasses_codegen.d.ts +5 -0
  25. package/dist/Misc/entity_subclasses_codegen.d.ts.map +1 -1
  26. package/dist/Misc/entity_subclasses_codegen.js +24 -6
  27. package/dist/Misc/entity_subclasses_codegen.js.map +1 -1
  28. package/dist/Misc/graphql_server_codegen.d.ts.map +1 -1
  29. package/dist/Misc/graphql_server_codegen.js +3 -1
  30. package/dist/Misc/graphql_server_codegen.js.map +1 -1
  31. package/dist/__tests__/metadataConfig.test.d.ts +12 -0
  32. package/dist/__tests__/metadataConfig.test.d.ts.map +1 -0
  33. package/dist/__tests__/metadataConfig.test.js +604 -0
  34. package/dist/__tests__/metadataConfig.test.js.map +1 -0
  35. package/package.json +21 -17
  36. package/dist/Angular/user-view-grid-related-entity-component.d.ts +0 -43
  37. package/dist/Angular/user-view-grid-related-entity-component.d.ts.map +0 -1
  38. package/dist/Angular/user-view-grid-related-entity-component.js +0 -85
  39. package/dist/Angular/user-view-grid-related-entity-component.js.map +0 -1
@@ -0,0 +1,604 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataConfig.test.js","sourceRoot":"","sources":["../../src/__tests__/metadataConfig.test.ts"],"names":[],"mappings":"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"}