@memberjunction/codegen-lib 6.1.0-edge.1 → 6.1.0-edge.3

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 (96) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +39 -22
  3. package/dist/Angular/angular-codegen.d.ts +0 -8
  4. package/dist/Angular/angular-codegen.d.ts.map +1 -1
  5. package/dist/Angular/angular-codegen.js +32 -22
  6. package/dist/Angular/angular-codegen.js.map +1 -1
  7. package/dist/Angular/entity-data-grid-related-entity-component.js +2 -2
  8. package/dist/Angular/entity-data-grid-related-entity-component.js.map +1 -1
  9. package/dist/Angular/related-entity-components.d.ts +1 -1
  10. package/dist/Angular/related-entity-components.js +1 -1
  11. package/dist/Database/codeGenDatabaseProvider.d.ts +107 -1
  12. package/dist/Database/codeGenDatabaseProvider.d.ts.map +1 -1
  13. package/dist/Database/codeGenDatabaseProvider.js +77 -10
  14. package/dist/Database/codeGenDatabaseProvider.js.map +1 -1
  15. package/dist/Database/manage-metadata.d.ts +354 -14
  16. package/dist/Database/manage-metadata.d.ts.map +1 -1
  17. package/dist/Database/manage-metadata.js +1308 -65
  18. package/dist/Database/manage-metadata.js.map +1 -1
  19. package/dist/Database/materializationAnalysis.d.ts +241 -0
  20. package/dist/Database/materializationAnalysis.d.ts.map +1 -0
  21. package/dist/Database/materializationAnalysis.js +415 -0
  22. package/dist/Database/materializationAnalysis.js.map +1 -0
  23. package/dist/Database/materializationBroadRender.d.ts +67 -0
  24. package/dist/Database/materializationBroadRender.d.ts.map +1 -0
  25. package/dist/Database/materializationBroadRender.js +104 -0
  26. package/dist/Database/materializationBroadRender.js.map +1 -0
  27. package/dist/Database/materializationDrift.d.ts +59 -0
  28. package/dist/Database/materializationDrift.d.ts.map +1 -0
  29. package/dist/Database/materializationDrift.js +85 -0
  30. package/dist/Database/materializationDrift.js.map +1 -0
  31. package/dist/Database/materializationParamClassifier.d.ts +92 -0
  32. package/dist/Database/materializationParamClassifier.d.ts.map +1 -0
  33. package/dist/Database/materializationParamClassifier.js +224 -0
  34. package/dist/Database/materializationParamClassifier.js.map +1 -0
  35. package/dist/Database/materializationParamVerifier.d.ts +71 -0
  36. package/dist/Database/materializationParamVerifier.d.ts.map +1 -0
  37. package/dist/Database/materializationParamVerifier.js +302 -0
  38. package/dist/Database/materializationParamVerifier.js.map +1 -0
  39. package/dist/Database/materializationSqlAst.d.ts +78 -0
  40. package/dist/Database/materializationSqlAst.d.ts.map +1 -0
  41. package/dist/Database/materializationSqlAst.js +142 -0
  42. package/dist/Database/materializationSqlAst.js.map +1 -0
  43. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts +69 -30
  44. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts.map +1 -1
  45. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js +325 -216
  46. package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js.map +1 -1
  47. package/dist/Database/providers/postgresql/__tests__/PostgreSQLCodeGenProvider.materialization.test.d.ts +2 -0
  48. package/dist/Database/providers/postgresql/__tests__/PostgreSQLCodeGenProvider.materialization.test.d.ts.map +1 -0
  49. package/dist/Database/providers/postgresql/__tests__/PostgreSQLCodeGenProvider.materialization.test.js +119 -0
  50. package/dist/Database/providers/postgresql/__tests__/PostgreSQLCodeGenProvider.materialization.test.js.map +1 -0
  51. package/dist/Database/providers/postgresql/__tests__/PostgreSQLHierarchyFunctions.test.d.ts +2 -0
  52. package/dist/Database/providers/postgresql/__tests__/PostgreSQLHierarchyFunctions.test.d.ts.map +1 -0
  53. package/dist/Database/providers/postgresql/__tests__/PostgreSQLHierarchyFunctions.test.js +155 -0
  54. package/dist/Database/providers/postgresql/__tests__/PostgreSQLHierarchyFunctions.test.js.map +1 -0
  55. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts +61 -2
  56. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts.map +1 -1
  57. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js +306 -3
  58. package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js.map +1 -1
  59. package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.d.ts +2 -0
  60. package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.d.ts.map +1 -0
  61. package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.js +547 -0
  62. package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.js.map +1 -0
  63. package/dist/Database/providers/sqlserver/__tests__/BaseViewRegenDecision.test.d.ts +2 -0
  64. package/dist/Database/providers/sqlserver/__tests__/BaseViewRegenDecision.test.d.ts.map +1 -0
  65. package/dist/Database/providers/sqlserver/__tests__/BaseViewRegenDecision.test.js +721 -0
  66. package/dist/Database/providers/sqlserver/__tests__/BaseViewRegenDecision.test.js.map +1 -0
  67. package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.materialization.test.d.ts +2 -0
  68. package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.materialization.test.d.ts.map +1 -0
  69. package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.materialization.test.js +78 -0
  70. package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.materialization.test.js.map +1 -0
  71. package/dist/Database/providers/sqlserver/__tests__/SQLServerHierarchyTVF.test.d.ts +2 -0
  72. package/dist/Database/providers/sqlserver/__tests__/SQLServerHierarchyTVF.test.d.ts.map +1 -0
  73. package/dist/Database/providers/sqlserver/__tests__/SQLServerHierarchyTVF.test.js +155 -0
  74. package/dist/Database/providers/sqlserver/__tests__/SQLServerHierarchyTVF.test.js.map +1 -0
  75. package/dist/Database/sql_codegen.d.ts +21 -5
  76. package/dist/Database/sql_codegen.d.ts.map +1 -1
  77. package/dist/Database/sql_codegen.js +85 -27
  78. package/dist/Database/sql_codegen.js.map +1 -1
  79. package/dist/Misc/action_subclasses_codegen.d.ts.map +1 -1
  80. package/dist/Misc/action_subclasses_codegen.js +4 -4
  81. package/dist/Misc/action_subclasses_codegen.js.map +1 -1
  82. package/dist/Misc/createNewUser.js +1 -1
  83. package/dist/Misc/createNewUser.js.map +1 -1
  84. package/dist/Misc/entity_subclasses_codegen.d.ts +44 -0
  85. package/dist/Misc/entity_subclasses_codegen.d.ts.map +1 -1
  86. package/dist/Misc/entity_subclasses_codegen.js +369 -156
  87. package/dist/Misc/entity_subclasses_codegen.js.map +1 -1
  88. package/dist/Misc/graphql_server_codegen.d.ts +4 -58
  89. package/dist/Misc/graphql_server_codegen.d.ts.map +1 -1
  90. package/dist/Misc/graphql_server_codegen.js +22 -236
  91. package/dist/Misc/graphql_server_codegen.js.map +1 -1
  92. package/dist/Misc/sql_logging.d.ts +25 -0
  93. package/dist/Misc/sql_logging.d.ts.map +1 -1
  94. package/dist/Misc/sql_logging.js +51 -8
  95. package/dist/Misc/sql_logging.js.map +1 -1
  96. package/package.json +30 -30
@@ -0,0 +1,547 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach, vi } from 'vitest';
2
+ import { EntityInfo, Metadata } from '@memberjunction/core';
3
+ import { SQLServerDialect } from '@memberjunction/sql-dialect';
4
+ import { SQLServerCodeGenProvider } from '../SQLServerCodeGenProvider.js';
5
+ import { SQLCodeGenBase } from '../../../sql_codegen.js';
6
+ function buildProviderStub(entities) {
7
+ return {
8
+ Entities: entities,
9
+ EntityByName: (entityName) => entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase()),
10
+ };
11
+ }
12
+ // ─── Recording mock connection ───────────────────────────────────────────────
13
+ class RecordingConnection {
14
+ constructor() {
15
+ this.Queries = [];
16
+ }
17
+ get Dialect() {
18
+ return new SQLServerDialect();
19
+ }
20
+ async query(sql) {
21
+ this.Queries.push(sql);
22
+ return { recordset: [] };
23
+ }
24
+ async queryWithParams() {
25
+ throw new Error('RecordingConnection: queryWithParams() must not be called by view emission');
26
+ }
27
+ async executeStoredProcedure() {
28
+ throw new Error('RecordingConnection: executeStoredProcedure() must not be called by view emission');
29
+ }
30
+ async beginTransaction() {
31
+ throw new Error('RecordingConnection: beginTransaction() must not be called by view emission');
32
+ }
33
+ }
34
+ // ─── Entity fixtures ─────────────────────────────────────────────────────────
35
+ const ORDERS_ID = 'ORDERS-ENTITY-0001';
36
+ const CUSTOMERS_ID = 'CUSTOMERS-ENTITY-0002';
37
+ const STATUSES_ID = 'STATUSES-ENTITY-0003';
38
+ const CATEGORIES_ID = 'CATEGORIES-ENTITY-0004';
39
+ function pk(entityID) {
40
+ return {
41
+ ID: `pk-${entityID}`,
42
+ EntityID: entityID,
43
+ Name: 'ID',
44
+ Type: 'uniqueidentifier',
45
+ Length: 16,
46
+ IsPrimaryKey: true,
47
+ AllowsNull: false,
48
+ AllowUpdateAPI: true,
49
+ IsVirtual: false,
50
+ AutoIncrement: false,
51
+ DefaultValue: 'newsequentialid()',
52
+ };
53
+ }
54
+ function nameField(entityID, over = {}) {
55
+ return {
56
+ ID: `name-${entityID}`,
57
+ EntityID: entityID,
58
+ Name: 'Name',
59
+ Type: 'nvarchar',
60
+ Length: 510,
61
+ IsPrimaryKey: false,
62
+ AllowsNull: false,
63
+ AllowUpdateAPI: true,
64
+ IsVirtual: false,
65
+ AutoIncrement: false,
66
+ DefaultValue: '',
67
+ IsNameField: true,
68
+ ...over,
69
+ };
70
+ }
71
+ /** FK field with everything the display-join path reads, fully resolved (no bootstrap lookup needed). */
72
+ function customerFK(over = {}) {
73
+ return {
74
+ ID: 'fk-customer',
75
+ EntityID: ORDERS_ID,
76
+ Name: 'CustomerID',
77
+ Type: 'uniqueidentifier',
78
+ Length: 16,
79
+ IsPrimaryKey: false,
80
+ AllowsNull: false, // NOT NULL → INNER JOIN
81
+ AllowUpdateAPI: true,
82
+ IsVirtual: false,
83
+ AutoIncrement: false,
84
+ DefaultValue: '',
85
+ RelatedEntityID: CUSTOMERS_ID,
86
+ RelatedEntityFieldName: 'ID',
87
+ IncludeRelatedEntityNameFieldInBaseView: true,
88
+ RelatedEntity: 'Customers',
89
+ RelatedEntityClassName: 'Customer',
90
+ RelatedEntityCodeName: 'Customer',
91
+ RelatedEntitySchemaName: 'sales',
92
+ RelatedEntityBaseTable: 'Customer',
93
+ RelatedEntityBaseView: 'vwCustomers',
94
+ RelatedEntityNameFieldMap: 'Customer', // pre-known → no metadata write-back
95
+ ...over,
96
+ };
97
+ }
98
+ function statusFK(over = {}) {
99
+ return {
100
+ ID: 'fk-status',
101
+ EntityID: ORDERS_ID,
102
+ Name: 'StatusID',
103
+ Type: 'uniqueidentifier',
104
+ Length: 16,
105
+ IsPrimaryKey: false,
106
+ AllowsNull: true, // nullable → LEFT OUTER JOIN
107
+ AllowUpdateAPI: true,
108
+ IsVirtual: false,
109
+ AutoIncrement: false,
110
+ DefaultValue: '',
111
+ RelatedEntityID: STATUSES_ID,
112
+ RelatedEntityFieldName: 'ID',
113
+ IncludeRelatedEntityNameFieldInBaseView: true,
114
+ RelatedEntity: 'Order Statuses',
115
+ RelatedEntityClassName: 'OrderStatus',
116
+ RelatedEntityCodeName: 'OrderStatus',
117
+ RelatedEntitySchemaName: 'sales',
118
+ RelatedEntityBaseTable: 'OrderStatus',
119
+ RelatedEntityBaseView: 'vwOrderStatuses',
120
+ RelatedEntityNameFieldMap: 'Status',
121
+ ...over,
122
+ };
123
+ }
124
+ function ordersEntity(over = {}, fields) {
125
+ return new EntityInfo({
126
+ ID: ORDERS_ID,
127
+ Name: 'Orders',
128
+ SchemaName: 'sales',
129
+ BaseTable: 'Order',
130
+ BaseTableCodeName: 'Order',
131
+ BaseView: 'vwOrders',
132
+ BaseViewGenerated: true,
133
+ DeleteType: 'Hard',
134
+ EntityFields: fields ?? [pk(ORDERS_ID), customerFK(), statusFK()],
135
+ EntityPermissions: [{ RoleSQLName: 'cdp_UI' }],
136
+ ...over,
137
+ });
138
+ }
139
+ function customersEntity(nameFieldOver = {}) {
140
+ return new EntityInfo({
141
+ ID: CUSTOMERS_ID,
142
+ Name: 'Customers',
143
+ SchemaName: 'sales',
144
+ BaseTable: 'Customer',
145
+ BaseTableCodeName: 'Customer',
146
+ BaseView: 'vwCustomers',
147
+ BaseViewGenerated: true,
148
+ DeleteType: 'Hard',
149
+ EntityFields: [pk(CUSTOMERS_ID), nameField(CUSTOMERS_ID, nameFieldOver)],
150
+ EntityPermissions: [],
151
+ });
152
+ }
153
+ function statusesEntity(nameFieldOver = {}) {
154
+ return new EntityInfo({
155
+ ID: STATUSES_ID,
156
+ Name: 'Order Statuses',
157
+ SchemaName: 'sales',
158
+ BaseTable: 'OrderStatus',
159
+ BaseTableCodeName: 'OrderStatus',
160
+ BaseView: 'vwOrderStatuses',
161
+ BaseViewGenerated: true,
162
+ DeleteType: 'Hard',
163
+ EntityFields: [pk(STATUSES_ID), nameField(STATUSES_ID, nameFieldOver)],
164
+ EntityPermissions: [],
165
+ });
166
+ }
167
+ // ─── Harness ─────────────────────────────────────────────────────────────────
168
+ let generator;
169
+ let pool;
170
+ let originalProvider;
171
+ function installMetadata(entities) {
172
+ Metadata.Provider = buildProviderStub(entities);
173
+ }
174
+ beforeAll(() => {
175
+ originalProvider = Metadata.Provider;
176
+ });
177
+ afterAll(() => {
178
+ Metadata.Provider = originalProvider;
179
+ });
180
+ beforeEach(() => {
181
+ generator = new SQLCodeGenBase();
182
+ generator.DBProvider = new SQLServerCodeGenProvider();
183
+ pool = new RecordingConnection();
184
+ installMetadata([]);
185
+ });
186
+ afterEach(() => {
187
+ vi.restoreAllMocks();
188
+ });
189
+ // ─────────────────────────────────────────────────────────────────────────────
190
+ describe('base view emission — plain entity', () => {
191
+ it('GM-VIEW-01: plain entity emits the exact canonical view (header, guard, SELECT alias.*, GO)', async () => {
192
+ const products = new EntityInfo({
193
+ ID: 'PRODUCTS-ENTITY-0005',
194
+ Name: 'Products',
195
+ SchemaName: 'sales',
196
+ BaseTable: 'Product',
197
+ BaseTableCodeName: 'Product',
198
+ BaseView: 'vwProducts',
199
+ BaseViewGenerated: true,
200
+ DeleteType: 'Hard',
201
+ EntityFields: [pk('PRODUCTS-ENTITY-0005'), nameField('PRODUCTS-ENTITY-0005')],
202
+ EntityPermissions: [],
203
+ });
204
+ const { viewSQL, viewPermSQL } = await generator.generateBaseViewPieces(pool, products);
205
+ expect(viewSQL).toBe(`
206
+ ------------------------------------------------------------
207
+ ----- BASE VIEW FOR ENTITY: Products
208
+ ----- SCHEMA: sales
209
+ ----- BASE TABLE: Product
210
+ ----- PRIMARY KEY: ID
211
+ ------------------------------------------------------------
212
+ IF OBJECT_ID('[sales].[vwProducts]', 'V') IS NOT NULL
213
+ DROP VIEW [sales].[vwProducts];
214
+ GO
215
+
216
+ CREATE VIEW [sales].[vwProducts]
217
+ AS
218
+ SELECT
219
+ p.*
220
+ FROM
221
+ [sales].[Product] AS p
222
+ GO`);
223
+ expect(viewPermSQL).toBe(''); // no roles → no GRANT, not even a newline
224
+ expect(pool.Queries.length).toBe(0); // emission is pure — no DB access
225
+ });
226
+ it('GM-VIEW-02: soft-delete entity appends the exact WHERE __mj_DeletedAt IS NULL clause', async () => {
227
+ const products = new EntityInfo({
228
+ ID: 'PRODUCTS-ENTITY-0005',
229
+ Name: 'Products',
230
+ SchemaName: 'sales',
231
+ BaseTable: 'Product',
232
+ BaseTableCodeName: 'Product',
233
+ BaseView: 'vwProducts',
234
+ BaseViewGenerated: true,
235
+ DeleteType: 'Soft',
236
+ EntityFields: [pk('PRODUCTS-ENTITY-0005')],
237
+ EntityPermissions: [],
238
+ });
239
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, products);
240
+ expect(viewSQL.endsWith(`FROM
241
+ [sales].[Product] AS p
242
+ WHERE
243
+ p.[__mj_DeletedAt] IS NULL
244
+ GO`)).toBe(true);
245
+ });
246
+ });
247
+ describe('base view emission — related-entity display fields (the c31d487cb bug class, generated-view side)', () => {
248
+ it('GM-VIEW-03: FKs emit display aliases + joins in exact field order; nullability picks INNER vs LEFT OUTER', async () => {
249
+ installMetadata([ordersEntity(), customersEntity(), statusesEntity()]);
250
+ const full = await generator.generateBaseView(pool, ordersEntity());
251
+ expect(full).toBe(`
252
+ ------------------------------------------------------------
253
+ ----- BASE VIEW FOR ENTITY: Orders
254
+ ----- SCHEMA: sales
255
+ ----- BASE TABLE: Order
256
+ ----- PRIMARY KEY: ID
257
+ ------------------------------------------------------------
258
+ IF OBJECT_ID('[sales].[vwOrders]', 'V') IS NOT NULL
259
+ DROP VIEW [sales].[vwOrders];
260
+ GO
261
+
262
+ CREATE VIEW [sales].[vwOrders]
263
+ AS
264
+ SELECT
265
+ o.*,
266
+ Customer_CustomerID.[Name] AS [Customer],
267
+ OrderStatus_StatusID.[Name] AS [Status]
268
+ FROM
269
+ [sales].[Order] AS o
270
+ INNER JOIN
271
+ [sales].[Customer] AS Customer_CustomerID
272
+ ON
273
+ [o].[CustomerID] = Customer_CustomerID.[ID]
274
+ LEFT OUTER JOIN
275
+ [sales].[OrderStatus] AS OrderStatus_StatusID
276
+ ON
277
+ [o].[StatusID] = OrderStatus_StatusID.[ID]
278
+ GO
279
+ GRANT SELECT ON [sales].[vwOrders] TO [cdp_UI]`);
280
+ expect(pool.Queries.length).toBe(0); // maps pre-known → zero metadata writes
281
+ });
282
+ it('GM-VIEW-04: reversing entity field order reverses BOTH the alias order and the join order', async () => {
283
+ const reordered = ordersEntity({}, [pk(ORDERS_ID), statusFK(), customerFK()]);
284
+ installMetadata([reordered, customersEntity(), statusesEntity()]);
285
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, reordered);
286
+ expect(viewSQL).toContain(`SELECT
287
+ o.*,
288
+ OrderStatus_StatusID.[Name] AS [Status],
289
+ Customer_CustomerID.[Name] AS [Customer]
290
+ FROM
291
+ [sales].[Order] AS o
292
+ LEFT OUTER JOIN
293
+ [sales].[OrderStatus] AS OrderStatus_StatusID
294
+ ON
295
+ [o].[StatusID] = OrderStatus_StatusID.[ID]
296
+ INNER JOIN
297
+ [sales].[Customer] AS Customer_CustomerID
298
+ ON
299
+ [o].[CustomerID] = Customer_CustomerID.[ID]
300
+ GO`);
301
+ });
302
+ it('GM-VIEW-05: display alias colliding with a real base-table column gets the _Virtual suffix', async () => {
303
+ const collidingCustomerColumn = {
304
+ ID: 'f-customer-text',
305
+ EntityID: ORDERS_ID,
306
+ Name: 'Customer', // physical column already named what stripID(CustomerID) yields
307
+ Type: 'nvarchar',
308
+ Length: 200,
309
+ IsPrimaryKey: false,
310
+ AllowsNull: true,
311
+ AllowUpdateAPI: true,
312
+ IsVirtual: false,
313
+ AutoIncrement: false,
314
+ DefaultValue: '',
315
+ };
316
+ const entity = ordersEntity({}, [
317
+ pk(ORDERS_ID),
318
+ collidingCustomerColumn,
319
+ customerFK({ RelatedEntityNameFieldMap: 'Customer_Virtual' }),
320
+ ]);
321
+ installMetadata([entity, customersEntity()]);
322
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
323
+ expect(viewSQL).toContain('Customer_CustomerID.[Name] AS [Customer_Virtual]');
324
+ expect(viewSQL).not.toContain('AS [Customer],');
325
+ });
326
+ it('GM-VIEW-06: an FK whose RelatedEntityNameFieldMap is not yet in the DB triggers the metadata write-back', async () => {
327
+ const entity = ordersEntity({}, [pk(ORDERS_ID), customerFK({ RelatedEntityNameFieldMap: null })]);
328
+ installMetadata([entity, customersEntity()]);
329
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
330
+ // The view still gets the display field...
331
+ expect(viewSQL).toContain('Customer_CustomerID.[Name] AS [Customer]');
332
+ // ...and CodeGen persists the computed map so the runtime metadata matches the view
333
+ expect(pool.Queries.length).toBe(1);
334
+ expect(pool.Queries[0]).toContain('spUpdateEntityFieldRelatedEntityNameFieldMap');
335
+ expect(pool.Queries[0]).toContain("'fk-customer'");
336
+ expect(pool.Queries[0]).toContain("'Customer'");
337
+ });
338
+ it('GM-VIEW-07: a view-only (virtual, non-computed) related NameField makes the join target the related BASE VIEW', async () => {
339
+ const entity = ordersEntity({}, [pk(ORDERS_ID), statusFK()]);
340
+ installMetadata([entity, statusesEntity({ IsVirtual: true, IsComputed: false })]);
341
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
342
+ expect(viewSQL).toContain(`LEFT OUTER JOIN
343
+ [sales].[vwOrderStatuses] AS OrderStatus_StatusID
344
+ ON
345
+ [o].[StatusID] = OrderStatus_StatusID.[ID]`);
346
+ expect(viewSQL).not.toContain('[sales].[OrderStatus] AS OrderStatus_StatusID');
347
+ });
348
+ it('GM-VIEW-08: an FK named exactly `ID` (shared-PK inheritance) emits NO display join — stripID() yields nothing to alias', async () => {
349
+ const inheritancePK = {
350
+ ...pk(ORDERS_ID),
351
+ RelatedEntityID: CUSTOMERS_ID,
352
+ RelatedEntityFieldName: 'ID',
353
+ IncludeRelatedEntityNameFieldInBaseView: true,
354
+ RelatedEntity: 'Customers',
355
+ RelatedEntityClassName: 'Customer',
356
+ RelatedEntityCodeName: 'Customer',
357
+ RelatedEntitySchemaName: 'sales',
358
+ RelatedEntityBaseTable: 'Customer',
359
+ RelatedEntityBaseView: 'vwCustomers',
360
+ };
361
+ const entity = ordersEntity({}, [inheritancePK]);
362
+ installMetadata([entity, customersEntity()]);
363
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
364
+ expect(viewSQL).toContain(`SELECT
365
+ o.*
366
+ FROM
367
+ [sales].[Order] AS o
368
+ GO`);
369
+ expect(viewSQL).not.toContain('JOIN');
370
+ });
371
+ it('GM-VIEW-09: self-FK with a view-only NameField is SKIPPED on SQL Server, but its root-ID TVF machinery still emits', async () => {
372
+ // A self-join back to the view being created cannot compile, so the display
373
+ // column is dropped (dialect capability canSelfJoinViewForVirtualNameField()
374
+ // = false). The recursive-FK root-ID plumbing is independent and must stay.
375
+ const categories = new EntityInfo({
376
+ ID: CATEGORIES_ID,
377
+ Name: 'Categories',
378
+ SchemaName: 'sales',
379
+ BaseTable: 'Category',
380
+ BaseTableCodeName: 'Category',
381
+ BaseView: 'vwCategories',
382
+ BaseViewGenerated: true,
383
+ DeleteType: 'Hard',
384
+ EntityFields: [
385
+ pk(CATEGORIES_ID),
386
+ nameField(CATEGORIES_ID, { IsVirtual: true }), // view-only name
387
+ {
388
+ ID: 'fk-parent',
389
+ EntityID: CATEGORIES_ID,
390
+ Name: 'ParentID',
391
+ Type: 'uniqueidentifier',
392
+ Length: 16,
393
+ IsPrimaryKey: false,
394
+ AllowsNull: true,
395
+ AllowUpdateAPI: true,
396
+ IsVirtual: false,
397
+ AutoIncrement: false,
398
+ DefaultValue: '',
399
+ RelatedEntityID: CATEGORIES_ID, // self-FK
400
+ RelatedEntityFieldName: 'ID',
401
+ IncludeRelatedEntityNameFieldInBaseView: true,
402
+ RelatedEntity: 'Categories',
403
+ RelatedEntityClassName: 'Category',
404
+ RelatedEntityCodeName: 'Category',
405
+ RelatedEntitySchemaName: 'sales',
406
+ RelatedEntityBaseTable: 'Category',
407
+ RelatedEntityBaseView: 'vwCategories',
408
+ RelatedEntityNameFieldMap: 'Parent',
409
+ Configuration: '{"Hierarchy":{"IsHierarchy":true}}',
410
+ },
411
+ ],
412
+ EntityPermissions: [],
413
+ });
414
+ installMetadata([categories]);
415
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, categories);
416
+ // No display join for the self-FK...
417
+ expect(viewSQL).not.toContain('AS [Parent]');
418
+ expect(viewSQL).not.toContain('Category_ParentID');
419
+ // ...but the recursive hierarchy columns + OUTER APPLY are present, exactly:
420
+ expect(viewSQL).toContain(`SELECT
421
+ c.*,
422
+ hier_ParentID.RootID AS [RootParentID],
423
+ hier_ParentID.Depth AS [ParentIDDepth],
424
+ hier_ParentID.Path AS [ParentIDPath],
425
+ hier_ParentID.IsLeaf AS [ParentIDIsLeaf],
426
+ hier_ParentID.ChildCount AS [ParentIDChildCount]
427
+ FROM
428
+ [sales].[Category] AS c
429
+ OUTER APPLY
430
+ [sales].[fnCategoryParentID_GetHierarchyMeta]([c].[ID], [c].[ParentID]) AS hier_ParentID
431
+ GO`);
432
+ });
433
+ });
434
+ describe('base view emission — geo virtual columns', () => {
435
+ function sitesEntity(fields) {
436
+ return new EntityInfo({
437
+ ID: 'SITES-ENTITY-0006',
438
+ Name: 'Sites',
439
+ SchemaName: 'sales',
440
+ BaseTable: 'Site',
441
+ BaseTableCodeName: 'Site',
442
+ BaseView: 'vwSites',
443
+ BaseViewGenerated: true,
444
+ DeleteType: 'Hard',
445
+ SupportsGeoCoding: true,
446
+ EntityFields: fields,
447
+ EntityPermissions: [],
448
+ });
449
+ }
450
+ it('GM-VIEW-10: geo entity without native lat/lng joins vwRecordGeoCodes and aliases __mj_Latitude/__mj_Longitude', async () => {
451
+ // NOTE (cosmetic quirk, pinned as current behavior): when an entity has geo
452
+ // columns but NO FK display fields, the geo select block is the first entry
453
+ // in relatedFieldsSelect and carries no leading newline — so the first geo
454
+ // alias lands on the SAME line as `s.*,`. Valid SQL, odd formatting. With FK
455
+ // display fields present the block is appended after ',\n' and aligns
456
+ // normally. A formatting fix here would change every geo entity's stored
457
+ // view text and force a one-time regeneration wave — hence pinned, not fixed.
458
+ const entity = sitesEntity([pk('SITES-ENTITY-0006')]);
459
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
460
+ expect(viewSQL).toContain(`SELECT
461
+ s.*, __mj_rgc.[Latitude] AS [__mj_Latitude],
462
+ __mj_rgc.[Longitude] AS [__mj_Longitude]
463
+ FROM
464
+ [sales].[Site] AS s
465
+ LEFT OUTER JOIN
466
+ [__mj].[vwRecordGeoCodes] AS __mj_rgc
467
+ ON
468
+ __mj_rgc.[EntityID] = 'SITES-ENTITY-0006'
469
+ AND __mj_rgc.[RecordID] = CAST([s].[ID] AS NVARCHAR(450))
470
+ AND __mj_rgc.[LocationType] = 'Primary'
471
+ GO`);
472
+ });
473
+ it('GM-VIEW-10b: with FK display fields present, the geo block is appended after ",\\n" and aligns on its own lines', async () => {
474
+ const entity = new EntityInfo({
475
+ ID: 'SITES-ENTITY-0006',
476
+ Name: 'Sites',
477
+ SchemaName: 'sales',
478
+ BaseTable: 'Site',
479
+ BaseTableCodeName: 'Site',
480
+ BaseView: 'vwSites',
481
+ BaseViewGenerated: true,
482
+ DeleteType: 'Hard',
483
+ SupportsGeoCoding: true,
484
+ EntityFields: [pk('SITES-ENTITY-0006'), customerFK({ EntityID: 'SITES-ENTITY-0006' })],
485
+ EntityPermissions: [],
486
+ });
487
+ installMetadata([entity, customersEntity()]);
488
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
489
+ expect(viewSQL).toContain(`SELECT
490
+ s.*,
491
+ Customer_CustomerID.[Name] AS [Customer],
492
+ __mj_rgc.[Latitude] AS [__mj_Latitude],
493
+ __mj_rgc.[Longitude] AS [__mj_Longitude]
494
+ FROM`);
495
+ });
496
+ it('GM-VIEW-11: geo entity WITH native lat/lng aliases the physical columns directly — no RecordGeoCodes join', async () => {
497
+ const entity = sitesEntity([
498
+ pk('SITES-ENTITY-0006'),
499
+ {
500
+ ID: 'f-lat', EntityID: 'SITES-ENTITY-0006', Name: 'Lat', Type: 'decimal', Length: 9,
501
+ IsPrimaryKey: false, AllowsNull: true, AllowUpdateAPI: true, IsVirtual: false,
502
+ AutoIncrement: false, DefaultValue: '', ExtendedType: 'GeoLatitude',
503
+ },
504
+ {
505
+ ID: 'f-lng', EntityID: 'SITES-ENTITY-0006', Name: 'Lng', Type: 'decimal', Length: 9,
506
+ IsPrimaryKey: false, AllowsNull: true, AllowUpdateAPI: true, IsVirtual: false,
507
+ AutoIncrement: false, DefaultValue: '', ExtendedType: 'GeoLongitude',
508
+ },
509
+ ]);
510
+ const { viewSQL } = await generator.generateBaseViewPieces(pool, entity);
511
+ // Same first-line quirk as GM-VIEW-10: no FK display fields → the first geo
512
+ // alias shares the `s.*,` line. Pinned as current behavior.
513
+ expect(viewSQL).toContain(`SELECT
514
+ s.*, [s].[Lat] AS [__mj_Latitude],
515
+ [s].[Lng] AS [__mj_Longitude]
516
+ FROM
517
+ [sales].[Site] AS s
518
+ GO`);
519
+ expect(viewSQL).not.toContain('vwRecordGeoCodes');
520
+ });
521
+ });
522
+ describe('base view emission — GRANT permissions attached to the view', () => {
523
+ it('GM-VIEW-12: multiple roles collapse into ONE GRANT statement, in permission order', async () => {
524
+ const entity = ordersEntity({
525
+ EntityPermissions: [{ RoleSQLName: 'cdp_UI' }, { RoleSQLName: 'cdp_Developer' }],
526
+ }, [pk(ORDERS_ID)]);
527
+ installMetadata([entity]);
528
+ const { viewPermSQL } = await generator.generateBaseViewPieces(pool, entity);
529
+ expect(viewPermSQL).toBe('\nGRANT SELECT ON [sales].[vwOrders] TO [cdp_UI], [cdp_Developer]');
530
+ });
531
+ it('GM-VIEW-13: a permission row without a RoleSQLName is skipped entirely', async () => {
532
+ const entity = ordersEntity({
533
+ EntityPermissions: [{ RoleSQLName: '' }, { RoleSQLName: 'cdp_UI' }],
534
+ }, [pk(ORDERS_ID)]);
535
+ installMetadata([entity]);
536
+ const { viewPermSQL } = await generator.generateBaseViewPieces(pool, entity);
537
+ expect(viewPermSQL).toBe('\nGRANT SELECT ON [sales].[vwOrders] TO [cdp_UI]');
538
+ });
539
+ it('GM-VIEW-14: generateBaseView concatenates DDL + GRANT so the GRANT sits after the GO batch separator', async () => {
540
+ const entity = ordersEntity({}, [pk(ORDERS_ID)]);
541
+ installMetadata([entity]);
542
+ const full = await generator.generateBaseView(pool, entity);
543
+ expect(full.endsWith('GO\nGRANT SELECT ON [sales].[vwOrders] TO [cdp_UI]')).toBe(true);
544
+ expect(full).not.toContain('GOGRANT');
545
+ });
546
+ });
547
+ //# sourceMappingURL=BaseViewEmissionGoldenMaster.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseViewEmissionGoldenMaster.test.js","sourceRoot":"","sources":["../../../../../src/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BaseViewRegenDecision.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseViewRegenDecision.test.d.ts","sourceRoot":"","sources":["../../../../../src/Database/providers/sqlserver/__tests__/BaseViewRegenDecision.test.ts"],"names":[],"mappings":""}