@memberjunction/ng-dashboards 5.26.0 → 5.27.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/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +96 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +710 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +52 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +356 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +52 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +306 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +81 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +744 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +61 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +490 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +77 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +673 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +65 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +537 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +131 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +1030 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +78 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +569 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -14
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts +58 -0
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts.map +1 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js +315 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/index.d.ts +11 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +13 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts +50 -0
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts.map +1 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js +9 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js.map +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/MCP/index.d.ts +1 -0
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +2 -0
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +1 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +5 -4
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +6 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +7 -8
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +27 -17
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +66 -3
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +48 -48
- package/dist/__tests__/analytics-resource.test.d.ts +0 -2
- package/dist/__tests__/analytics-resource.test.d.ts.map +0 -1
- package/dist/__tests__/analytics-resource.test.js +0 -181
- package/dist/__tests__/analytics-resource.test.js.map +0 -1
- package/dist/__tests__/dashboards.test.d.ts +0 -2
- package/dist/__tests__/dashboards.test.d.ts.map +0 -1
- package/dist/__tests__/dashboards.test.js +0 -40
- package/dist/__tests__/dashboards.test.js.map +0 -1
- package/dist/__tests__/integration-data-service.test.d.ts +0 -2
- package/dist/__tests__/integration-data-service.test.d.ts.map +0 -1
- package/dist/__tests__/integration-data-service.test.js +0 -132
- package/dist/__tests__/integration-data-service.test.js.map +0 -1
- package/dist/__tests__/mapping-validation.test.d.ts +0 -2
- package/dist/__tests__/mapping-validation.test.d.ts.map +0 -1
- package/dist/__tests__/mapping-validation.test.js +0 -170
- package/dist/__tests__/mapping-validation.test.js.map +0 -1
- package/dist/__tests__/scheduling.test.d.ts +0 -2
- package/dist/__tests__/scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/scheduling.test.js +0 -205
- package/dist/__tests__/scheduling.test.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mapping-validation.test.js","sourceRoot":"","sources":["../../src/__tests__/mapping-validation.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for MappingWorkspace validation logic\n * Covers: UnmappedRequiredCount, HasKeyField, MappingValidation, ActiveEditableFields\n * Tests pure logic extracted from the component's computed properties.\n */\nimport { describe, it, expect } from 'vitest';\n\n/** Mirrors the EditableFieldMap interface from the mapping workspace */\ninterface EditableFieldMap {\n ID: string | null;\n SourceFieldName: string;\n SourceFieldLabel: string;\n SourceFieldType: string;\n DestinationFieldName: string;\n DestinationFieldLabel: string;\n IsKeyField: boolean;\n IsRequired: boolean;\n Direction: 'Both' | 'DestToSource' | 'SourceToDest';\n Status: 'Active' | 'Inactive';\n IsNew: boolean;\n IsDirty: boolean;\n}\n\nfunction createField(overrides: Partial<EditableFieldMap> = {}): EditableFieldMap {\n return {\n ID: 'fm-1',\n SourceFieldName: 'source_field',\n SourceFieldLabel: 'Source Field',\n SourceFieldType: 'string',\n DestinationFieldName: 'DestField',\n DestinationFieldLabel: 'Dest Field',\n IsKeyField: false,\n IsRequired: false,\n Direction: 'SourceToDest',\n Status: 'Active',\n IsNew: false,\n IsDirty: false,\n ...overrides\n };\n}\n\n// Replicates the component's computed properties as pure functions\nfunction getActiveFields(fields: EditableFieldMap[]): EditableFieldMap[] {\n return fields.filter(f => f.Status !== 'Inactive');\n}\n\nfunction getUnmappedRequiredCount(fields: EditableFieldMap[]): number {\n return fields.filter(\n f => f.Status === 'Active' && f.IsRequired && !f.DestinationFieldName\n ).length;\n}\n\nfunction getHasKeyField(fields: EditableFieldMap[]): boolean {\n return fields.some(f => f.Status === 'Active' && f.IsKeyField);\n}\n\nfunction getMappingValidation(fields: EditableFieldMap[]): { IsValid: boolean; Warnings: string[] } {\n const warnings: string[] = [];\n const unmappedRequired = getUnmappedRequiredCount(fields);\n if (unmappedRequired > 0) {\n warnings.push(`${unmappedRequired} required field(s) missing destination mapping`);\n }\n const activeFields = getActiveFields(fields);\n if (!getHasKeyField(fields) && activeFields.length > 0) {\n warnings.push('No key field configured — sync may create duplicates');\n }\n return { IsValid: warnings.length === 0, Warnings: warnings };\n}\n\ndescribe('MappingWorkspace Validation', () => {\n\n describe('ActiveEditableFields', () => {\n it('should return only active fields', () => {\n const fields = [\n createField({ Status: 'Active' }),\n createField({ Status: 'Inactive' }),\n createField({ Status: 'Active' }),\n ];\n expect(getActiveFields(fields)).toHaveLength(2);\n });\n\n it('should return empty array when all fields are inactive', () => {\n const fields = [\n createField({ Status: 'Inactive' }),\n createField({ Status: 'Inactive' }),\n ];\n expect(getActiveFields(fields)).toHaveLength(0);\n });\n\n it('should return empty array for no fields', () => {\n expect(getActiveFields([])).toHaveLength(0);\n });\n });\n\n describe('UnmappedRequiredCount', () => {\n it('should return 0 when no required fields are unmapped', () => {\n const fields = [\n createField({ IsRequired: true, DestinationFieldName: 'Mapped' }),\n createField({ IsRequired: false, DestinationFieldName: '' }),\n ];\n expect(getUnmappedRequiredCount(fields)).toBe(0);\n });\n\n it('should count required fields with empty destination', () => {\n const fields = [\n createField({ IsRequired: true, DestinationFieldName: '' }),\n createField({ IsRequired: true, DestinationFieldName: '' }),\n createField({ IsRequired: true, DestinationFieldName: 'Name' }),\n ];\n expect(getUnmappedRequiredCount(fields)).toBe(2);\n });\n\n it('should ignore inactive required fields', () => {\n const fields = [\n createField({ IsRequired: true, DestinationFieldName: '', Status: 'Inactive' }),\n createField({ IsRequired: true, DestinationFieldName: '' }),\n ];\n expect(getUnmappedRequiredCount(fields)).toBe(1);\n });\n\n it('should return 0 for empty field list', () => {\n expect(getUnmappedRequiredCount([])).toBe(0);\n });\n });\n\n describe('HasKeyField', () => {\n it('should return true when an active key field exists', () => {\n const fields = [\n createField({ IsKeyField: false }),\n createField({ IsKeyField: true }),\n ];\n expect(getHasKeyField(fields)).toBe(true);\n });\n\n it('should return false when no key fields exist', () => {\n const fields = [\n createField({ IsKeyField: false }),\n createField({ IsKeyField: false }),\n ];\n expect(getHasKeyField(fields)).toBe(false);\n });\n\n it('should ignore inactive key fields', () => {\n const fields = [\n createField({ IsKeyField: true, Status: 'Inactive' }),\n ];\n expect(getHasKeyField(fields)).toBe(false);\n });\n\n it('should return false for empty list', () => {\n expect(getHasKeyField([])).toBe(false);\n });\n });\n\n describe('MappingValidation', () => {\n it('should be valid when all required fields are mapped and a key exists', () => {\n const fields = [\n createField({ IsRequired: true, DestinationFieldName: 'Email', IsKeyField: true }),\n createField({ IsRequired: false, DestinationFieldName: 'Name' }),\n ];\n const result = getMappingValidation(fields);\n expect(result.IsValid).toBe(true);\n expect(result.Warnings).toHaveLength(0);\n });\n\n it('should warn about unmapped required fields', () => {\n const fields = [\n createField({ IsRequired: true, DestinationFieldName: '', IsKeyField: true }),\n ];\n const result = getMappingValidation(fields);\n expect(result.IsValid).toBe(false);\n expect(result.Warnings).toHaveLength(1);\n expect(result.Warnings[0]).toContain('1 required field(s) missing');\n });\n\n it('should warn about missing key field when active fields exist', () => {\n const fields = [\n createField({ IsKeyField: false, DestinationFieldName: 'Name' }),\n ];\n const result = getMappingValidation(fields);\n expect(result.IsValid).toBe(false);\n expect(result.Warnings).toHaveLength(1);\n expect(result.Warnings[0]).toContain('No key field configured');\n });\n\n it('should report both warnings when both issues exist', () => {\n const fields = [\n createField({ IsRequired: true, DestinationFieldName: '', IsKeyField: false }),\n createField({ IsRequired: false, DestinationFieldName: 'Name', IsKeyField: false }),\n ];\n const result = getMappingValidation(fields);\n expect(result.IsValid).toBe(false);\n expect(result.Warnings).toHaveLength(2);\n });\n\n it('should be valid (no warnings) for empty field list', () => {\n const result = getMappingValidation([]);\n expect(result.IsValid).toBe(true);\n expect(result.Warnings).toHaveLength(0);\n });\n\n it('should not warn about key field when no active fields exist', () => {\n const fields = [\n createField({ Status: 'Inactive', IsKeyField: false }),\n ];\n const result = getMappingValidation(fields);\n expect(result.IsValid).toBe(true);\n });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scheduling.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scheduling.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
// Mock Angular core to avoid JIT compilation errors
|
|
3
|
-
vi.mock('@angular/core', () => ({
|
|
4
|
-
Injectable: () => (target) => target,
|
|
5
|
-
Component: () => (target) => target,
|
|
6
|
-
Directive: () => (target) => target,
|
|
7
|
-
NgModule: () => (target) => target,
|
|
8
|
-
Input: () => () => { },
|
|
9
|
-
Output: () => () => { },
|
|
10
|
-
EventEmitter: class {
|
|
11
|
-
emit() { }
|
|
12
|
-
},
|
|
13
|
-
ChangeDetectorRef: class {
|
|
14
|
-
detectChanges() { }
|
|
15
|
-
markForCheck() { }
|
|
16
|
-
},
|
|
17
|
-
ChangeDetectionStrategy: { OnPush: 1 },
|
|
18
|
-
ViewChild: () => () => { },
|
|
19
|
-
ElementRef: class {
|
|
20
|
-
},
|
|
21
|
-
OnInit: class {
|
|
22
|
-
},
|
|
23
|
-
OnDestroy: class {
|
|
24
|
-
},
|
|
25
|
-
AfterViewInit: class {
|
|
26
|
-
},
|
|
27
|
-
Injector: class {
|
|
28
|
-
},
|
|
29
|
-
ViewEncapsulation: { None: 0 },
|
|
30
|
-
inject: () => ({}),
|
|
31
|
-
}));
|
|
32
|
-
// Mock other Angular and MJ dependencies
|
|
33
|
-
vi.mock('@angular/forms', () => ({}));
|
|
34
|
-
vi.mock('rxjs', () => ({
|
|
35
|
-
Subject: class {
|
|
36
|
-
next() { }
|
|
37
|
-
complete() { }
|
|
38
|
-
pipe() { return this; }
|
|
39
|
-
subscribe() { return this; }
|
|
40
|
-
},
|
|
41
|
-
BehaviorSubject: class {
|
|
42
|
-
next() { }
|
|
43
|
-
pipe() { return this; }
|
|
44
|
-
subscribe() { return this; }
|
|
45
|
-
getValue() { }
|
|
46
|
-
},
|
|
47
|
-
}));
|
|
48
|
-
vi.mock('rxjs/operators', () => ({
|
|
49
|
-
takeUntil: () => (source) => source,
|
|
50
|
-
}));
|
|
51
|
-
vi.mock('@memberjunction/core', () => ({
|
|
52
|
-
BaseEntity: class {
|
|
53
|
-
},
|
|
54
|
-
CompositeKey: class {
|
|
55
|
-
},
|
|
56
|
-
Metadata: class {
|
|
57
|
-
},
|
|
58
|
-
RunView: class {
|
|
59
|
-
RunView() { return { Success: false, Results: [] }; }
|
|
60
|
-
RunViews() { return []; }
|
|
61
|
-
},
|
|
62
|
-
}));
|
|
63
|
-
vi.mock('@memberjunction/core-entities', () => ({
|
|
64
|
-
ResourceData: class {
|
|
65
|
-
},
|
|
66
|
-
KnowledgeHubMetadataEngine: { Instance: {} },
|
|
67
|
-
MJContentSourceEntity: class {
|
|
68
|
-
},
|
|
69
|
-
MJContentSourceTypeEntity_IContentSourceTypeField: class {
|
|
70
|
-
},
|
|
71
|
-
MJScheduledActionEntity: class {
|
|
72
|
-
},
|
|
73
|
-
MJScheduledActionParamEntity: class {
|
|
74
|
-
},
|
|
75
|
-
MJContentItemDuplicateEntity: class {
|
|
76
|
-
},
|
|
77
|
-
UserInfoEngine: { Instance: { Config: vi.fn() } },
|
|
78
|
-
}));
|
|
79
|
-
vi.mock('@memberjunction/global', () => ({
|
|
80
|
-
RegisterClass: () => (target) => target,
|
|
81
|
-
UUIDsEqual: vi.fn(),
|
|
82
|
-
NormalizeUUID: vi.fn((x) => x),
|
|
83
|
-
}));
|
|
84
|
-
vi.mock('@memberjunction/ng-shared', () => ({
|
|
85
|
-
BaseResourceComponent: class {
|
|
86
|
-
},
|
|
87
|
-
NavigationService: class {
|
|
88
|
-
},
|
|
89
|
-
}));
|
|
90
|
-
vi.mock('@memberjunction/graphql-dataprovider', () => ({
|
|
91
|
-
GraphQLDataProvider: class {
|
|
92
|
-
},
|
|
93
|
-
GraphQLAIClient: class {
|
|
94
|
-
},
|
|
95
|
-
}));
|
|
96
|
-
vi.mock('@memberjunction/ng-notifications', () => ({
|
|
97
|
-
MJNotificationService: { Instance: { CreateSimpleNotification: vi.fn() } },
|
|
98
|
-
}));
|
|
99
|
-
vi.mock('@memberjunction/ai-engine-base', () => ({
|
|
100
|
-
AIEngineBase: { Instance: { Prompts: [] } },
|
|
101
|
-
}));
|
|
102
|
-
vi.mock('@memberjunction/ng-word-cloud', () => ({
|
|
103
|
-
WordCloudItem: class {
|
|
104
|
-
},
|
|
105
|
-
}));
|
|
106
|
-
vi.mock('@memberjunction/ng-trees', () => ({
|
|
107
|
-
TreeBranchConfig: class {
|
|
108
|
-
},
|
|
109
|
-
TreeLeafConfig: class {
|
|
110
|
-
},
|
|
111
|
-
}));
|
|
112
|
-
import { CronToHumanReadable } from '../AI/components/autotagging/autotagging-pipeline-resource.component';
|
|
113
|
-
describe('CronToHumanReadable', () => {
|
|
114
|
-
describe('every N minutes patterns', () => {
|
|
115
|
-
it('should parse "every minute" pattern', () => {
|
|
116
|
-
expect(CronToHumanReadable('*/1 * * * *')).toBe('Every minute');
|
|
117
|
-
});
|
|
118
|
-
it('should parse "every 15 minutes" pattern', () => {
|
|
119
|
-
expect(CronToHumanReadable('*/15 * * * *')).toBe('Every 15 minutes');
|
|
120
|
-
});
|
|
121
|
-
it('should parse "every 5 minutes" pattern', () => {
|
|
122
|
-
expect(CronToHumanReadable('*/5 * * * *')).toBe('Every 5 minutes');
|
|
123
|
-
});
|
|
124
|
-
it('should parse "every 30 minutes" pattern', () => {
|
|
125
|
-
expect(CronToHumanReadable('*/30 * * * *')).toBe('Every 30 minutes');
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
describe('hourly patterns', () => {
|
|
129
|
-
it('should parse "every hour" pattern (minute 0)', () => {
|
|
130
|
-
expect(CronToHumanReadable('0 * * * *')).toBe('Every hour');
|
|
131
|
-
});
|
|
132
|
-
it('should parse "every hour" pattern (minute 30)', () => {
|
|
133
|
-
expect(CronToHumanReadable('30 * * * *')).toBe('Every hour');
|
|
134
|
-
});
|
|
135
|
-
it('should parse "every 2 hours" pattern', () => {
|
|
136
|
-
expect(CronToHumanReadable('0 */2 * * *')).toBe('Every 2 hours');
|
|
137
|
-
});
|
|
138
|
-
it('should parse "every 6 hours" pattern', () => {
|
|
139
|
-
expect(CronToHumanReadable('0 */6 * * *')).toBe('Every 6 hours');
|
|
140
|
-
});
|
|
141
|
-
it('should parse "every 1 hour" as "every hour"', () => {
|
|
142
|
-
expect(CronToHumanReadable('0 */1 * * *')).toBe('Every hour');
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
describe('daily patterns', () => {
|
|
146
|
-
it('should parse "daily at 2:00 AM"', () => {
|
|
147
|
-
expect(CronToHumanReadable('0 2 * * *')).toBe('Daily at 2:00 AM');
|
|
148
|
-
});
|
|
149
|
-
it('should parse "daily at 12:00 PM"', () => {
|
|
150
|
-
expect(CronToHumanReadable('0 12 * * *')).toBe('Daily at 12:00 PM');
|
|
151
|
-
});
|
|
152
|
-
it('should parse "daily at 12:00 AM" (midnight)', () => {
|
|
153
|
-
expect(CronToHumanReadable('0 0 * * *')).toBe('Daily at 12:00 AM');
|
|
154
|
-
});
|
|
155
|
-
it('should parse "daily at 11:30 PM"', () => {
|
|
156
|
-
expect(CronToHumanReadable('30 23 * * *')).toBe('Daily at 11:30 PM');
|
|
157
|
-
});
|
|
158
|
-
it('should parse "daily at 5:15 AM"', () => {
|
|
159
|
-
expect(CronToHumanReadable('15 5 * * *')).toBe('Daily at 5:15 AM');
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
describe('weekly patterns', () => {
|
|
163
|
-
it('should parse "weekly on Monday at 2:00 AM"', () => {
|
|
164
|
-
expect(CronToHumanReadable('0 2 * * 1')).toBe('Weekly on Monday at 2:00 AM');
|
|
165
|
-
});
|
|
166
|
-
it('should parse "weekly on Sunday at 12:00 AM"', () => {
|
|
167
|
-
expect(CronToHumanReadable('0 0 * * 0')).toBe('Weekly on Sunday at 12:00 AM');
|
|
168
|
-
});
|
|
169
|
-
it('should parse "weekly on Friday at 6:00 PM"', () => {
|
|
170
|
-
expect(CronToHumanReadable('0 18 * * 5')).toBe('Weekly on Friday at 6:00 PM');
|
|
171
|
-
});
|
|
172
|
-
it('should handle day-of-week 7 as Sunday', () => {
|
|
173
|
-
expect(CronToHumanReadable('0 9 * * 7')).toBe('Weekly on Sunday at 9:00 AM');
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
describe('monthly patterns', () => {
|
|
177
|
-
it('should parse "monthly on day 1 at 12:00 AM"', () => {
|
|
178
|
-
expect(CronToHumanReadable('0 0 1 * *')).toBe('Monthly on day 1 at 12:00 AM');
|
|
179
|
-
});
|
|
180
|
-
it('should parse "monthly on day 15 at 3:00 AM"', () => {
|
|
181
|
-
expect(CronToHumanReadable('0 3 15 * *')).toBe('Monthly on day 15 at 3:00 AM');
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
describe('6-part cron expressions (with seconds)', () => {
|
|
185
|
-
it('should handle 6-part cron by discarding seconds field', () => {
|
|
186
|
-
expect(CronToHumanReadable('0 0 2 * * *')).toBe('Daily at 2:00 AM');
|
|
187
|
-
});
|
|
188
|
-
it('should handle 6-part weekly cron', () => {
|
|
189
|
-
expect(CronToHumanReadable('0 0 9 * * 1')).toBe('Weekly on Monday at 9:00 AM');
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
describe('fallback behavior', () => {
|
|
193
|
-
it('should return raw cron for unrecognized patterns', () => {
|
|
194
|
-
const raw = '*/5 */2 1 6 3';
|
|
195
|
-
expect(CronToHumanReadable(raw)).toBe(raw);
|
|
196
|
-
});
|
|
197
|
-
it('should return "No schedule" for empty string', () => {
|
|
198
|
-
expect(CronToHumanReadable('')).toBe('No schedule');
|
|
199
|
-
});
|
|
200
|
-
it('should return raw cron for invalid part count', () => {
|
|
201
|
-
expect(CronToHumanReadable('* * *')).toBe('* * *');
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
//# sourceMappingURL=scheduling.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scheduling.test.js","sourceRoot":"","sources":["../../src/__tests__/scheduling.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect, vi, beforeAll } from 'vitest';\n\n// Mock Angular core to avoid JIT compilation errors\nvi.mock('@angular/core', () => ({\n Injectable: () => (target: Function) => target,\n Component: () => (target: Function) => target,\n Directive: () => (target: Function) => target,\n NgModule: () => (target: Function) => target,\n Input: () => () => {},\n Output: () => () => {},\n EventEmitter: class { emit() {} },\n ChangeDetectorRef: class { detectChanges() {} markForCheck() {} },\n ChangeDetectionStrategy: { OnPush: 1 },\n ViewChild: () => () => {},\n ElementRef: class {},\n OnInit: class {},\n OnDestroy: class {},\n AfterViewInit: class {},\n Injector: class {},\n ViewEncapsulation: { None: 0 },\n inject: () => ({}),\n}));\n\n// Mock other Angular and MJ dependencies\nvi.mock('@angular/forms', () => ({}));\nvi.mock('rxjs', () => ({\n Subject: class { next() {} complete() {} pipe() { return this; } subscribe() { return this; } },\n BehaviorSubject: class { next() {} pipe() { return this; } subscribe() { return this; } getValue() {} },\n}));\nvi.mock('rxjs/operators', () => ({\n takeUntil: () => (source: unknown) => source,\n}));\nvi.mock('@memberjunction/core', () => ({\n BaseEntity: class {},\n CompositeKey: class {},\n Metadata: class {},\n RunView: class { RunView() { return { Success: false, Results: [] }; } RunViews() { return []; } },\n}));\nvi.mock('@memberjunction/core-entities', () => ({\n ResourceData: class {},\n KnowledgeHubMetadataEngine: { Instance: {} },\n MJContentSourceEntity: class {},\n MJContentSourceTypeEntity_IContentSourceTypeField: class {},\n MJScheduledActionEntity: class {},\n MJScheduledActionParamEntity: class {},\n MJContentItemDuplicateEntity: class {},\n UserInfoEngine: { Instance: { Config: vi.fn() } },\n}));\nvi.mock('@memberjunction/global', () => ({\n RegisterClass: () => (target: Function) => target,\n UUIDsEqual: vi.fn(),\n NormalizeUUID: vi.fn((x: string) => x),\n}));\nvi.mock('@memberjunction/ng-shared', () => ({\n BaseResourceComponent: class {},\n NavigationService: class {},\n}));\nvi.mock('@memberjunction/graphql-dataprovider', () => ({\n GraphQLDataProvider: class {},\n GraphQLAIClient: class {},\n}));\nvi.mock('@memberjunction/ng-notifications', () => ({\n MJNotificationService: { Instance: { CreateSimpleNotification: vi.fn() } },\n}));\nvi.mock('@memberjunction/ai-engine-base', () => ({\n AIEngineBase: { Instance: { Prompts: [] } },\n}));\nvi.mock('@memberjunction/ng-word-cloud', () => ({\n WordCloudItem: class {},\n}));\nvi.mock('@memberjunction/ng-trees', () => ({\n TreeBranchConfig: class {},\n TreeLeafConfig: class {},\n}));\n\nimport { CronToHumanReadable } from '../AI/components/autotagging/autotagging-pipeline-resource.component';\n\ndescribe('CronToHumanReadable', () => {\n describe('every N minutes patterns', () => {\n it('should parse \"every minute\" pattern', () => {\n expect(CronToHumanReadable('*/1 * * * *')).toBe('Every minute');\n });\n\n it('should parse \"every 15 minutes\" pattern', () => {\n expect(CronToHumanReadable('*/15 * * * *')).toBe('Every 15 minutes');\n });\n\n it('should parse \"every 5 minutes\" pattern', () => {\n expect(CronToHumanReadable('*/5 * * * *')).toBe('Every 5 minutes');\n });\n\n it('should parse \"every 30 minutes\" pattern', () => {\n expect(CronToHumanReadable('*/30 * * * *')).toBe('Every 30 minutes');\n });\n });\n\n describe('hourly patterns', () => {\n it('should parse \"every hour\" pattern (minute 0)', () => {\n expect(CronToHumanReadable('0 * * * *')).toBe('Every hour');\n });\n\n it('should parse \"every hour\" pattern (minute 30)', () => {\n expect(CronToHumanReadable('30 * * * *')).toBe('Every hour');\n });\n\n it('should parse \"every 2 hours\" pattern', () => {\n expect(CronToHumanReadable('0 */2 * * *')).toBe('Every 2 hours');\n });\n\n it('should parse \"every 6 hours\" pattern', () => {\n expect(CronToHumanReadable('0 */6 * * *')).toBe('Every 6 hours');\n });\n\n it('should parse \"every 1 hour\" as \"every hour\"', () => {\n expect(CronToHumanReadable('0 */1 * * *')).toBe('Every hour');\n });\n });\n\n describe('daily patterns', () => {\n it('should parse \"daily at 2:00 AM\"', () => {\n expect(CronToHumanReadable('0 2 * * *')).toBe('Daily at 2:00 AM');\n });\n\n it('should parse \"daily at 12:00 PM\"', () => {\n expect(CronToHumanReadable('0 12 * * *')).toBe('Daily at 12:00 PM');\n });\n\n it('should parse \"daily at 12:00 AM\" (midnight)', () => {\n expect(CronToHumanReadable('0 0 * * *')).toBe('Daily at 12:00 AM');\n });\n\n it('should parse \"daily at 11:30 PM\"', () => {\n expect(CronToHumanReadable('30 23 * * *')).toBe('Daily at 11:30 PM');\n });\n\n it('should parse \"daily at 5:15 AM\"', () => {\n expect(CronToHumanReadable('15 5 * * *')).toBe('Daily at 5:15 AM');\n });\n });\n\n describe('weekly patterns', () => {\n it('should parse \"weekly on Monday at 2:00 AM\"', () => {\n expect(CronToHumanReadable('0 2 * * 1')).toBe('Weekly on Monday at 2:00 AM');\n });\n\n it('should parse \"weekly on Sunday at 12:00 AM\"', () => {\n expect(CronToHumanReadable('0 0 * * 0')).toBe('Weekly on Sunday at 12:00 AM');\n });\n\n it('should parse \"weekly on Friday at 6:00 PM\"', () => {\n expect(CronToHumanReadable('0 18 * * 5')).toBe('Weekly on Friday at 6:00 PM');\n });\n\n it('should handle day-of-week 7 as Sunday', () => {\n expect(CronToHumanReadable('0 9 * * 7')).toBe('Weekly on Sunday at 9:00 AM');\n });\n });\n\n describe('monthly patterns', () => {\n it('should parse \"monthly on day 1 at 12:00 AM\"', () => {\n expect(CronToHumanReadable('0 0 1 * *')).toBe('Monthly on day 1 at 12:00 AM');\n });\n\n it('should parse \"monthly on day 15 at 3:00 AM\"', () => {\n expect(CronToHumanReadable('0 3 15 * *')).toBe('Monthly on day 15 at 3:00 AM');\n });\n });\n\n describe('6-part cron expressions (with seconds)', () => {\n it('should handle 6-part cron by discarding seconds field', () => {\n expect(CronToHumanReadable('0 0 2 * * *')).toBe('Daily at 2:00 AM');\n });\n\n it('should handle 6-part weekly cron', () => {\n expect(CronToHumanReadable('0 0 9 * * 1')).toBe('Weekly on Monday at 9:00 AM');\n });\n });\n\n describe('fallback behavior', () => {\n it('should return raw cron for unrecognized patterns', () => {\n const raw = '*/5 */2 1 6 3';\n expect(CronToHumanReadable(raw)).toBe(raw);\n });\n\n it('should return \"No schedule\" for empty string', () => {\n expect(CronToHumanReadable('')).toBe('No schedule');\n });\n\n it('should return raw cron for invalid part count', () => {\n expect(CronToHumanReadable('* * *')).toBe('* * *');\n });\n });\n});\n"]}
|