@memberjunction/core 5.0.0 → 5.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/core",
3
3
  "type": "module",
4
- "version": "5.0.0",
4
+ "version": "5.1.0",
5
5
  "description": "MemberJunction: Core Library including Metadata, Application, Entity Retrieval and Manipulation, and Utilities",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "vitest": "^3.1.1"
27
27
  },
28
28
  "dependencies": {
29
- "@memberjunction/global": "5.0.0",
29
+ "@memberjunction/global": "5.1.0",
30
30
  "rxjs": "^7.8.2",
31
31
  "zod": "~3.24.4",
32
32
  "debug": "^4.4.3"
@@ -1,45 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,217 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestMetadataProvider.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/TestMetadataProvider.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"providerBase.concurrency.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/providerBase.concurrency.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,253 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"providerBase.concurrency.test.js","sourceRoot":"","sources":["../../src/__tests__/providerBase.concurrency.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"providerBase.refresh.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/providerBase.refresh.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,161 +0,0 @@
1
- "use strict";
2
- /**
3
- * Baseline Tests for ProviderBase.Refresh() and Config()
4
- *
5
- * Purpose: Document current behavior before implementing thread safety fixes
6
- * These tests establish a baseline to ensure the fix doesn't break existing functionality
7
- *
8
- * Related: METADATA_THREAD_SAFETY_IMPLEMENTATION.md - Phase 1, Task 1.3
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.Refresh - Baseline Behavior', () => {
14
- let provider;
15
- let testConfig;
16
- beforeEach(() => {
17
- provider = new TestMetadataProvider_1.TestMetadataProvider();
18
- testConfig = new interfaces_1.ProviderConfigDataBase({}, // data
19
- '__mj', // MJCoreSchemaName
20
- [], // includeSchemas
21
- [], // excludeSchemas
22
- true // ignoreExistingMetadata - don't copy from global
23
- );
24
- });
25
- describe('Single Refresh Operations', () => {
26
- test('Config() loads metadata successfully', async () => {
27
- const result = await provider.Config(testConfig);
28
- expect(result).toBe(true);
29
- expect(provider.Entities).toBeDefined();
30
- expect(provider.Entities.length).toBeGreaterThan(0);
31
- });
32
- test('Entities have Fields populated', async () => {
33
- await provider.Config(testConfig);
34
- const entity = provider.Entities[0];
35
- expect(entity).toBeDefined();
36
- expect(entity.Fields).toBeDefined();
37
- expect(entity.Fields.length).toBe(2);
38
- expect(entity.Fields[0].Name).toBe('ID');
39
- });
40
- test('Refresh() triggers Config() and reloads metadata', async () => {
41
- // Initial load
42
- await provider.Config(testConfig);
43
- const initialCount = provider.Entities.length;
44
- // Change mock data
45
- provider.setMockMetadata({
46
- ...await provider['GetAllMetadata'](),
47
- Entities: [
48
- {
49
- ID: '3',
50
- Name: 'New Entity',
51
- SchemaName: 'dbo',
52
- BaseView: 'vwNewEntity',
53
- BaseTable: 'NewEntity',
54
- Fields: [{ ID: 'f5', Name: 'ID', Type: 'uniqueidentifier', IsPrimaryKey: true }]
55
- }
56
- ]
57
- });
58
- // Refresh
59
- await provider.Refresh();
60
- // Should have new data
61
- expect(provider.Entities.length).toBe(1);
62
- expect(provider.Entities[0].Name).toBe('New Entity');
63
- });
64
- test('AllowRefresh=false prevents refresh', async () => {
65
- await provider.Config(testConfig);
66
- const initialCount = provider.Entities.length;
67
- // Disable refresh
68
- provider.setAllowRefresh(false);
69
- // Try to refresh
70
- const result = await provider.Refresh();
71
- // Should return true but not actually refresh
72
- expect(result).toBe(true);
73
- expect(provider.Entities.length).toBe(initialCount);
74
- });
75
- });
76
- describe('Metadata Access During Operations', () => {
77
- test('Entities accessible immediately after Config()', async () => {
78
- await provider.Config(testConfig);
79
- // Should be able to access metadata immediately
80
- const entities = provider.Entities;
81
- expect(entities).toBeDefined();
82
- expect(Array.isArray(entities)).toBe(true);
83
- expect(entities.length).toBeGreaterThan(0);
84
- });
85
- test('Entities array is stable across multiple reads', async () => {
86
- await provider.Config(testConfig);
87
- const read1 = provider.Entities;
88
- const read2 = provider.Entities;
89
- const read3 = provider.Entities;
90
- // Should return same array instance
91
- expect(read1).toBe(read2);
92
- expect(read2).toBe(read3);
93
- });
94
- test('Fields arrays are accessible', async () => {
95
- await provider.Config(testConfig);
96
- const entity = provider.Entities[0];
97
- const fields1 = entity.Fields;
98
- const fields2 = entity.Fields;
99
- expect(fields1).toBeDefined();
100
- expect(fields1).toBe(fields2); // Same array instance
101
- expect(fields1.length).toBeGreaterThan(0);
102
- });
103
- });
104
- describe('Current Behavior - Documenting Issues', () => {
105
- test('KNOWN ISSUE: Reading metadata during Config() may see empty data', async () => {
106
- /**
107
- * This test documents the current race condition.
108
- * When Config() is called, it immediately clears metadata (line 341 of providerBase.ts)
109
- * before GetAllMetadata() completes.
110
- *
111
- * During this window, readers see empty metadata.
112
- * This test will FAIL before the fix and PASS after the atomic update fix.
113
- */
114
- // Start config but don't await
115
- const configPromise = provider.Config(testConfig);
116
- // Try to read metadata during config (after slight delay)
117
- await new Promise(resolve => setTimeout(resolve, 10));
118
- const entitiesDuringConfig = provider.Entities;
119
- // CURRENT BEHAVIOR: This might be empty or undefined
120
- // DESIRED BEHAVIOR: Should return either old metadata (if any) or wait for new
121
- // Note: On first call, there is no "old" metadata, so empty is expected
122
- // Wait for config to complete
123
- await configPromise;
124
- // After config, should definitely have data
125
- expect(provider.Entities.length).toBeGreaterThan(0);
126
- // Document current behavior
127
- console.log('Entities during config:', entitiesDuringConfig?.length ?? 'undefined/empty');
128
- console.log('Entities after config:', provider.Entities.length);
129
- });
130
- test('✅ FIXED: Multiple concurrent Config() calls now safe', async () => {
131
- /**
132
- * This test verifies that concurrent Config() calls don't cause race conditions.
133
- * With the atomic update fix, readers always see valid metadata (old or new).
134
- *
135
- * Before fix: Metadata would be cleared, causing empty array errors
136
- * After fix: Metadata is atomically swapped, no intermediate empty state
137
- */
138
- provider.resetCallCount();
139
- // Start 3 concurrent Config() calls
140
- const promises = [
141
- provider.Config(testConfig),
142
- provider.Config(testConfig),
143
- provider.Config(testConfig),
144
- ];
145
- // Wait for all to complete
146
- const results = await Promise.all(promises);
147
- // All should succeed
148
- expect(results.every(r => r === true)).toBe(true);
149
- // Should have valid metadata
150
- expect(provider.Entities).toBeDefined();
151
- expect(provider.Entities.length).toBeGreaterThan(0);
152
- // Check efficiency - may coalesce some calls
153
- const callCount = provider.getCallCount();
154
- console.log('GetAllMetadata called:', callCount, 'times for 3 Config() calls');
155
- console.log('Final entity count:', provider.Entities.length);
156
- // ✅ FIXED: No more race conditions - metadata is always valid
157
- // DESIRED BEHAVIOR: All calls complete safely, metadata is consistent
158
- });
159
- });
160
- });
161
- //# sourceMappingURL=providerBase.refresh.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providerBase.refresh.test.js","sourceRoot":"","sources":["../../src/__tests__/providerBase.refresh.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Jest setup file for MJCore tests
3
- * Runs before each test file
4
- */
5
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Jest setup file for MJCore tests
3
- * Runs before each test file
4
- */
5
- // Increase timeout for async operations
6
- jest.setTimeout(30000);
7
- // Mock console methods to reduce noise (can be enabled per test)
8
- global.console = {
9
- ...console,
10
- // Uncomment to silence logs during tests
11
- // log: jest.fn(),
12
- // debug: jest.fn(),
13
- // info: jest.fn(),
14
- // warn: jest.fn(),
15
- // error: jest.fn(),
16
- };
17
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wCAAwC;AACxC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvB,iEAAiE;AACjE,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,OAAO;IACV,yCAAyC;IACzC,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;CACrB,CAAC"}