@memberjunction/core 3.4.0 → 4.0.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 (119) hide show
  1. package/dist/__tests__/mocks/TestMetadataProvider.d.ts +45 -0
  2. package/dist/__tests__/mocks/TestMetadataProvider.d.ts.map +1 -0
  3. package/dist/__tests__/mocks/TestMetadataProvider.js +217 -0
  4. package/dist/__tests__/mocks/TestMetadataProvider.js.map +1 -0
  5. package/dist/__tests__/providerBase.concurrency.test.d.ts +10 -0
  6. package/dist/__tests__/providerBase.concurrency.test.d.ts.map +1 -0
  7. package/dist/__tests__/providerBase.concurrency.test.js +253 -0
  8. package/dist/__tests__/providerBase.concurrency.test.js.map +1 -0
  9. package/dist/__tests__/providerBase.refresh.test.d.ts +10 -0
  10. package/dist/__tests__/providerBase.refresh.test.d.ts.map +1 -0
  11. package/dist/__tests__/providerBase.refresh.test.js +161 -0
  12. package/dist/__tests__/providerBase.refresh.test.js.map +1 -0
  13. package/dist/__tests__/setup.d.ts +5 -0
  14. package/dist/__tests__/setup.d.ts.map +1 -0
  15. package/dist/__tests__/setup.js +17 -0
  16. package/dist/__tests__/setup.js.map +1 -0
  17. package/dist/generic/InMemoryLocalStorageProvider.d.ts +1 -1
  18. package/dist/generic/InMemoryLocalStorageProvider.js +2 -6
  19. package/dist/generic/InMemoryLocalStorageProvider.js.map +1 -1
  20. package/dist/generic/QueryCache.d.ts +1 -1
  21. package/dist/generic/QueryCache.js +6 -10
  22. package/dist/generic/QueryCache.js.map +1 -1
  23. package/dist/generic/QueryCacheConfig.js +1 -2
  24. package/dist/generic/RegisterForStartup.d.ts +2 -2
  25. package/dist/generic/RegisterForStartup.js +7 -12
  26. package/dist/generic/RegisterForStartup.js.map +1 -1
  27. package/dist/generic/applicationInfo.d.ts +3 -3
  28. package/dist/generic/applicationInfo.js +4 -10
  29. package/dist/generic/applicationInfo.js.map +1 -1
  30. package/dist/generic/authEvaluator.d.ts +1 -1
  31. package/dist/generic/authEvaluator.js +4 -8
  32. package/dist/generic/authEvaluator.js.map +1 -1
  33. package/dist/generic/authTypes.js +1 -4
  34. package/dist/generic/authTypes.js.map +1 -1
  35. package/dist/generic/baseEngine.d.ts +5 -5
  36. package/dist/generic/baseEngine.js +51 -56
  37. package/dist/generic/baseEngine.js.map +1 -1
  38. package/dist/generic/baseEngineRegistry.js +13 -17
  39. package/dist/generic/baseEngineRegistry.js.map +1 -1
  40. package/dist/generic/baseEntity.d.ts +5 -5
  41. package/dist/generic/baseEntity.js +103 -113
  42. package/dist/generic/baseEntity.js.map +1 -1
  43. package/dist/generic/baseInfo.js +3 -7
  44. package/dist/generic/baseInfo.js.map +1 -1
  45. package/dist/generic/compositeKey.d.ts +2 -2
  46. package/dist/generic/compositeKey.js +5 -11
  47. package/dist/generic/compositeKey.js.map +1 -1
  48. package/dist/generic/databaseProviderBase.d.ts +2 -2
  49. package/dist/generic/databaseProviderBase.js +2 -6
  50. package/dist/generic/databaseProviderBase.js.map +1 -1
  51. package/dist/generic/entityInfo.d.ts +5 -5
  52. package/dist/generic/entityInfo.js +86 -106
  53. package/dist/generic/entityInfo.js.map +1 -1
  54. package/dist/generic/explorerNavigationItem.d.ts +1 -1
  55. package/dist/generic/explorerNavigationItem.js +2 -6
  56. package/dist/generic/explorerNavigationItem.js.map +1 -1
  57. package/dist/generic/graphqlTypeNames.d.ts +1 -1
  58. package/dist/generic/graphqlTypeNames.js +4 -9
  59. package/dist/generic/graphqlTypeNames.js.map +1 -1
  60. package/dist/generic/interfaces.d.ts +51 -12
  61. package/dist/generic/interfaces.d.ts.map +1 -1
  62. package/dist/generic/interfaces.js +15 -30
  63. package/dist/generic/interfaces.js.map +1 -1
  64. package/dist/generic/libraryInfo.d.ts +1 -1
  65. package/dist/generic/libraryInfo.js +2 -6
  66. package/dist/generic/libraryInfo.js.map +1 -1
  67. package/dist/generic/localCacheManager.d.ts +2 -2
  68. package/dist/generic/localCacheManager.js +44 -48
  69. package/dist/generic/localCacheManager.js.map +1 -1
  70. package/dist/generic/logging.d.ts.map +1 -1
  71. package/dist/generic/logging.js +54 -67
  72. package/dist/generic/logging.js.map +1 -1
  73. package/dist/generic/metadata.d.ts +10 -10
  74. package/dist/generic/metadata.js +17 -21
  75. package/dist/generic/metadata.js.map +1 -1
  76. package/dist/generic/metadataUtil.d.ts +1 -1
  77. package/dist/generic/metadataUtil.js +3 -7
  78. package/dist/generic/metadataUtil.js.map +1 -1
  79. package/dist/generic/providerBase.d.ts +18 -12
  80. package/dist/generic/providerBase.d.ts.map +1 -1
  81. package/dist/generic/providerBase.js +130 -130
  82. package/dist/generic/providerBase.js.map +1 -1
  83. package/dist/generic/queryInfo.d.ts +5 -5
  84. package/dist/generic/queryInfo.js +21 -30
  85. package/dist/generic/queryInfo.js.map +1 -1
  86. package/dist/generic/queryInfoInterfaces.js +1 -2
  87. package/dist/generic/queryInfoInterfaces.js.map +1 -1
  88. package/dist/generic/querySQLFilters.js +5 -10
  89. package/dist/generic/querySQLFilters.js.map +1 -1
  90. package/dist/generic/runQuery.d.ts +2 -2
  91. package/dist/generic/runQuery.js +5 -9
  92. package/dist/generic/runQuery.js.map +1 -1
  93. package/dist/generic/runQuerySQLFilterImplementations.d.ts +1 -1
  94. package/dist/generic/runQuerySQLFilterImplementations.js +4 -8
  95. package/dist/generic/runQuerySQLFilterImplementations.js.map +1 -1
  96. package/dist/generic/runReport.d.ts +2 -2
  97. package/dist/generic/runReport.js +5 -9
  98. package/dist/generic/runReport.js.map +1 -1
  99. package/dist/generic/securityInfo.d.ts +2 -2
  100. package/dist/generic/securityInfo.js +10 -20
  101. package/dist/generic/securityInfo.js.map +1 -1
  102. package/dist/generic/telemetryManager.js +20 -32
  103. package/dist/generic/telemetryManager.js.map +1 -1
  104. package/dist/generic/transactionGroup.d.ts +1 -1
  105. package/dist/generic/transactionGroup.d.ts.map +1 -1
  106. package/dist/generic/transactionGroup.js +11 -19
  107. package/dist/generic/transactionGroup.js.map +1 -1
  108. package/dist/generic/util.js +15 -31
  109. package/dist/generic/util.js.map +1 -1
  110. package/dist/index.d.ts +34 -34
  111. package/dist/index.js +45 -63
  112. package/dist/index.js.map +1 -1
  113. package/dist/views/runView.d.ts +3 -3
  114. package/dist/views/runView.js +6 -11
  115. package/dist/views/runView.js.map +1 -1
  116. package/dist/views/viewInfo.d.ts +3 -3
  117. package/dist/views/viewInfo.js +10 -17
  118. package/dist/views/viewInfo.js.map +1 -1
  119. package/package.json +11 -10
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Test Mock for ProviderBase
3
+ * Provides minimal implementation for testing metadata refresh logic
4
+ * Does NOT require database connection
5
+ */
6
+ import { ProviderBase } from '../../generic/providerBase.js';
7
+ import { IMetadataProvider, ProviderType, PotentialDuplicateRequest, PotentialDuplicateResponse, DatasetResultType, DatasetStatusResultType, DatasetItemFilterType, ILocalStorageProvider, EntityMergeOptions } from '../../generic/interfaces.js';
8
+ import { UserInfo } from '../../generic/securityInfo.js';
9
+ import { RecordDependency, RecordMergeRequest, RecordMergeResult } from '../../generic/entityInfo.js';
10
+ import { CompositeKey } from '../../generic/compositeKey.js';
11
+ import { TransactionGroupBase } from '../../generic/transactionGroup.js';
12
+ export declare class TestMetadataProvider extends ProviderBase {
13
+ private _allowRefresh;
14
+ private _mockMetadata;
15
+ private _getMetadataCallCount;
16
+ private _mockDelay;
17
+ constructor();
18
+ protected get AllowRefresh(): boolean;
19
+ setAllowRefresh(value: boolean): void;
20
+ get ProviderType(): ProviderType;
21
+ get DatabaseConnection(): any;
22
+ getCallCount(): number;
23
+ resetCallCount(): void;
24
+ setMockDelay(ms: number): void;
25
+ setMockMetadata(metadata: any): void;
26
+ GetEntityRecordName(): Promise<string>;
27
+ GetEntityRecordNames(): Promise<any[]>;
28
+ GetRecordFavoriteStatus(): Promise<boolean>;
29
+ SetRecordFavoriteStatus(): Promise<void>;
30
+ protected InternalRunView(): Promise<any>;
31
+ protected InternalRunViews(): Promise<any[]>;
32
+ protected InternalRunQuery(): Promise<any>;
33
+ protected InternalRunQueries(): Promise<any[]>;
34
+ protected GetCurrentUser(): Promise<UserInfo>;
35
+ GetRecordDependencies(entityName: string, compositeKey: CompositeKey, contextUser?: UserInfo): Promise<RecordDependency[]>;
36
+ GetRecordDuplicates(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>;
37
+ MergeRecords(request: RecordMergeRequest, contextUser?: UserInfo, options?: EntityMergeOptions): Promise<RecordMergeResult>;
38
+ GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[], contextUser?: UserInfo, providerToUse?: IMetadataProvider): Promise<DatasetResultType>;
39
+ GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[], contextUser?: UserInfo, providerToUse?: IMetadataProvider): Promise<DatasetStatusResultType>;
40
+ get InstanceConnectionString(): string;
41
+ CreateTransactionGroup(): Promise<TransactionGroupBase>;
42
+ get LocalStorageProvider(): ILocalStorageProvider;
43
+ protected get Metadata(): IMetadataProvider;
44
+ }
45
+ //# sourceMappingURL=TestMetadataProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestMetadataProvider.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/TestMetadataProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,yBAAyB,EACzB,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,qBAAa,oBAAqB,SAAQ,YAAY;IAClD,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,UAAU,CAAO;;IAMzB,SAAS,KAAK,YAAY,IAAI,OAAO,CAEpC;IAEM,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI5C,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED,IAAW,kBAAkB,IAAI,GAAG,CAEnC;IAEM,YAAY,IAAI,MAAM;IAItB,cAAc,IAAI,IAAI;IAItB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAQ9B,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAItC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAItC,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI3C,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;cAIrC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;cAI/B,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;cAIlC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC;cAIhC,kBAAkB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;cAKpC,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC;IAYtC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI1H,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAOnH,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU3H,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,qBAAqB,EAAE,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0FnK,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,qBAAqB,EAAE,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAW5L,IAAW,wBAAwB,IAAI,MAAM,CAE5C;IAEY,sBAAsB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAIpE,IAAW,oBAAoB,IAAI,qBAAqB,CAMvD;IAED,SAAS,KAAK,QAAQ,IAAI,iBAAiB,CAE1C;CACJ"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ /**
3
+ * Test Mock for ProviderBase
4
+ * Provides minimal implementation for testing metadata refresh logic
5
+ * Does NOT require database connection
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.TestMetadataProvider = void 0;
9
+ const providerBase_1 = require("../../generic/providerBase.js");
10
+ const interfaces_1 = require("../../generic/interfaces.js");
11
+ const securityInfo_1 = require("../../generic/securityInfo.js");
12
+ const entityInfo_1 = require("../../generic/entityInfo.js");
13
+ class TestMetadataProvider extends providerBase_1.ProviderBase {
14
+ constructor() {
15
+ super();
16
+ this._allowRefresh = true;
17
+ this._mockMetadata = null;
18
+ this._getMetadataCallCount = 0;
19
+ this._mockDelay = 100; // milliseconds
20
+ }
21
+ get AllowRefresh() {
22
+ return this._allowRefresh;
23
+ }
24
+ setAllowRefresh(value) {
25
+ this._allowRefresh = value;
26
+ }
27
+ get ProviderType() {
28
+ return 'Database';
29
+ }
30
+ get DatabaseConnection() {
31
+ return {}; // Mock connection
32
+ }
33
+ getCallCount() {
34
+ return this._getMetadataCallCount;
35
+ }
36
+ resetCallCount() {
37
+ this._getMetadataCallCount = 0;
38
+ }
39
+ setMockDelay(ms) {
40
+ this._mockDelay = ms;
41
+ }
42
+ setMockMetadata(metadata) {
43
+ this._mockMetadata = metadata;
44
+ }
45
+ // Don't override GetAllMetadata() - let the base class handle it
46
+ // It will call our GetDatasetByName() which properly formats the data
47
+ // Stub implementations for other provider methods
48
+ async GetEntityRecordName() {
49
+ return 'Test Record';
50
+ }
51
+ async GetEntityRecordNames() {
52
+ return [];
53
+ }
54
+ async GetRecordFavoriteStatus() {
55
+ return false;
56
+ }
57
+ async SetRecordFavoriteStatus() {
58
+ // No-op
59
+ }
60
+ async InternalRunView() {
61
+ return { Success: true, Results: [], RowCount: 0, TotalRowCount: 0, ExecutionTime: 0, ErrorMessage: '', UserViewRunID: '' };
62
+ }
63
+ async InternalRunViews() {
64
+ return [];
65
+ }
66
+ async InternalRunQuery() {
67
+ return { Success: true, Results: [], RowCount: 0, TotalRowCount: 0, ExecutionTime: 0, ErrorMessage: '', QueryID: '', QueryName: '' };
68
+ }
69
+ async InternalRunQueries() {
70
+ return [];
71
+ }
72
+ // Required abstract methods (minimal stubs for testing - no database needed)
73
+ async GetCurrentUser() {
74
+ // Return a minimal UserInfo object that satisfies TypeScript
75
+ const user = new securityInfo_1.UserInfo();
76
+ user.ID = 'test-user-id';
77
+ user.Name = 'Test User';
78
+ user.Email = 'test@example.com';
79
+ user.FirstName = 'Test';
80
+ user.LastName = 'User';
81
+ user.IsActive = true;
82
+ return user;
83
+ }
84
+ async GetRecordDependencies(entityName, compositeKey, contextUser) {
85
+ return [];
86
+ }
87
+ async GetRecordDuplicates(params, contextUser) {
88
+ const response = new interfaces_1.PotentialDuplicateResponse();
89
+ response.Status = 'Success';
90
+ response.PotentialDuplicateResult = [];
91
+ return response;
92
+ }
93
+ async MergeRecords(request, contextUser, options) {
94
+ const result = new entityInfo_1.RecordMergeResult();
95
+ result.Success = true;
96
+ result.OverallStatus = 'Success';
97
+ result.RecordStatus = [];
98
+ result.RecordMergeLogID = null;
99
+ result.Request = request;
100
+ return result;
101
+ }
102
+ async GetDatasetByName(datasetName, itemFilters, contextUser, providerToUse) {
103
+ // Simulate the MJ_Metadata dataset structure that GetAllMetadata expects
104
+ if (datasetName === 'MJ_Metadata') {
105
+ // Track calls and simulate delay
106
+ this._getMetadataCallCount++;
107
+ await new Promise(resolve => setTimeout(resolve, this._mockDelay));
108
+ // Use mock data if set, otherwise use default
109
+ const baseData = this._mockMetadata || {
110
+ Applications: [],
111
+ Entities: [
112
+ {
113
+ ID: `entity-${this._getMetadataCallCount}`,
114
+ Name: `Test Entity ${this._getMetadataCallCount}`,
115
+ SchemaName: 'dbo',
116
+ BaseView: `vwTestEntity${this._getMetadataCallCount}`,
117
+ BaseTable: `TestEntity${this._getMetadataCallCount}`,
118
+ EntityFields: [
119
+ { ID: `f${this._getMetadataCallCount}-1`, EntityID: `entity-${this._getMetadataCallCount}`, Name: 'ID', Type: 'uniqueidentifier', IsPrimaryKey: true, Sequence: 1 },
120
+ { ID: `f${this._getMetadataCallCount}-2`, EntityID: `entity-${this._getMetadataCallCount}`, Name: 'Name', Type: 'nvarchar', IsPrimaryKey: false, Sequence: 2 },
121
+ ]
122
+ },
123
+ ],
124
+ EntityFields: [
125
+ { ID: `f${this._getMetadataCallCount}-1`, EntityID: `entity-${this._getMetadataCallCount}`, Name: 'ID', Type: 'uniqueidentifier', IsPrimaryKey: true, Sequence: 1 },
126
+ { ID: `f${this._getMetadataCallCount}-2`, EntityID: `entity-${this._getMetadataCallCount}`, Name: 'Name', Type: 'nvarchar', IsPrimaryKey: false, Sequence: 2 },
127
+ ],
128
+ EntityFieldValues: [],
129
+ EntityPermissions: [],
130
+ EntityRelationships: [],
131
+ EntitySettings: [],
132
+ ApplicationEntities: [],
133
+ ApplicationSettings: [],
134
+ Roles: [],
135
+ RowLevelSecurityFilters: [],
136
+ AuditLogTypes: [],
137
+ Authorizations: [],
138
+ QueryCategories: [],
139
+ Queries: [],
140
+ QueryFields: [],
141
+ QueryPermissions: [],
142
+ QueryEntities: [],
143
+ QueryParameters: [],
144
+ EntityDocumentTypes: [],
145
+ Libraries: [],
146
+ ExplorerNavigationItems: [],
147
+ };
148
+ return {
149
+ DatasetID: 'mock-dataset-id',
150
+ DatasetName: 'MJ_Metadata',
151
+ Success: true,
152
+ Status: 'Success',
153
+ LatestUpdateDate: new Date(),
154
+ Results: [
155
+ { Code: 'Applications', EntityName: 'Applications', EntityID: '1', Results: baseData.Applications || [] },
156
+ { Code: 'Entities', EntityName: 'Entities', EntityID: '2', Results: baseData.Entities || [] },
157
+ { Code: 'EntityFields', EntityName: 'Entity Fields', EntityID: '3', Results: baseData.EntityFields || [] },
158
+ { Code: 'EntityFieldValues', EntityName: 'Entity Field Values', EntityID: '4', Results: baseData.EntityFieldValues || [] },
159
+ { Code: 'EntityPermissions', EntityName: 'Entity Permissions', EntityID: '5', Results: baseData.EntityPermissions || [] },
160
+ { Code: 'EntityRelationships', EntityName: 'Entity Relationships', EntityID: '6', Results: baseData.EntityRelationships || [] },
161
+ { Code: 'EntitySettings', EntityName: 'Entity Settings', EntityID: '7', Results: baseData.EntitySettings || [] },
162
+ { Code: 'ApplicationEntities', EntityName: 'Application Entities', EntityID: '8', Results: baseData.ApplicationEntities || [] },
163
+ { Code: 'ApplicationSettings', EntityName: 'Application Settings', EntityID: '9', Results: baseData.ApplicationSettings || [] },
164
+ { Code: 'Roles', EntityName: 'Roles', EntityID: '10', Results: baseData.Roles || [] },
165
+ { Code: 'RowLevelSecurityFilters', EntityName: 'Row Level Security Filters', EntityID: '11', Results: baseData.RowLevelSecurityFilters || [] },
166
+ { Code: 'AuditLogTypes', EntityName: 'Audit Log Types', EntityID: '12', Results: baseData.AuditLogTypes || [] },
167
+ { Code: 'Authorizations', EntityName: 'Authorizations', EntityID: '13', Results: baseData.Authorizations || [] },
168
+ { Code: 'QueryCategories', EntityName: 'Query Categories', EntityID: '14', Results: baseData.QueryCategories || [] },
169
+ { Code: 'Queries', EntityName: 'Queries', EntityID: '15', Results: baseData.Queries || [] },
170
+ { Code: 'QueryFields', EntityName: 'Query Fields', EntityID: '16', Results: baseData.QueryFields || [] },
171
+ { Code: 'QueryPermissions', EntityName: 'Query Permissions', EntityID: '17', Results: baseData.QueryPermissions || [] },
172
+ { Code: 'QueryEntities', EntityName: 'Query Entities', EntityID: '18', Results: baseData.QueryEntities || [] },
173
+ { Code: 'QueryParameters', EntityName: 'Query Parameters', EntityID: '19', Results: baseData.QueryParameters || [] },
174
+ { Code: 'EntityDocumentTypes', EntityName: 'Entity Document Types', EntityID: '20', Results: baseData.EntityDocumentTypes || [] },
175
+ { Code: 'Libraries', EntityName: 'Libraries', EntityID: '21', Results: baseData.Libraries || [] },
176
+ { Code: 'ExplorerNavigationItems', EntityName: 'Explorer Navigation Items', EntityID: '22', Results: baseData.ExplorerNavigationItems || [] },
177
+ ],
178
+ };
179
+ }
180
+ return {
181
+ DatasetID: 'mock-dataset-id',
182
+ DatasetName: datasetName,
183
+ Success: true,
184
+ Status: 'Success',
185
+ LatestUpdateDate: new Date(),
186
+ Results: []
187
+ };
188
+ }
189
+ async GetDatasetStatusByName(datasetName, itemFilters, contextUser, providerToUse) {
190
+ return {
191
+ DatasetID: 'mock-dataset-id',
192
+ DatasetName: datasetName,
193
+ Success: true,
194
+ Status: 'Ready',
195
+ LatestUpdateDate: new Date(),
196
+ EntityUpdateDates: []
197
+ };
198
+ }
199
+ get InstanceConnectionString() {
200
+ return 'mock://test-connection';
201
+ }
202
+ async CreateTransactionGroup() {
203
+ throw new Error('TransactionGroup not implemented in test mock - not needed for metadata tests');
204
+ }
205
+ get LocalStorageProvider() {
206
+ return {
207
+ GetItem: async (key) => null,
208
+ SetItem: async (key, value) => { },
209
+ Remove: async (key) => { }
210
+ };
211
+ }
212
+ get Metadata() {
213
+ return this;
214
+ }
215
+ }
216
+ exports.TestMetadataProvider = TestMetadataProvider;
217
+ //# sourceMappingURL=TestMetadataProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestMetadataProvider.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/TestMetadataProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Concurrency Tests for ProviderBase
3
+ *
4
+ * Purpose: Test behavior under concurrent access patterns
5
+ * These tests will FAIL before the atomic update fix and PASS after
6
+ *
7
+ * Related: METADATA_THREAD_SAFETY_IMPLEMENTATION.md - Phase 3, Task 3.1
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=providerBase.concurrency.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerBase.concurrency.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/providerBase.concurrency.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ /**
3
+ * Concurrency Tests for ProviderBase
4
+ *
5
+ * Purpose: Test behavior under concurrent access patterns
6
+ * These tests will FAIL before the atomic update fix and PASS after
7
+ *
8
+ * Related: METADATA_THREAD_SAFETY_IMPLEMENTATION.md - Phase 3, Task 3.1
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const interfaces_1 = require("../generic/interfaces.js");
12
+ const TestMetadataProvider_1 = require("./mocks/TestMetadataProvider.js");
13
+ describe('ProviderBase Concurrency Tests', () => {
14
+ let provider;
15
+ let testConfig;
16
+ beforeEach(() => {
17
+ provider = new TestMetadataProvider_1.TestMetadataProvider();
18
+ testConfig = new interfaces_1.ProviderConfigDataBase({}, '__mj', [], [], true);
19
+ });
20
+ describe('Parallel Config() Calls', () => {
21
+ test('Multiple parallel Config() calls complete successfully', async () => {
22
+ /**
23
+ * Simulates the actual bug scenario: parallel operations triggering Config()
24
+ * Expected behavior after fix: All complete successfully with valid metadata
25
+ */
26
+ provider.resetCallCount();
27
+ // Start 10 parallel Config() calls
28
+ const promises = Array(10).fill(0).map(() => provider.Config(testConfig));
29
+ // All should complete without errors
30
+ const results = await Promise.all(promises);
31
+ // Verify results
32
+ expect(results.every(r => r === true)).toBe(true);
33
+ // Metadata should be populated (not empty)
34
+ expect(provider.Entities).toBeDefined();
35
+ expect(provider.Entities.length).toBeGreaterThan(0);
36
+ // All entities should have Fields defined
37
+ for (const entity of provider.Entities) {
38
+ expect(entity.Fields).toBeDefined();
39
+ expect(entity.Fields.length).toBeGreaterThan(0);
40
+ }
41
+ console.log(`GetAllMetadata called ${provider.getCallCount()} times for 10 parallel Config() calls`);
42
+ });
43
+ test('Parallel Config() with different configs', async () => {
44
+ /**
45
+ * Tests concurrent configs with different settings
46
+ * Ensures last config wins but no corruption occurs
47
+ */
48
+ const configs = [
49
+ new interfaces_1.ProviderConfigDataBase({}, '__mj1', [], [], true),
50
+ new interfaces_1.ProviderConfigDataBase({}, '__mj2', [], [], true),
51
+ new interfaces_1.ProviderConfigDataBase({}, '__mj3', [], [], true),
52
+ ];
53
+ const results = await Promise.all(configs.map(config => provider.Config(config)));
54
+ expect(results.every(r => r === true)).toBe(true);
55
+ expect(provider.Entities.length).toBeGreaterThan(0);
56
+ });
57
+ });
58
+ describe('Reading Metadata During Refresh', () => {
59
+ test('Reading Entities during refresh returns valid data', async () => {
60
+ /**
61
+ * CRITICAL TEST: This documents the core issue
62
+ * Before fix: Readers may see empty metadata during refresh
63
+ * After fix: Readers see old metadata until refresh completes
64
+ */
65
+ // Pre-populate with initial metadata
66
+ await provider.Config(testConfig);
67
+ expect(provider.Entities.length).toBeGreaterThan(0);
68
+ const initialEntityCount = provider.Entities.length;
69
+ // Start a refresh (don't await yet)
70
+ const refreshPromise = provider.Config(testConfig);
71
+ // While refresh is in progress, try to read metadata
72
+ const readsDuringRefresh = [];
73
+ const readPromises = [];
74
+ // Read multiple times during the refresh window
75
+ for (let i = 0; i < 5; i++) {
76
+ readPromises.push((async () => {
77
+ await new Promise(resolve => setTimeout(resolve, i * 20));
78
+ const entities = provider.Entities;
79
+ readsDuringRefresh.push(entities?.length ?? -1);
80
+ // CRITICAL: Should NEVER be undefined or empty after initial load
81
+ expect(entities).toBeDefined();
82
+ expect(Array.isArray(entities)).toBe(true);
83
+ // After fix: Should always have data (old or new)
84
+ // Before fix: Might be empty array
85
+ if (entities.length === 0) {
86
+ console.warn('WARNING: Saw empty entities during refresh (this is the bug)');
87
+ }
88
+ })());
89
+ }
90
+ // Wait for refresh to complete
91
+ await Promise.all([refreshPromise, ...readPromises]);
92
+ // After refresh, should definitely have data
93
+ expect(provider.Entities.length).toBeGreaterThan(0);
94
+ console.log('Entity counts during refresh:', readsDuringRefresh);
95
+ console.log('Final entity count:', provider.Entities.length);
96
+ });
97
+ test('GetEntityObject during refresh does not fail', async () => {
98
+ /**
99
+ * Simulates QueryEntity trying to create child entities during parallel saves
100
+ * This is the exact scenario causing "Entity not found in metadata" errors
101
+ */
102
+ await provider.Config(testConfig);
103
+ // Start refresh
104
+ const refreshPromise = provider.Config(testConfig);
105
+ // Try to access entity metadata during refresh
106
+ await new Promise(resolve => setTimeout(resolve, 50));
107
+ // Should be able to read Entities array
108
+ const entities = provider.Entities;
109
+ expect(entities).toBeDefined();
110
+ if (entities.length > 0) {
111
+ // Should be able to find entity
112
+ const entity = entities.find(e => e.Name.includes('Test Entity'));
113
+ expect(entity).toBeDefined();
114
+ // Should be able to access Fields
115
+ if (entity) {
116
+ expect(entity.Fields).toBeDefined();
117
+ expect(entity.Fields.length).toBeGreaterThan(0);
118
+ }
119
+ }
120
+ await refreshPromise;
121
+ });
122
+ });
123
+ describe('Simulated Production Scenarios', () => {
124
+ test('Metadata sync scenario: parallel query saves with refreshes', async () => {
125
+ /**
126
+ * Simulates: mj sync push with parallel query entity saves
127
+ * Each query save may trigger RefreshRelatedMetadata
128
+ * This is the HOT PATH where the bug manifests
129
+ */
130
+ // Initial metadata load (like PushService.ts:218)
131
+ await provider.Config(testConfig);
132
+ // Simulate 20 parallel query saves, each accessing metadata
133
+ const querySaves = Array(20).fill(0).map(async (_, i) => {
134
+ // Random delay to simulate different save times
135
+ await new Promise(resolve => setTimeout(resolve, Math.random() * 100));
136
+ // Each save accesses metadata (like QueryEntity.extractAndSyncData)
137
+ const entities = provider.Entities;
138
+ // CRITICAL: Should always have valid data
139
+ expect(entities).toBeDefined();
140
+ expect(Array.isArray(entities)).toBe(true);
141
+ // Some saves trigger a refresh (like RefreshRelatedMetadata)
142
+ if (i % 5 === 0) {
143
+ await provider.Refresh();
144
+ }
145
+ // Continue accessing metadata
146
+ const entitiesAfterRefresh = provider.Entities;
147
+ expect(entitiesAfterRefresh).toBeDefined();
148
+ return true;
149
+ });
150
+ // All should complete successfully
151
+ const results = await Promise.all(querySaves);
152
+ expect(results.every(r => r === true)).toBe(true);
153
+ });
154
+ test('High concurrency: 50 parallel operations', async () => {
155
+ /**
156
+ * Stress test with high concurrency
157
+ * Validates that system remains stable under load
158
+ */
159
+ await provider.Config(testConfig);
160
+ const operations = Array(50).fill(0).map(async (_, i) => {
161
+ await new Promise(resolve => setTimeout(resolve, Math.random() * 50));
162
+ // Mix of reads and refreshes
163
+ if (i % 10 === 0) {
164
+ await provider.Refresh();
165
+ }
166
+ else {
167
+ const entities = provider.Entities;
168
+ expect(entities).toBeDefined();
169
+ }
170
+ return true;
171
+ });
172
+ const results = await Promise.all(operations);
173
+ expect(results.every(r => r === true)).toBe(true);
174
+ });
175
+ test('Rapid successive refreshes', async () => {
176
+ /**
177
+ * Tests rapid refresh calls (like might happen in error retry scenarios)
178
+ * Should handle gracefully without corruption
179
+ */
180
+ await provider.Config(testConfig);
181
+ provider.resetCallCount();
182
+ // Trigger 5 refreshes in rapid succession
183
+ const refreshes = Array(5).fill(0).map(() => provider.Refresh());
184
+ await Promise.all(refreshes);
185
+ // Should have valid metadata
186
+ expect(provider.Entities.length).toBeGreaterThan(0);
187
+ // Should have called GetAllMetadata (but maybe coalesced)
188
+ console.log(`Rapid refresh: GetAllMetadata called ${provider.getCallCount()} times for 5 refresh calls`);
189
+ });
190
+ });
191
+ describe('Edge Cases', () => {
192
+ test('Refresh during entity iteration', async () => {
193
+ /**
194
+ * Simulates CodeGen iterating over md.Entities while refresh happens
195
+ * The array should remain stable during iteration
196
+ */
197
+ await provider.Config(testConfig);
198
+ // Start iterating
199
+ const iterationResults = [];
200
+ const iterationPromise = (async () => {
201
+ const entities = provider.Entities;
202
+ for (const entity of entities) {
203
+ iterationResults.push(entity.Name);
204
+ await new Promise(resolve => setTimeout(resolve, 20));
205
+ }
206
+ })();
207
+ // Trigger refresh during iteration
208
+ setTimeout(() => provider.Refresh(), 30);
209
+ // Wait for iteration to complete
210
+ await iterationPromise;
211
+ // Should have iterated over some entities
212
+ expect(iterationResults.length).toBeGreaterThan(0);
213
+ });
214
+ test('Reading specific entity during refresh', async () => {
215
+ /**
216
+ * Tests finding a specific entity during refresh
217
+ * Should not fail with "Entity not found"
218
+ */
219
+ await provider.Config(testConfig);
220
+ // Start refresh
221
+ const refreshPromise = provider.Config(testConfig);
222
+ // Try to find specific entity during refresh
223
+ await new Promise(resolve => setTimeout(resolve, 50));
224
+ const entity = provider.Entities.find(e => e.Name.includes('Test Entity'));
225
+ // Should find entity (old or new data, but should exist)
226
+ expect(entity).toBeDefined();
227
+ await refreshPromise;
228
+ });
229
+ test('Accessing Fields during refresh', async () => {
230
+ /**
231
+ * Tests accessing entity.Fields during refresh
232
+ * This is where "Cannot read properties of undefined (reading 'Fields')" occurs
233
+ */
234
+ await provider.Config(testConfig);
235
+ const refreshPromise = provider.Config(testConfig);
236
+ await new Promise(resolve => setTimeout(resolve, 50));
237
+ const entities = provider.Entities;
238
+ if (entities && entities.length > 0) {
239
+ const firstEntity = entities[0];
240
+ // CRITICAL: Fields should always be defined
241
+ expect(firstEntity.Fields).toBeDefined();
242
+ expect(Array.isArray(firstEntity.Fields)).toBe(true);
243
+ // Should be able to iterate fields
244
+ for (const field of firstEntity.Fields) {
245
+ expect(field.Name).toBeDefined();
246
+ expect(field.Type).toBeDefined();
247
+ }
248
+ }
249
+ await refreshPromise;
250
+ });
251
+ });
252
+ });
253
+ //# sourceMappingURL=providerBase.concurrency.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerBase.concurrency.test.js","sourceRoot":"","sources":["../../src/__tests__/providerBase.concurrency.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Baseline Tests for ProviderBase.Refresh() and Config()
3
+ *
4
+ * Purpose: Document current behavior before implementing thread safety fixes
5
+ * These tests establish a baseline to ensure the fix doesn't break existing functionality
6
+ *
7
+ * Related: METADATA_THREAD_SAFETY_IMPLEMENTATION.md - Phase 1, Task 1.3
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=providerBase.refresh.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerBase.refresh.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/providerBase.refresh.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}