@memberjunction/ng-dashboards 2.117.0 → 2.119.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/Testing/components/testing-analytics.component.d.ts +56 -0
  2. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -0
  3. package/dist/Testing/components/testing-analytics.component.js +746 -0
  4. package/dist/Testing/components/testing-analytics.component.js.map +1 -0
  5. package/dist/Testing/components/testing-execution.component.d.ts +59 -0
  6. package/dist/Testing/components/testing-execution.component.d.ts.map +1 -0
  7. package/dist/Testing/components/testing-execution.component.js +647 -0
  8. package/dist/Testing/components/testing-execution.component.js.map +1 -0
  9. package/dist/Testing/components/testing-feedback.component.d.ts +55 -0
  10. package/dist/Testing/components/testing-feedback.component.d.ts.map +1 -0
  11. package/dist/Testing/components/testing-feedback.component.js +788 -0
  12. package/dist/Testing/components/testing-feedback.component.js.map +1 -0
  13. package/dist/Testing/components/testing-overview.component.d.ts +30 -0
  14. package/dist/Testing/components/testing-overview.component.d.ts.map +1 -0
  15. package/dist/Testing/components/testing-overview.component.js +341 -0
  16. package/dist/Testing/components/testing-overview.component.js.map +1 -0
  17. package/dist/Testing/components/testing-version-comparison.component.d.ts +58 -0
  18. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +1 -0
  19. package/dist/Testing/components/testing-version-comparison.component.js +801 -0
  20. package/dist/Testing/components/testing-version-comparison.component.js.map +1 -0
  21. package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts +20 -0
  22. package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts.map +1 -0
  23. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +278 -0
  24. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -0
  25. package/dist/Testing/components/widgets/suite-tree.component.d.ts +28 -0
  26. package/dist/Testing/components/widgets/suite-tree.component.d.ts.map +1 -0
  27. package/dist/Testing/components/widgets/suite-tree.component.js +275 -0
  28. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -0
  29. package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts +34 -0
  30. package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -0
  31. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +371 -0
  32. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -0
  33. package/dist/Testing/services/testing-instrumentation.service.d.ts +152 -0
  34. package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -0
  35. package/dist/Testing/services/testing-instrumentation.service.js +579 -0
  36. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -0
  37. package/dist/Testing/testing-dashboard.component.d.ts +52 -0
  38. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -0
  39. package/dist/Testing/testing-dashboard.component.js +271 -0
  40. package/dist/Testing/testing-dashboard.component.js.map +1 -0
  41. package/dist/module.d.ts +30 -20
  42. package/dist/module.d.ts.map +1 -1
  43. package/dist/module.js +50 -9
  44. package/dist/module.js.map +1 -1
  45. package/dist/public-api.d.ts +1 -0
  46. package/dist/public-api.d.ts.map +1 -1
  47. package/dist/public-api.js +3 -0
  48. package/dist/public-api.js.map +1 -1
  49. package/package.json +13 -10
@@ -0,0 +1,579 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, from, combineLatest } from 'rxjs';
3
+ import { switchMap, shareReplay, tap } from 'rxjs/operators';
4
+ import { RunView, Metadata } from '@memberjunction/core';
5
+ import { TestEngineBase } from '@memberjunction/testing-engine-base';
6
+ import * as i0 from "@angular/core";
7
+ export class TestingInstrumentationService {
8
+ _dateRange$ = new BehaviorSubject({
9
+ start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), // Last 30 days
10
+ end: new Date()
11
+ });
12
+ _suiteFilter$ = new BehaviorSubject(null);
13
+ _testTypeFilter$ = new BehaviorSubject(null);
14
+ _refreshTrigger$ = new BehaviorSubject(0);
15
+ _isLoading$ = new BehaviorSubject(false);
16
+ metadata = new Metadata();
17
+ // Expose observables
18
+ isLoading$ = this._isLoading$.asObservable();
19
+ dateRange$ = this._dateRange$.asObservable();
20
+ constructor() { }
21
+ // Main data streams
22
+ kpis$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadKPIs())), tap(() => this.checkLoadingComplete()), shareReplay(1));
23
+ testRuns$ = combineLatest([
24
+ this._refreshTrigger$,
25
+ this._dateRange$,
26
+ this._suiteFilter$,
27
+ this._testTypeFilter$
28
+ ]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadTestRuns())), tap(() => this.checkLoadingComplete()), shareReplay(1));
29
+ suiteHierarchy$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadSuiteHierarchy())), tap(() => this.checkLoadingComplete()), shareReplay(1));
30
+ trends$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadTrends())), tap(() => this.checkLoadingComplete()), shareReplay(1));
31
+ analytics$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadAnalytics())), tap(() => this.checkLoadingComplete()), shareReplay(1));
32
+ pendingFeedback$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadPendingFeedback())), tap(() => this.checkLoadingComplete()), shareReplay(1));
33
+ feedbackStats$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(tap(() => this._isLoading$.next(true)), switchMap(() => from(this.loadFeedbackStats())), tap(() => this.checkLoadingComplete()), shareReplay(1));
34
+ checkLoadingComplete() {
35
+ setTimeout(() => {
36
+ this._isLoading$.next(false);
37
+ }, 100);
38
+ }
39
+ setDateRange(start, end) {
40
+ this._dateRange$.next({ start, end });
41
+ }
42
+ setSuiteFilter(suiteId) {
43
+ this._suiteFilter$.next(suiteId);
44
+ }
45
+ setTestTypeFilter(typeId) {
46
+ this._testTypeFilter$.next(typeId);
47
+ }
48
+ refresh() {
49
+ this._refreshTrigger$.next(this._refreshTrigger$.value + 1);
50
+ }
51
+ async loadKPIs() {
52
+ const { start, end } = this._dateRange$.value;
53
+ const rv = new RunView();
54
+ // Get Tests from TestEngineBase cache instead of querying DB
55
+ const engine = TestEngineBase.Instance;
56
+ const activeTests = engine.Tests.filter(t => t.Status === 'Active');
57
+ // Only load runs via RunView (not cached in engine)
58
+ const [testRunsResult, suiteRunsResult] = await rv.RunViews([
59
+ {
60
+ EntityName: 'MJ: Test Runs',
61
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
62
+ ResultType: 'entity_object'
63
+ },
64
+ {
65
+ EntityName: 'MJ: Test Suite Runs',
66
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
67
+ ResultType: 'entity_object'
68
+ }
69
+ ]);
70
+ const testRuns = testRunsResult.Results;
71
+ const suiteRuns = suiteRunsResult.Results;
72
+ // Calculate KPIs
73
+ const totalTestsActive = activeTests.length;
74
+ const totalTestRuns = testRuns.length;
75
+ const passedRuns = testRuns.filter(r => r.Status === 'Passed');
76
+ const failedRuns = testRuns.filter(r => r.Status === 'Failed');
77
+ const skippedRuns = testRuns.filter(r => r.Status === 'Skipped');
78
+ const passRateThisMonth = totalTestRuns > 0 ? (passedRuns.length / totalTestRuns) * 100 : 0;
79
+ const totalCostThisMonth = testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);
80
+ const completedRuns = testRuns.filter(r => r.CompletedAt != null && r.StartedAt != null);
81
+ const averageDuration = completedRuns.length > 0
82
+ ? completedRuns.reduce((sum, r) => {
83
+ const duration = new Date(r.CompletedAt).getTime() - new Date(r.StartedAt).getTime();
84
+ return sum + duration;
85
+ }, 0) / completedRuns.length
86
+ : 0;
87
+ // Count tests pending review (no feedback)
88
+ const testsPendingReview = await this.countTestsPendingReview(testRuns);
89
+ // Calculate trend (compare to previous period)
90
+ const periodDuration = end.getTime() - start.getTime();
91
+ const previousStart = new Date(start.getTime() - periodDuration);
92
+ const previousEnd = new Date(start.getTime());
93
+ const previousRunsResult = await rv.RunView({
94
+ EntityName: 'MJ: Test Runs',
95
+ ExtraFilter: `StartedAt >= '${previousStart.toISOString()}' AND StartedAt < '${previousEnd.toISOString()}'`,
96
+ ResultType: 'entity_object'
97
+ });
98
+ const previousRuns = previousRunsResult.Results || [];
99
+ const previousPassRate = previousRuns.length > 0
100
+ ? (previousRuns.filter(r => r.Status === 'Passed').length / previousRuns.length) * 100
101
+ : 0;
102
+ const passRateTrend = previousPassRate > 0 ? passRateThisMonth - previousPassRate : 0;
103
+ return {
104
+ totalTestsActive,
105
+ passRateThisMonth,
106
+ totalCostThisMonth,
107
+ averageDuration,
108
+ testsPendingReview,
109
+ totalTestRuns,
110
+ failedTests: failedRuns.length,
111
+ skippedTests: skippedRuns.length,
112
+ passRateTrend
113
+ };
114
+ }
115
+ async countTestsPendingReview(testRuns) {
116
+ if (testRuns.length === 0)
117
+ return 0;
118
+ const rv = new RunView();
119
+ const testRunIDs = testRuns.map(r => r.ID).join("','");
120
+ const feedbackResult = await rv.RunView({
121
+ EntityName: 'MJ: Test Run Feedbacks',
122
+ ExtraFilter: `TestRunID IN ('${testRunIDs}')`,
123
+ ResultType: 'entity_object'
124
+ });
125
+ const feedbackTestRunIDs = new Set((feedbackResult.Results || []).map(f => f.TestRunID));
126
+ return testRuns.filter(r => !feedbackTestRunIDs.has(r.ID)).length;
127
+ }
128
+ async loadTestRuns() {
129
+ const { start, end } = this._dateRange$.value;
130
+ const suiteFilter = this._suiteFilter$.value;
131
+ const typeFilter = this._testTypeFilter$.value;
132
+ let filter = `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`;
133
+ if (suiteFilter) {
134
+ // Need to join through TestSuiteTest
135
+ filter += ` AND TestID IN (SELECT TestID FROM [__mj].[vwTestSuiteTests] WHERE TestSuiteID = '${suiteFilter}')`;
136
+ }
137
+ if (typeFilter) {
138
+ filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;
139
+ }
140
+ const rv = new RunView();
141
+ const result = await rv.RunView({
142
+ EntityName: 'MJ: Test Runs',
143
+ ExtraFilter: filter,
144
+ OrderBy: 'StartedAt DESC',
145
+ MaxRows: 1000,
146
+ ResultType: 'entity_object'
147
+ });
148
+ const testRuns = result.Results || [];
149
+ return testRuns.map(run => ({
150
+ id: run.ID,
151
+ testId: run.TestID || '',
152
+ testName: run.Test || 'Unknown Test',
153
+ suiteName: '', // Will be populated from join
154
+ testType: run.Test || 'Unknown',
155
+ status: run.Status,
156
+ score: run.Score || 0,
157
+ duration: run.CompletedAt && run.StartedAt
158
+ ? new Date(run.CompletedAt).getTime() - new Date(run.StartedAt).getTime()
159
+ : (run.StartedAt ? Date.now() - new Date(run.StartedAt).getTime() : 0),
160
+ cost: run.CostUSD || 0,
161
+ runDateTime: run.StartedAt ? new Date(run.StartedAt) : new Date(),
162
+ targetType: run.TargetType || '',
163
+ targetLogID: run.TargetLogID || ''
164
+ }));
165
+ }
166
+ async loadSuiteHierarchy() {
167
+ const { start, end } = this._dateRange$.value;
168
+ const rv = new RunView();
169
+ // Get Test Suites from TestEngineBase cache instead of querying DB
170
+ const engine = TestEngineBase.Instance;
171
+ const suites = engine.TestSuites.filter(s => s.Status === 'Active');
172
+ // Only load test runs via RunView (not cached in engine)
173
+ const testRunsResult = await rv.RunView({
174
+ EntityName: 'MJ: Test Runs',
175
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
176
+ ResultType: 'entity_object'
177
+ });
178
+ const testRuns = testRunsResult.Results || [];
179
+ // Build hierarchy
180
+ const nodes = suites.map(suite => ({
181
+ id: suite.ID,
182
+ name: suite.Name,
183
+ parentID: suite.ParentID || null,
184
+ level: 0,
185
+ children: [],
186
+ testCount: 0,
187
+ passRate: 0,
188
+ totalCost: 0,
189
+ averageScore: 0,
190
+ expanded: false
191
+ }));
192
+ // Calculate metrics for each suite (simplified - would need TestSuiteTest join for accuracy)
193
+ const suiteTestRuns = new Map();
194
+ testRuns.forEach(run => {
195
+ // This is simplified - would need to query TestSuiteTest to get actual suite membership
196
+ const suiteID = run.TestID; // Placeholder
197
+ if (!suiteTestRuns.has(suiteID)) {
198
+ suiteTestRuns.set(suiteID, []);
199
+ }
200
+ suiteTestRuns.get(suiteID).push(run);
201
+ });
202
+ nodes.forEach(node => {
203
+ const runs = suiteTestRuns.get(node.id) || [];
204
+ node.testCount = runs.length;
205
+ node.passRate = runs.length > 0
206
+ ? (runs.filter(r => r.Status === 'Passed').length / runs.length) * 100
207
+ : 0;
208
+ node.totalCost = runs.reduce((sum, r) => sum + (r.CostUSD || 0), 0);
209
+ node.averageScore = runs.length > 0
210
+ ? runs.reduce((sum, r) => sum + (r.Score || 0), 0) / runs.length
211
+ : 0;
212
+ });
213
+ // Build tree structure
214
+ const rootNodes = [];
215
+ const nodeMap = new Map();
216
+ nodes.forEach(node => nodeMap.set(node.id, node));
217
+ nodes.forEach(node => {
218
+ if (node.parentID) {
219
+ const parent = nodeMap.get(node.parentID);
220
+ if (parent) {
221
+ parent.children.push(node);
222
+ node.level = parent.level + 1;
223
+ }
224
+ else {
225
+ rootNodes.push(node);
226
+ }
227
+ }
228
+ else {
229
+ rootNodes.push(node);
230
+ }
231
+ });
232
+ return rootNodes;
233
+ }
234
+ async loadTrends() {
235
+ const { start, end } = this._dateRange$.value;
236
+ // Create time buckets
237
+ const buckets = this.createTimeBuckets(start, end);
238
+ const rv = new RunView();
239
+ // Load all test runs for the period
240
+ const result = await rv.RunView({
241
+ EntityName: 'MJ: Test Runs',
242
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
243
+ OrderBy: 'StartedAt',
244
+ ResultType: 'entity_object'
245
+ });
246
+ const allRuns = result.Results || [];
247
+ // Aggregate into buckets
248
+ const trends = buckets.map(bucketStart => {
249
+ const bucketEnd = new Date(bucketStart.getTime() + this.getBucketSize(start, end));
250
+ const bucketRuns = allRuns.filter(r => {
251
+ if (!r.StartedAt)
252
+ return false;
253
+ const runTime = new Date(r.StartedAt);
254
+ return runTime >= bucketStart && runTime < bucketEnd;
255
+ });
256
+ const passed = bucketRuns.filter(r => r.Status === 'Passed').length;
257
+ const failed = bucketRuns.filter(r => r.Status === 'Failed').length;
258
+ const skipped = bucketRuns.filter(r => r.Status === 'Skipped').length;
259
+ const errors = bucketRuns.filter(r => r.Status === 'Error').length;
260
+ const averageScore = bucketRuns.length > 0
261
+ ? bucketRuns.reduce((sum, r) => sum + (r.Score || 0), 0) / bucketRuns.length
262
+ : 0;
263
+ const totalCost = bucketRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);
264
+ const completedRuns = bucketRuns.filter(r => r.CompletedAt != null && r.StartedAt != null);
265
+ const averageDuration = completedRuns.length > 0
266
+ ? completedRuns.reduce((sum, r) => {
267
+ const duration = new Date(r.CompletedAt).getTime() - new Date(r.StartedAt).getTime();
268
+ return sum + duration;
269
+ }, 0) / completedRuns.length
270
+ : 0;
271
+ return {
272
+ timestamp: bucketStart,
273
+ totalRuns: bucketRuns.length,
274
+ passed,
275
+ failed,
276
+ skipped,
277
+ errors,
278
+ averageScore,
279
+ totalCost,
280
+ averageDuration
281
+ };
282
+ });
283
+ return trends;
284
+ }
285
+ async loadAnalytics() {
286
+ const { start, end } = this._dateRange$.value;
287
+ const rv = new RunView();
288
+ const result = await rv.RunView({
289
+ EntityName: 'MJ: Test Runs',
290
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
291
+ ResultType: 'entity_object'
292
+ });
293
+ const testRuns = result.Results || [];
294
+ // Group by test name
295
+ const testMetrics = new Map();
296
+ testRuns.forEach(run => {
297
+ const testName = run.Test || 'Unknown';
298
+ if (!testMetrics.has(testName)) {
299
+ testMetrics.set(testName, { runs: [], failures: 0 });
300
+ }
301
+ const metrics = testMetrics.get(testName);
302
+ metrics.runs.push(run);
303
+ if (run.Status === 'Failed' || run.Status === 'Error') {
304
+ metrics.failures++;
305
+ }
306
+ });
307
+ // Top failing tests
308
+ const topFailingTests = Array.from(testMetrics.entries())
309
+ .map(([testName, metrics]) => ({
310
+ testName,
311
+ failureCount: metrics.failures,
312
+ failureRate: metrics.runs.length > 0 ? (metrics.failures / metrics.runs.length) * 100 : 0
313
+ }))
314
+ .sort((a, b) => b.failureCount - a.failureCount)
315
+ .slice(0, 10);
316
+ // Most expensive tests
317
+ const mostExpensiveTests = Array.from(testMetrics.entries())
318
+ .map(([testName, metrics]) => {
319
+ const totalCost = metrics.runs.reduce((sum, r) => sum + (r.CostUSD || 0), 0);
320
+ const avgCost = metrics.runs.length > 0 ? totalCost / metrics.runs.length : 0;
321
+ return { testName, totalCost, avgCost };
322
+ })
323
+ .sort((a, b) => b.totalCost - a.totalCost)
324
+ .slice(0, 10);
325
+ // Slowest tests
326
+ const slowestTests = Array.from(testMetrics.entries())
327
+ .map(([testName, metrics]) => {
328
+ const durations = metrics.runs
329
+ .filter(r => r.CompletedAt != null && r.StartedAt != null)
330
+ .map(r => new Date(r.CompletedAt).getTime() - new Date(r.StartedAt).getTime());
331
+ const avgDuration = durations.length > 0
332
+ ? durations.reduce((sum, d) => sum + d, 0) / durations.length
333
+ : 0;
334
+ const maxDuration = durations.length > 0 ? Math.max(...durations) : 0;
335
+ return { testName, avgDuration, maxDuration };
336
+ })
337
+ .sort((a, b) => b.avgDuration - a.avgDuration)
338
+ .slice(0, 10);
339
+ // Cost by type (simplified - would need actual type data)
340
+ const typeMetrics = new Map();
341
+ testRuns.forEach(run => {
342
+ const type = run.Test || 'Unknown';
343
+ if (!typeMetrics.has(type)) {
344
+ typeMetrics.set(type, { cost: 0, count: 0 });
345
+ }
346
+ const metrics = typeMetrics.get(type);
347
+ metrics.cost += run.CostUSD || 0;
348
+ metrics.count++;
349
+ });
350
+ const costByType = Array.from(typeMetrics.entries())
351
+ .map(([testType, metrics]) => ({
352
+ testType,
353
+ totalCost: metrics.cost,
354
+ testCount: metrics.count
355
+ }))
356
+ .sort((a, b) => b.totalCost - a.totalCost);
357
+ // Passing rate by type
358
+ const typePassingMetrics = new Map();
359
+ testRuns.forEach(run => {
360
+ const type = run.Test || 'Unknown';
361
+ if (!typePassingMetrics.has(type)) {
362
+ typePassingMetrics.set(type, { total: 0, passed: 0 });
363
+ }
364
+ const metrics = typePassingMetrics.get(type);
365
+ metrics.total++;
366
+ if (run.Status === 'Passed') {
367
+ metrics.passed++;
368
+ }
369
+ });
370
+ const passingRateByType = Array.from(typePassingMetrics.entries())
371
+ .map(([testType, metrics]) => ({
372
+ testType,
373
+ passRate: metrics.total > 0 ? (metrics.passed / metrics.total) * 100 : 0,
374
+ totalTests: metrics.total
375
+ }))
376
+ .sort((a, b) => a.passRate - b.passRate);
377
+ return {
378
+ topFailingTests,
379
+ mostExpensiveTests,
380
+ slowestTests,
381
+ costByType,
382
+ costBySuite: [], // Would need suite data
383
+ passingRateByType
384
+ };
385
+ }
386
+ async loadPendingFeedback() {
387
+ const { start, end } = this._dateRange$.value;
388
+ const rv = new RunView();
389
+ const [testRunsResult, feedbackResult] = await rv.RunViews([
390
+ {
391
+ EntityName: 'MJ: Test Runs',
392
+ ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
393
+ ResultType: 'entity_object'
394
+ },
395
+ {
396
+ EntityName: 'MJ: Test Run Feedbacks',
397
+ ExtraFilter: `CreatedAt >= '${start.toISOString()}'`,
398
+ ResultType: 'entity_object'
399
+ }
400
+ ]);
401
+ const testRuns = testRunsResult.Results;
402
+ const feedbacks = feedbackResult.Results;
403
+ const feedbackMap = new Map();
404
+ feedbacks.forEach(f => feedbackMap.set(f.TestRunID, f));
405
+ const pending = [];
406
+ testRuns.forEach(run => {
407
+ const hasFeedback = feedbackMap.has(run.ID);
408
+ if (!hasFeedback) {
409
+ pending.push({
410
+ testRunID: run.ID,
411
+ testName: run.Test || 'Unknown',
412
+ automatedScore: run.Score || 0,
413
+ automatedStatus: run.Status,
414
+ runDateTime: run.StartedAt ? new Date(run.StartedAt) : new Date(),
415
+ reason: 'no-feedback'
416
+ });
417
+ }
418
+ else {
419
+ const feedback = feedbackMap.get(run.ID);
420
+ // Check for discrepancies
421
+ if (run.Status === 'Failed' && run.Score != null && run.Score >= 0.8) {
422
+ pending.push({
423
+ testRunID: run.ID,
424
+ testName: run.Test || 'Unknown',
425
+ automatedScore: run.Score,
426
+ automatedStatus: run.Status,
427
+ runDateTime: run.StartedAt ? new Date(run.StartedAt) : new Date(),
428
+ reason: 'high-score-failed'
429
+ });
430
+ }
431
+ else if (run.Status === 'Passed' && run.Score != null && run.Score < 0.5) {
432
+ pending.push({
433
+ testRunID: run.ID,
434
+ testName: run.Test || 'Unknown',
435
+ automatedScore: run.Score,
436
+ automatedStatus: run.Status,
437
+ runDateTime: run.StartedAt ? new Date(run.StartedAt) : new Date(),
438
+ reason: 'low-score-passed'
439
+ });
440
+ }
441
+ }
442
+ });
443
+ return pending.sort((a, b) => b.runDateTime.getTime() - a.runDateTime.getTime());
444
+ }
445
+ async loadFeedbackStats() {
446
+ const { start, end } = this._dateRange$.value;
447
+ const rv = new RunView();
448
+ // Load all feedback for the period
449
+ const feedbackResult = await rv.RunView({
450
+ EntityName: 'MJ: Test Run Feedbacks',
451
+ ExtraFilter: `CreatedAt >= '${start.toISOString()}' AND CreatedAt <= '${end.toISOString()}'`,
452
+ ResultType: 'entity_object'
453
+ });
454
+ const feedbacks = feedbackResult.Results || [];
455
+ const totalFeedback = feedbacks.length;
456
+ if (totalFeedback === 0) {
457
+ return {
458
+ totalFeedback: 0,
459
+ reviewedCount: 0,
460
+ avgRating: 0,
461
+ agreementRate: 0,
462
+ disagreementRate: 0,
463
+ accuracyRate: 0
464
+ };
465
+ }
466
+ // Calculate average rating
467
+ const avgRating = feedbacks.reduce((sum, f) => sum + (f.Rating || 0), 0) / totalFeedback;
468
+ // Calculate agreement/disagreement rates based on IsCorrect field
469
+ const correctCount = feedbacks.filter(f => f.IsCorrect === true).length;
470
+ const incorrectCount = feedbacks.filter(f => f.IsCorrect === false).length;
471
+ const agreementRate = (correctCount / totalFeedback) * 100;
472
+ const disagreementRate = (incorrectCount / totalFeedback) * 100;
473
+ // Accuracy rate is the same as agreement rate (% of times human agreed with automated result)
474
+ const accuracyRate = agreementRate;
475
+ return {
476
+ totalFeedback,
477
+ reviewedCount: totalFeedback, // All feedbacks in this query are reviewed
478
+ avgRating,
479
+ agreementRate,
480
+ disagreementRate,
481
+ accuracyRate
482
+ };
483
+ }
484
+ async submitFeedback(testRunID, rating, isCorrect, comments) {
485
+ try {
486
+ const feedback = await this.metadata.GetEntityObject('MJ: Test Run Feedbacks');
487
+ feedback.TestRunID = testRunID;
488
+ feedback.Rating = rating;
489
+ feedback.IsCorrect = isCorrect;
490
+ feedback.Comments = comments;
491
+ const result = await feedback.Save();
492
+ if (result) {
493
+ this.refresh(); // Refresh data after submission
494
+ return true;
495
+ }
496
+ return false;
497
+ }
498
+ catch (error) {
499
+ console.error('Error submitting feedback:', error);
500
+ return false;
501
+ }
502
+ }
503
+ async getVersionMetrics() {
504
+ const rv = new RunView();
505
+ const result = await rv.RunView({
506
+ EntityName: 'MJ: Test Suite Runs',
507
+ ExtraFilter: '',
508
+ OrderBy: 'StartedAt DESC',
509
+ MaxRows: 100,
510
+ ResultType: 'entity_object'
511
+ });
512
+ const suiteRuns = result.Results || [];
513
+ // Group by version combination
514
+ const versionMap = new Map();
515
+ suiteRuns.forEach(run => {
516
+ const key = `${run.GitCommit || 'unknown'}_${run.AgentVersion || 'unknown'}`;
517
+ if (!versionMap.has(key)) {
518
+ versionMap.set(key, []);
519
+ }
520
+ versionMap.get(key).push(run);
521
+ });
522
+ const metrics = Array.from(versionMap.entries()).map(([key, runs]) => {
523
+ const [gitCommit, agentVersion] = key.split('_');
524
+ const latest = runs[0];
525
+ const totalTests = runs.reduce((sum, r) => sum + (r.TotalTests || 0), 0);
526
+ const totalPassed = runs.reduce((sum, r) => sum + (r.PassedTests || 0), 0);
527
+ const totalCost = runs.reduce((sum, r) => sum + (r.TotalCostUSD || 0), 0);
528
+ return {
529
+ version: `${gitCommit.substring(0, 7)} / ${agentVersion}`,
530
+ gitCommit,
531
+ agentVersion,
532
+ runDate: latest.StartedAt ? new Date(latest.StartedAt) : new Date(),
533
+ totalTests,
534
+ passRate: totalTests > 0 ? (totalPassed / totalTests) * 100 : 0,
535
+ averageScore: 0, // Would need to calculate from test runs
536
+ totalCost,
537
+ averageDuration: 0, // Would need to calculate from test runs
538
+ newFailures: 0, // Would need comparison
539
+ newPasses: 0 // Would need comparison
540
+ };
541
+ });
542
+ return metrics.sort((a, b) => b.runDate.getTime() - a.runDate.getTime());
543
+ }
544
+ createTimeBuckets(start, end) {
545
+ const buckets = [];
546
+ const bucketSize = this.getBucketSize(start, end);
547
+ const current = new Date(start);
548
+ while (current < end) {
549
+ buckets.push(new Date(current));
550
+ current.setTime(current.getTime() + bucketSize);
551
+ }
552
+ return buckets;
553
+ }
554
+ getBucketSize(start, end) {
555
+ const duration = end.getTime() - start.getTime();
556
+ const days = duration / (1000 * 60 * 60 * 24);
557
+ if (days <= 1) {
558
+ return 60 * 60 * 1000; // 1 hour
559
+ }
560
+ else if (days <= 7) {
561
+ return 4 * 60 * 60 * 1000; // 4 hours
562
+ }
563
+ else if (days <= 30) {
564
+ return 24 * 60 * 60 * 1000; // 1 day
565
+ }
566
+ else {
567
+ return 7 * 24 * 60 * 60 * 1000; // 1 week
568
+ }
569
+ }
570
+ static ɵfac = function TestingInstrumentationService_Factory(t) { return new (t || TestingInstrumentationService)(); };
571
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TestingInstrumentationService, factory: TestingInstrumentationService.ɵfac, providedIn: 'root' });
572
+ }
573
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TestingInstrumentationService, [{
574
+ type: Injectable,
575
+ args: [{
576
+ providedIn: 'root'
577
+ }]
578
+ }], () => [], null); })();
579
+ //# sourceMappingURL=testing-instrumentation.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-instrumentation.service.js","sourceRoot":"","sources":["../../../src/Testing/services/testing-instrumentation.service.ts"],"names":[],"mappings":"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"}