@memberjunction/ng-shared 5.43.0 → 5.45.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-framework.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/navigation-framework.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for the Navigation Back/Forward Framework:\n * - BaseResourceComponent query param lifecycle (OnQueryParamsChanged, UpdateQueryParams, GetQueryParams)\n * - NavigationService.NotifyQueryParamsChanged / QueryParamChanged$\n * - Suppression flag prevents loops\n * - Tab-scoped filtering prevents cross-tab leakage\n */\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\n\n// Mock Angular dependencies\nvi.mock('@angular/core', () => ({\n Directive: () => (target: Function) => target,\n Injectable: () => (target: Function) => target,\n OnInit: class {},\n OnDestroy: class {},\n inject: vi.fn(),\n Input: () => () => {},\n Output: () => () => {},\n EventEmitter: class { emit() {} },\n}));\n\nvi.mock('@angular/router', () => ({}));\n\nvi.mock('@memberjunction/core', () => ({\n BaseEntity: class {},\n Metadata: class {},\n CompositeKey: class {},\n}));\n\nvi.mock('@memberjunction/core-entities', () => ({\n ResourceData: class {\n ID = 0;\n Name = '';\n ResourceTypeID = '';\n ResourceRecordID = '';\n Configuration: Record<string, unknown> = {};\n constructor(data?: Record<string, unknown>) {\n if (data) Object.assign(this, data);\n }\n },\n}));\n\nvi.mock('@memberjunction/global', () => ({\n UUIDsEqual: (a: string, b: string) => a === b,\n}));\n\n// ---- QueryParamChangeEvent tests ----\n\ndescribe('QueryParamChangeEvent', () => {\n it('should have TabId and Params fields', () => {\n // Verify the interface shape by creating a conforming object\n const event = {\n TabId: 'tab-123',\n Params: { entity: 'Actions', filter: 'active' },\n };\n expect(event.TabId).toBe('tab-123');\n expect(event.Params.entity).toBe('Actions');\n expect(event.Params.filter).toBe('active');\n });\n});\n\n// ---- Shell helper function tests (pure functions extracted for testing) ----\n\ndescribe('extractQueryParamsFromUrl', () => {\n // Replicate the shell's extractQueryParamsFromUrl logic for unit testing\n function extractQueryParamsFromUrl(url: string): Record<string, string> {\n const fragmentIndex = url.indexOf('#');\n const cleanUrl = fragmentIndex !== -1 ? url.substring(0, fragmentIndex) : url;\n const queryIndex = cleanUrl.indexOf('?');\n if (queryIndex === -1) return {};\n const params = new URLSearchParams(cleanUrl.substring(queryIndex + 1));\n const result: Record<string, string> = {};\n params.forEach((value, key) => { result[key] = value; });\n return result;\n }\n\n it('should extract query params from URL', () => {\n const result = extractQueryParamsFromUrl('/app/data-explorer/Data?entity=Actions&filter=active');\n expect(result).toEqual({ entity: 'Actions', filter: 'active' });\n });\n\n it('should return empty object for URL without query params', () => {\n expect(extractQueryParamsFromUrl('/app/data-explorer/Data')).toEqual({});\n });\n\n it('should decode encoded values', () => {\n const result = extractQueryParamsFromUrl('/app/data?entity=MJ%3A%20Actions');\n expect(result.entity).toBe('MJ: Actions');\n });\n\n it('should handle empty values', () => {\n const result = extractQueryParamsFromUrl('/app/data?key=');\n expect(result.key).toBe('');\n });\n\n it('should ignore fragment (#hash)', () => {\n const result = extractQueryParamsFromUrl('/app/data?entity=Members#section');\n expect(result.entity).toBe('Members');\n expect(result['#section']).toBeUndefined();\n });\n\n it('should handle URL with only fragment, no query params', () => {\n const result = extractQueryParamsFromUrl('/app/data#section');\n expect(result).toEqual({});\n });\n\n it('should handle + as space', () => {\n const result = extractQueryParamsFromUrl('/app/data?entity=My+Entity');\n expect(result.entity).toBe('My Entity');\n });\n});\n\ndescribe('queryParamsEqual', () => {\n // Replicate the shell's queryParamsEqual logic\n function queryParamsEqual(a: Record<string, string>, b: Record<string, string>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every(key =>\n decodeURIComponent(a[key]?.replace(/\\+/g, ' ') || '') ===\n decodeURIComponent(b[key]?.replace(/\\+/g, ' ') || '')\n );\n }\n\n it('should return true for identical params', () => {\n expect(queryParamsEqual({ entity: 'Actions' }, { entity: 'Actions' })).toBe(true);\n });\n\n it('should return false for different values', () => {\n expect(queryParamsEqual({ entity: 'Actions' }, { entity: 'Members' })).toBe(false);\n });\n\n it('should return false for different key counts', () => {\n expect(queryParamsEqual({ entity: 'Actions' }, { entity: 'Actions', filter: 'x' })).toBe(false);\n });\n\n it('should return true for both empty', () => {\n expect(queryParamsEqual({}, {})).toBe(true);\n });\n\n it('should return false for one empty, one not', () => {\n expect(queryParamsEqual({}, { entity: 'Actions' })).toBe(false);\n });\n\n it('should normalize + vs %20 encoding', () => {\n expect(queryParamsEqual({ entity: 'My+Entity' }, { entity: 'My%20Entity' })).toBe(true);\n });\n\n it('should handle missing keys', () => {\n expect(queryParamsEqual({ a: 'x' }, { b: 'x' })).toBe(false);\n });\n});\n\n// ---- buildResourceUrl appendQP helper tests ----\n\ndescribe('appendQueryParams (appendQP helper)', () => {\n function appendQP(url: string, queryParams: Record<string, string> | undefined): string {\n if (!queryParams || Object.keys(queryParams).length === 0) return url;\n const separator = url.includes('?') ? '&' : '?';\n const params = new URLSearchParams(queryParams);\n return `${url}${separator}${params.toString()}`;\n }\n\n it('should append params to URL without existing params', () => {\n const result = appendQP('/app/data/record/Entity/123', { entity: 'Actions' });\n expect(result).toBe('/app/data/record/Entity/123?entity=Actions');\n });\n\n it('should append params to URL with existing params', () => {\n const result = appendQP('/app/data?existing=x', { entity: 'Actions' });\n expect(result).toBe('/app/data?existing=x&entity=Actions');\n });\n\n it('should return URL unchanged for empty params', () => {\n expect(appendQP('/app/data', {})).toBe('/app/data');\n });\n\n it('should return URL unchanged for undefined params', () => {\n expect(appendQP('/app/data', undefined)).toBe('/app/data');\n });\n\n it('should properly encode special characters', () => {\n const result = appendQP('/app/data', { entity: 'MJ: Actions' });\n expect(result).toContain('entity=MJ');\n // URLSearchParams encodes spaces as +\n expect(result).toMatch(/entity=MJ[+%].*Actions/);\n });\n\n it('should handle multiple params', () => {\n const result = appendQP('/app/data', { entity: 'Actions', filter: 'active', view: 'grid' });\n expect(result).toContain('entity=Actions');\n expect(result).toContain('filter=active');\n expect(result).toContain('view=grid');\n });\n});\n\n// ---- shouldReuseRoute logic tests ----\n\ndescribe('shouldReuseRoute logic', () => {\n // Test the comparison logic (routeConfig + params, NOT queryParams)\n function objectContentsEqual(obj1: Record<string, string>, obj2: Record<string, string>): boolean {\n if (obj1 === obj2) return true;\n if (!obj1 || !obj2) return false;\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n return keys1.every(key => obj1[key] === obj2[key]);\n }\n\n function shouldReuseRoute(\n futureConfig: object | null,\n currConfig: object | null,\n futureParams: Record<string, string>,\n currParams: Record<string, string>\n ): boolean {\n return futureConfig === currConfig && objectContentsEqual(futureParams, currParams);\n }\n\n it('should return true for same config and params with different query params', () => {\n const config = {};\n // Query params intentionally excluded\n expect(shouldReuseRoute(config, config, { id: '1' }, { id: '1' })).toBe(true);\n });\n\n it('should return false for different path params', () => {\n const config = {};\n expect(shouldReuseRoute(config, config, { id: '1' }, { id: '2' })).toBe(false);\n });\n\n it('should return false for different route configs', () => {\n expect(shouldReuseRoute({}, {}, { id: '1' }, { id: '1' })).toBe(false);\n });\n\n it('should return true for same everything', () => {\n const config = {};\n expect(shouldReuseRoute(config, config, {}, {})).toBe(true);\n });\n\n it('should return false when one has params and other does not', () => {\n const config = {};\n expect(shouldReuseRoute(config, config, { id: '1' }, {})).toBe(false);\n });\n});\n\n// ---- Suppression flag behavior ----\n\ndescribe('_suppressQueryParamSync behavior', () => {\n it('should prevent UpdateQueryParams during suppression', () => {\n let suppressFlag = false;\n const mockUpdateActiveTabQP = vi.fn();\n\n function updateQueryParams(params: Record<string, string | null>): void {\n if (suppressFlag) return;\n mockUpdateActiveTabQP(params);\n }\n\n // Normal call\n updateQueryParams({ entity: 'Actions' });\n expect(mockUpdateActiveTabQP).toHaveBeenCalledTimes(1);\n\n // Suppressed call (simulates being inside OnQueryParamsChanged)\n suppressFlag = true;\n updateQueryParams({ entity: 'Members' });\n expect(mockUpdateActiveTabQP).toHaveBeenCalledTimes(1); // Still 1, not 2\n\n // After suppression cleared\n suppressFlag = false;\n updateQueryParams({ entity: 'Queries' });\n expect(mockUpdateActiveTabQP).toHaveBeenCalledTimes(2);\n });\n\n it('should clear suppression flag even if OnQueryParamsChanged throws', () => {\n let suppressFlag = false;\n\n function simulateSubscription(callback: () => void): void {\n suppressFlag = true;\n try {\n callback();\n } finally {\n suppressFlag = false;\n }\n }\n\n // The try/finally ensures flag is cleared even when callback throws\n try {\n simulateSubscription(() => {\n throw new Error('Component error');\n });\n } catch {\n // Expected — the error propagates but flag should still be cleared\n }\n\n // Flag should be cleared despite the error\n expect(suppressFlag).toBe(false);\n });\n});\n\n// ---- GetQueryParams behavior ----\n\ndescribe('GetQueryParams', () => {\n it('should return params from Configuration.queryParams', () => {\n const config: Record<string, unknown> = { queryParams: { entity: 'Actions', filter: 'active' } };\n const result = (config['queryParams'] as Record<string, string>) || {};\n expect(result).toEqual({ entity: 'Actions', filter: 'active' });\n });\n\n it('should return empty object when no queryParams', () => {\n const config: Record<string, unknown> = {};\n const result = (config['queryParams'] as Record<string, string>) || {};\n expect(result).toEqual({});\n });\n\n it('should return empty object when Configuration is null', () => {\n const config: Record<string, unknown> | null = null;\n const result = ((config?.['queryParams'] ?? {}) as Record<string, string>);\n expect(result).toEqual({});\n });\n});\n\n// ---- Tab-scoped filtering ----\n\ndescribe('Tab-scoped query param filtering', () => {\n it('should only deliver events matching the component tab ID', () => {\n const componentTabId = 'tab-abc';\n const events = [\n { TabId: 'tab-abc', Params: { entity: 'Actions' } },\n { TabId: 'tab-xyz', Params: { entity: 'Members' } },\n { TabId: 'tab-abc', Params: { entity: 'Queries' } },\n ];\n\n const received = events.filter(e => e.TabId === componentTabId);\n expect(received).toHaveLength(2);\n expect(received[0].Params.entity).toBe('Actions');\n expect(received[1].Params.entity).toBe('Queries');\n });\n\n it('should not deliver any events for non-matching tab ID', () => {\n const componentTabId = 'tab-none';\n const events = [\n { TabId: 'tab-abc', Params: { entity: 'Actions' } },\n { TabId: 'tab-xyz', Params: { entity: 'Members' } },\n ];\n\n const received = events.filter(e => e.TabId === componentTabId);\n expect(received).toHaveLength(0);\n });\n\n it('should handle empty tab ID gracefully', () => {\n const componentTabId = '';\n const events = [\n { TabId: 'tab-abc', Params: { entity: 'Actions' } },\n ];\n\n const received = events.filter(e => e.TabId === componentTabId);\n expect(received).toHaveLength(0);\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=shared.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/shared.test.ts"],"names":[],"mappings":""}
@@ -1,265 +0,0 @@
1
- /**
2
- * Tests for shared package utilities:
3
- * - SimpleTextFormatPipe
4
- * - URLPipe
5
- * - TitleService
6
- * - EventCodes / HtmlListType constants
7
- */
8
- import { describe, it, expect, vi, beforeEach } from 'vitest';
9
- // Mock Angular dependencies
10
- vi.mock('@angular/core', () => ({
11
- Pipe: () => (target) => target,
12
- PipeTransform: class {
13
- },
14
- Injectable: () => (target) => target,
15
- Directive: () => (target) => target,
16
- Input: () => () => { },
17
- Output: () => () => { },
18
- EventEmitter: class {
19
- emit() { }
20
- },
21
- ElementRef: class {
22
- },
23
- OnInit: class {
24
- },
25
- OnDestroy: class {
26
- },
27
- Injector: class {
28
- },
29
- }));
30
- vi.mock('@angular/platform-browser', () => ({
31
- Title: class {
32
- title = '';
33
- setTitle(t) { this.title = t; }
34
- getTitle() { return this.title; }
35
- }
36
- }));
37
- vi.mock('@memberjunction/core', () => ({
38
- Metadata: class {
39
- },
40
- CompositeKey: class {
41
- },
42
- LogError: vi.fn(),
43
- LogStatus: vi.fn(),
44
- StartupManager: { Instance: { Startup: vi.fn() } },
45
- LocalCacheManager: class {
46
- },
47
- BaseEntity: class {
48
- },
49
- RunView: class {
50
- },
51
- }));
52
- vi.mock('@memberjunction/core-entities', () => ({
53
- ResourcePermissionEngine: { Instance: { ResourceTypes: [] } },
54
- UserInfoEngine: { Instance: { GetSetting: vi.fn(), SetSetting: vi.fn() } },
55
- MJResourceTypeEntity: class {
56
- },
57
- MJUserNotificationEntity: class {
58
- },
59
- ArtifactMetadataEngine: { Instance: { Config: vi.fn() } },
60
- DashboardEngine: { Instance: { Config: vi.fn() } },
61
- ViewColumnInfo: class {
62
- },
63
- MJDashboardEntityExtended: class {
64
- },
65
- ResourceData: class {
66
- ResourceRecordID = '';
67
- },
68
- }));
69
- vi.mock('@memberjunction/global', () => ({
70
- MJGlobal: { Instance: { GetEventListener: vi.fn(() => ({ subscribe: vi.fn() })) } },
71
- MJEventType: { LoggedIn: 'LoggedIn', ComponentEvent: 'ComponentEvent' },
72
- ConvertMarkdownStringToHtmlList: vi.fn((type, text) => `<${type}>${text}</${type}>`),
73
- InvokeManualResize: vi.fn(),
74
- }));
75
- vi.mock('@memberjunction/ai-engine-base', () => ({
76
- AIEngineBase: { Instance: { Config: vi.fn() } },
77
- }));
78
- vi.mock('@memberjunction/entity-communications-base', () => ({
79
- EntityCommunicationsEngineBase: { Instance: { Config: vi.fn() } },
80
- }));
81
- vi.mock('@memberjunction/graphql-dataprovider', () => ({
82
- GraphQLDataProvider: class {
83
- },
84
- }));
85
- vi.mock('@memberjunction/ng-notifications', () => ({
86
- MJNotificationService: class {
87
- static UserNotifications = [];
88
- static UnreadUserNotifications = [];
89
- static UnreadUserNotificationCount = 0;
90
- static RefreshUserNotifications = vi.fn();
91
- CreateNotification = vi.fn();
92
- CreateSimpleNotification = vi.fn();
93
- },
94
- }));
95
- vi.mock('@memberjunction/ng-base-types', () => ({
96
- BaseAngularComponent: class {
97
- },
98
- }));
99
- vi.mock('@memberjunction/ng-base-application', () => ({
100
- WorkspaceStateManager: class {
101
- },
102
- ApplicationManager: class {
103
- GetActiveApp = vi.fn();
104
- GetAppByName = vi.fn();
105
- GetAppById = vi.fn();
106
- },
107
- NavItem: class {
108
- },
109
- TabRequest: class {
110
- },
111
- }));
112
- vi.mock('rxjs', async () => {
113
- const actual = await vi.importActual('rxjs');
114
- return actual;
115
- });
116
- // ======================= SimpleTextFormatPipe =======================
117
- describe('SimpleTextFormatPipe', () => {
118
- let pipe;
119
- beforeEach(async () => {
120
- const mod = await import('../simpleTextFormat');
121
- pipe = new mod.SimpleTextFormatPipe();
122
- });
123
- it('should replace newlines with <br> tags', () => {
124
- expect(pipe.transform('hello\nworld')).toBe('hello<br>world');
125
- });
126
- it('should replace tabs with non-breaking spaces', () => {
127
- expect(pipe.transform('col1\tcol2')).toBe('col1&nbsp;&nbsp;&nbsp;&nbsp;col2');
128
- });
129
- it('should handle mixed newlines and tabs', () => {
130
- expect(pipe.transform('line1\n\tindented')).toBe('line1<br>&nbsp;&nbsp;&nbsp;&nbsp;indented');
131
- });
132
- it('should return falsy values as-is', () => {
133
- expect(pipe.transform('')).toBe('');
134
- expect(pipe.transform(null)).toBeNull();
135
- expect(pipe.transform(undefined)).toBeUndefined();
136
- });
137
- it('should return plain text unchanged', () => {
138
- expect(pipe.transform('no special chars')).toBe('no special chars');
139
- });
140
- });
141
- // ======================= URLPipe =======================
142
- describe('URLPipe', () => {
143
- let pipe;
144
- beforeEach(async () => {
145
- const mod = await import('../urlPipe');
146
- pipe = new mod.URLPipe();
147
- });
148
- it('should prepend https:// when no protocol is present', () => {
149
- expect(pipe.transform('example.com')).toBe('https://example.com');
150
- });
151
- it('should not modify URLs that already have http', () => {
152
- expect(pipe.transform('http://example.com')).toBe('http://example.com');
153
- });
154
- it('should not modify URLs that already have https', () => {
155
- expect(pipe.transform('https://example.com')).toBe('https://example.com');
156
- });
157
- it('should return falsy values as-is', () => {
158
- expect(pipe.transform('')).toBe('');
159
- expect(pipe.transform(null)).toBeNull();
160
- });
161
- });
162
- // ======================= TitleService =======================
163
- describe('TitleService', () => {
164
- let service;
165
- beforeEach(async () => {
166
- const mod = await import('../title.service');
167
- const { Title } = await import('@angular/platform-browser');
168
- service = new mod.TitleService(new Title(document));
169
- });
170
- it('should have default base title of MemberJunction', () => {
171
- expect(service.getBaseTitle()).toBe('MemberJunction');
172
- });
173
- it('should build title with base only when no context is set', () => {
174
- expect(service.getFullTitle()).toBe('MemberJunction');
175
- });
176
- it('should build title with app name', () => {
177
- service.setAppName('Sales');
178
- expect(service.getFullTitle()).toBe('Sales - MemberJunction');
179
- });
180
- it('should build title with resource name', () => {
181
- service.setResourceName('Contacts');
182
- expect(service.getFullTitle()).toBe('Contacts - MemberJunction');
183
- });
184
- it('should build title with both app and resource (resource first)', () => {
185
- service.setAppName('Sales');
186
- service.setResourceName('Contacts');
187
- expect(service.getFullTitle()).toBe('Contacts - Sales - MemberJunction');
188
- });
189
- it('should update base title', () => {
190
- service.setBaseTitle('Skip');
191
- expect(service.getFullTitle()).toBe('Skip');
192
- });
193
- it('should set context in one call', () => {
194
- service.setContext('Marketing', 'Campaigns');
195
- expect(service.getFullTitle()).toBe('Campaigns - Marketing - MemberJunction');
196
- });
197
- it('should reset to just base title', () => {
198
- service.setContext('Marketing', 'Campaigns');
199
- service.reset();
200
- expect(service.getFullTitle()).toBe('MemberJunction');
201
- expect(service.getAppName()).toBeNull();
202
- expect(service.getResourceName()).toBeNull();
203
- });
204
- it('should clear app name with null', () => {
205
- service.setAppName('Sales');
206
- service.setAppName(null);
207
- expect(service.getFullTitle()).toBe('MemberJunction');
208
- });
209
- });
210
- // ======================= EventCodes & HtmlListType =======================
211
- describe('EventCodes', () => {
212
- it('should export expected event codes', async () => {
213
- const { EventCodes } = await import('../shared.service');
214
- expect(EventCodes.ViewClicked).toBe('ViewClicked');
215
- expect(EventCodes.EntityRecordClicked).toBe('EntityRecordClicked');
216
- expect(EventCodes.AddDashboard).toBe('AddDashboard');
217
- expect(EventCodes.RunSearch).toBe('RunSearch');
218
- expect(EventCodes.CloseCurrentTab).toBe('CloseCurrentTab');
219
- expect(EventCodes.AvatarUpdated).toBe('AvatarUpdated');
220
- });
221
- });
222
- describe('HtmlListType', () => {
223
- it('should export Unordered and Ordered list types', async () => {
224
- const { HtmlListType } = await import('../shared.service');
225
- expect(HtmlListType.Unordered).toBe('Unordered');
226
- expect(HtmlListType.Ordered).toBe('Ordered');
227
- });
228
- });
229
- // ======================= SharedService resource type mapping =======================
230
- describe('SharedService resource type mapping', () => {
231
- it('should map resource type names to route segments', async () => {
232
- const { SharedService } = await import('../shared.service');
233
- // Construct with mocked dependencies
234
- const mjNotif = { CreateNotification: vi.fn(), CreateSimpleNotification: vi.fn() };
235
- const injector = { get: vi.fn() };
236
- const svc = new SharedService(mjNotif, injector);
237
- expect(svc.mapResourceTypeNameToRouteSegment('Records')).toBe('record');
238
- expect(svc.mapResourceTypeNameToRouteSegment('MJ: User Views')).toBe('view');
239
- expect(svc.mapResourceTypeNameToRouteSegment('Dashboards')).toBe('dashboard');
240
- expect(svc.mapResourceTypeNameToRouteSegment('Reports')).toBe('report');
241
- expect(svc.mapResourceTypeNameToRouteSegment('Search Results')).toBe('search');
242
- expect(svc.mapResourceTypeNameToRouteSegment('Queries')).toBe('query');
243
- expect(svc.mapResourceTypeNameToRouteSegment('Lists')).toBe('list');
244
- expect(svc.mapResourceTypeNameToRouteSegment('Unknown')).toBeNull();
245
- });
246
- it('should map route segments to resource type names', async () => {
247
- const { SharedService } = await import('../shared.service');
248
- const mjNotif = { CreateNotification: vi.fn(), CreateSimpleNotification: vi.fn() };
249
- const injector = { get: vi.fn() };
250
- const svc = new SharedService(mjNotif, injector);
251
- expect(svc.mapResourceTypeRouteSegmentToName('record')).toBe('records');
252
- expect(svc.mapResourceTypeRouteSegmentToName('view')).toBe('user views');
253
- expect(svc.mapResourceTypeRouteSegmentToName('dashboard')).toBe('dashboards');
254
- expect(svc.mapResourceTypeRouteSegmentToName('nonexistent')).toBeNull();
255
- });
256
- it('should be case-insensitive for resource type mapping', async () => {
257
- const { SharedService } = await import('../shared.service');
258
- const mjNotif = { CreateNotification: vi.fn(), CreateSimpleNotification: vi.fn() };
259
- const injector = { get: vi.fn() };
260
- const svc = new SharedService(mjNotif, injector);
261
- expect(svc.mapResourceTypeNameToRouteSegment('RECORDS')).toBe('record');
262
- expect(svc.mapResourceTypeNameToRouteSegment(' Records ')).toBe('record');
263
- });
264
- });
265
- //# sourceMappingURL=shared.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/shared.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for shared package utilities:\n * - SimpleTextFormatPipe\n * - URLPipe\n * - TitleService\n * - EventCodes / HtmlListType constants\n */\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\n\n// Mock Angular dependencies\nvi.mock('@angular/core', () => ({\n Pipe: () => (target: Function) => target,\n PipeTransform: class {},\n Injectable: () => (target: Function) => target,\n Directive: () => (target: Function) => target,\n Input: () => () => {},\n Output: () => () => {},\n EventEmitter: class { emit() {} },\n ElementRef: class {},\n OnInit: class {},\n OnDestroy: class {},\n Injector: class {},\n}));\n\nvi.mock('@angular/platform-browser', () => ({\n Title: class {\n private title = '';\n setTitle(t: string) { this.title = t; }\n getTitle() { return this.title; }\n }\n}));\n\nvi.mock('@memberjunction/core', () => ({\n Metadata: class {},\n CompositeKey: class {},\n LogError: vi.fn(),\n LogStatus: vi.fn(),\n StartupManager: { Instance: { Startup: vi.fn() } },\n LocalCacheManager: class {},\n BaseEntity: class {},\n RunView: class {},\n}));\n\nvi.mock('@memberjunction/core-entities', () => ({\n ResourcePermissionEngine: { Instance: { ResourceTypes: [] } },\n UserInfoEngine: { Instance: { GetSetting: vi.fn(), SetSetting: vi.fn() } },\n MJResourceTypeEntity: class {},\n MJUserNotificationEntity: class {},\n ArtifactMetadataEngine: { Instance: { Config: vi.fn() } },\n DashboardEngine: { Instance: { Config: vi.fn() } },\n ViewColumnInfo: class {},\n MJDashboardEntityExtended: class {},\n ResourceData: class {\n ResourceRecordID = '';\n },\n}));\n\nvi.mock('@memberjunction/global', () => ({\n MJGlobal: { Instance: { GetEventListener: vi.fn(() => ({ subscribe: vi.fn() })) } },\n MJEventType: { LoggedIn: 'LoggedIn', ComponentEvent: 'ComponentEvent' },\n ConvertMarkdownStringToHtmlList: vi.fn((type: string, text: string) => `<${type}>${text}</${type}>`),\n InvokeManualResize: vi.fn(),\n}));\n\nvi.mock('@memberjunction/ai-engine-base', () => ({\n AIEngineBase: { Instance: { Config: vi.fn() } },\n}));\n\nvi.mock('@memberjunction/entity-communications-base', () => ({\n EntityCommunicationsEngineBase: { Instance: { Config: vi.fn() } },\n}));\n\nvi.mock('@memberjunction/graphql-dataprovider', () => ({\n GraphQLDataProvider: class {},\n}));\n\nvi.mock('@memberjunction/ng-notifications', () => ({\n MJNotificationService: class {\n static UserNotifications: never[] = [];\n static UnreadUserNotifications: never[] = [];\n static UnreadUserNotificationCount = 0;\n static RefreshUserNotifications = vi.fn();\n CreateNotification = vi.fn();\n CreateSimpleNotification = vi.fn();\n },\n}));\n\nvi.mock('@memberjunction/ng-base-types', () => ({\n BaseAngularComponent: class {},\n}));\n\nvi.mock('@memberjunction/ng-base-application', () => ({\n WorkspaceStateManager: class {},\n ApplicationManager: class {\n GetActiveApp = vi.fn();\n GetAppByName = vi.fn();\n GetAppById = vi.fn();\n },\n NavItem: class {},\n TabRequest: class {},\n}));\n\nvi.mock('rxjs', async () => {\n const actual = await vi.importActual<typeof import('rxjs')>('rxjs');\n return actual;\n});\n\n// ======================= SimpleTextFormatPipe =======================\ndescribe('SimpleTextFormatPipe', () => {\n let pipe: { transform(value: string): string };\n\n beforeEach(async () => {\n const mod = await import('../simpleTextFormat');\n pipe = new mod.SimpleTextFormatPipe();\n });\n\n it('should replace newlines with <br> tags', () => {\n expect(pipe.transform('hello\\nworld')).toBe('hello<br>world');\n });\n\n it('should replace tabs with non-breaking spaces', () => {\n expect(pipe.transform('col1\\tcol2')).toBe('col1&nbsp;&nbsp;&nbsp;&nbsp;col2');\n });\n\n it('should handle mixed newlines and tabs', () => {\n expect(pipe.transform('line1\\n\\tindented')).toBe('line1<br>&nbsp;&nbsp;&nbsp;&nbsp;indented');\n });\n\n it('should return falsy values as-is', () => {\n expect(pipe.transform('')).toBe('');\n expect(pipe.transform(null as unknown as string)).toBeNull();\n expect(pipe.transform(undefined as unknown as string)).toBeUndefined();\n });\n\n it('should return plain text unchanged', () => {\n expect(pipe.transform('no special chars')).toBe('no special chars');\n });\n});\n\n// ======================= URLPipe =======================\ndescribe('URLPipe', () => {\n let pipe: { transform(value: string): string };\n\n beforeEach(async () => {\n const mod = await import('../urlPipe');\n pipe = new mod.URLPipe();\n });\n\n it('should prepend https:// when no protocol is present', () => {\n expect(pipe.transform('example.com')).toBe('https://example.com');\n });\n\n it('should not modify URLs that already have http', () => {\n expect(pipe.transform('http://example.com')).toBe('http://example.com');\n });\n\n it('should not modify URLs that already have https', () => {\n expect(pipe.transform('https://example.com')).toBe('https://example.com');\n });\n\n it('should return falsy values as-is', () => {\n expect(pipe.transform('')).toBe('');\n expect(pipe.transform(null as unknown as string)).toBeNull();\n });\n});\n\n// ======================= TitleService =======================\ndescribe('TitleService', () => {\n let service: InstanceType<typeof import('../title.service').TitleService>;\n\n beforeEach(async () => {\n const mod = await import('../title.service');\n const { Title } = await import('@angular/platform-browser');\n service = new mod.TitleService(new Title(document));\n });\n\n it('should have default base title of MemberJunction', () => {\n expect(service.getBaseTitle()).toBe('MemberJunction');\n });\n\n it('should build title with base only when no context is set', () => {\n expect(service.getFullTitle()).toBe('MemberJunction');\n });\n\n it('should build title with app name', () => {\n service.setAppName('Sales');\n expect(service.getFullTitle()).toBe('Sales - MemberJunction');\n });\n\n it('should build title with resource name', () => {\n service.setResourceName('Contacts');\n expect(service.getFullTitle()).toBe('Contacts - MemberJunction');\n });\n\n it('should build title with both app and resource (resource first)', () => {\n service.setAppName('Sales');\n service.setResourceName('Contacts');\n expect(service.getFullTitle()).toBe('Contacts - Sales - MemberJunction');\n });\n\n it('should update base title', () => {\n service.setBaseTitle('Skip');\n expect(service.getFullTitle()).toBe('Skip');\n });\n\n it('should set context in one call', () => {\n service.setContext('Marketing', 'Campaigns');\n expect(service.getFullTitle()).toBe('Campaigns - Marketing - MemberJunction');\n });\n\n it('should reset to just base title', () => {\n service.setContext('Marketing', 'Campaigns');\n service.reset();\n expect(service.getFullTitle()).toBe('MemberJunction');\n expect(service.getAppName()).toBeNull();\n expect(service.getResourceName()).toBeNull();\n });\n\n it('should clear app name with null', () => {\n service.setAppName('Sales');\n service.setAppName(null);\n expect(service.getFullTitle()).toBe('MemberJunction');\n });\n});\n\n// ======================= EventCodes & HtmlListType =======================\ndescribe('EventCodes', () => {\n it('should export expected event codes', async () => {\n const { EventCodes } = await import('../shared.service');\n expect(EventCodes.ViewClicked).toBe('ViewClicked');\n expect(EventCodes.EntityRecordClicked).toBe('EntityRecordClicked');\n expect(EventCodes.AddDashboard).toBe('AddDashboard');\n expect(EventCodes.RunSearch).toBe('RunSearch');\n expect(EventCodes.CloseCurrentTab).toBe('CloseCurrentTab');\n expect(EventCodes.AvatarUpdated).toBe('AvatarUpdated');\n });\n});\n\ndescribe('HtmlListType', () => {\n it('should export Unordered and Ordered list types', async () => {\n const { HtmlListType } = await import('../shared.service');\n expect(HtmlListType.Unordered).toBe('Unordered');\n expect(HtmlListType.Ordered).toBe('Ordered');\n });\n});\n\n// ======================= SharedService resource type mapping =======================\ndescribe('SharedService resource type mapping', () => {\n it('should map resource type names to route segments', async () => {\n const { SharedService } = await import('../shared.service');\n // Construct with mocked dependencies\n const mjNotif = { CreateNotification: vi.fn(), CreateSimpleNotification: vi.fn() };\n const injector = { get: vi.fn() };\n const svc = new SharedService(mjNotif as never, injector as never);\n\n expect(svc.mapResourceTypeNameToRouteSegment('Records')).toBe('record');\n expect(svc.mapResourceTypeNameToRouteSegment('MJ: User Views')).toBe('view');\n expect(svc.mapResourceTypeNameToRouteSegment('Dashboards')).toBe('dashboard');\n expect(svc.mapResourceTypeNameToRouteSegment('Reports')).toBe('report');\n expect(svc.mapResourceTypeNameToRouteSegment('Search Results')).toBe('search');\n expect(svc.mapResourceTypeNameToRouteSegment('Queries')).toBe('query');\n expect(svc.mapResourceTypeNameToRouteSegment('Lists')).toBe('list');\n expect(svc.mapResourceTypeNameToRouteSegment('Unknown')).toBeNull();\n });\n\n it('should map route segments to resource type names', async () => {\n const { SharedService } = await import('../shared.service');\n const mjNotif = { CreateNotification: vi.fn(), CreateSimpleNotification: vi.fn() };\n const injector = { get: vi.fn() };\n const svc = new SharedService(mjNotif as never, injector as never);\n\n expect(svc.mapResourceTypeRouteSegmentToName('record')).toBe('records');\n expect(svc.mapResourceTypeRouteSegmentToName('view')).toBe('user views');\n expect(svc.mapResourceTypeRouteSegmentToName('dashboard')).toBe('dashboards');\n expect(svc.mapResourceTypeRouteSegmentToName('nonexistent')).toBeNull();\n });\n\n it('should be case-insensitive for resource type mapping', async () => {\n const { SharedService } = await import('../shared.service');\n const mjNotif = { CreateNotification: vi.fn(), CreateSimpleNotification: vi.fn() };\n const injector = { get: vi.fn() };\n const svc = new SharedService(mjNotif as never, injector as never);\n\n expect(svc.mapResourceTypeNameToRouteSegment('RECORDS')).toBe('record');\n expect(svc.mapResourceTypeNameToRouteSegment(' Records ')).toBe('record');\n });\n});\n"]}