reviewflow 3.4.0 → 3.5.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/CHANGELOG.md +24 -0
- package/dist/cli/parseCliArgs.d.ts +6 -1
- package/dist/cli/parseCliArgs.d.ts.map +1 -1
- package/dist/cli/parseCliArgs.js +11 -1
- package/dist/cli/parseCliArgs.js.map +1 -1
- package/dist/config/projectConfig.d.ts +6 -0
- package/dist/config/projectConfig.d.ts.map +1 -1
- package/dist/config/projectConfig.js +13 -0
- package/dist/config/projectConfig.js.map +1 -1
- package/dist/entities/language/language.schema.d.ts +7 -0
- package/dist/entities/language/language.schema.d.ts.map +1 -0
- package/dist/entities/language/language.schema.js +3 -0
- package/dist/entities/language/language.schema.js.map +1 -0
- package/dist/frameworks/claude/claudeInvoker.d.ts +1 -1
- package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
- package/dist/frameworks/claude/claudeInvoker.js +6 -3
- package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
- package/dist/frameworks/claude/languageDirective.d.ts +3 -0
- package/dist/frameworks/claude/languageDirective.d.ts.map +1 -0
- package/dist/frameworks/claude/languageDirective.js +9 -0
- package/dist/frameworks/claude/languageDirective.js.map +1 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts +2 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
- package/dist/frameworks/queue/pQueueAdapter.js +1 -1
- package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
- package/dist/frameworks/settings/runtimeSettings.d.ts +4 -0
- package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
- package/dist/frameworks/settings/runtimeSettings.js +8 -1
- package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
- package/dist/interface-adapters/controllers/http/settings.routes.d.ts.map +1 -1
- package/dist/interface-adapters/controllers/http/settings.routes.js +12 -1
- package/dist/interface-adapters/controllers/http/settings.routes.js.map +1 -1
- package/dist/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
- package/dist/interface-adapters/controllers/webhook/github.controller.js +2 -1
- package/dist/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
- package/dist/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
- package/dist/interface-adapters/controllers/webhook/gitlab.controller.js +2 -1
- package/dist/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
- package/dist/interface-adapters/views/dashboard/index.html +974 -393
- package/dist/interface-adapters/views/dashboard/modules/assignee.d.ts +7 -0
- package/dist/interface-adapters/views/dashboard/modules/assignee.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/assignee.js +47 -0
- package/dist/interface-adapters/views/dashboard/modules/assignee.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/constants.d.ts +7 -0
- package/dist/interface-adapters/views/dashboard/modules/constants.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/constants.js +6 -0
- package/dist/interface-adapters/views/dashboard/modules/constants.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.d.ts +23 -0
- package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.js +37 -0
- package/dist/interface-adapters/views/dashboard/modules/desktopNotifications.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/formatting.d.ts +23 -0
- package/dist/interface-adapters/views/dashboard/modules/formatting.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/formatting.js +57 -0
- package/dist/interface-adapters/views/dashboard/modules/formatting.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/html.d.ts +16 -0
- package/dist/interface-adapters/views/dashboard/modules/html.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/html.js +68 -0
- package/dist/interface-adapters/views/dashboard/modules/html.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/i18n.d.ts +11 -0
- package/dist/interface-adapters/views/dashboard/modules/i18n.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/i18n.js +500 -0
- package/dist/interface-adapters/views/dashboard/modules/i18n.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/icons.d.ts +13 -0
- package/dist/interface-adapters/views/dashboard/modules/icons.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/icons.js +29 -0
- package/dist/interface-adapters/views/dashboard/modules/icons.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/loading.d.ts +30 -0
- package/dist/interface-adapters/views/dashboard/modules/loading.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/loading.js +48 -0
- package/dist/interface-adapters/views/dashboard/modules/loading.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/notifications.d.ts +39 -0
- package/dist/interface-adapters/views/dashboard/modules/notifications.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/notifications.js +131 -0
- package/dist/interface-adapters/views/dashboard/modules/notifications.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/priority.d.ts +10 -0
- package/dist/interface-adapters/views/dashboard/modules/priority.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/priority.js +86 -0
- package/dist/interface-adapters/views/dashboard/modules/priority.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/quality.d.ts +30 -0
- package/dist/interface-adapters/views/dashboard/modules/quality.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/quality.js +83 -0
- package/dist/interface-adapters/views/dashboard/modules/quality.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/queueLanes.d.ts +22 -0
- package/dist/interface-adapters/views/dashboard/modules/queueLanes.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/queueLanes.js +27 -0
- package/dist/interface-adapters/views/dashboard/modules/queueLanes.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.d.ts +54 -0
- package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.d.ts.map +1 -0
- package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.js +120 -0
- package/dist/interface-adapters/views/dashboard/modules/sessionMetrics.js.map +1 -0
- package/dist/interface-adapters/views/dashboard/styles.css +1031 -93
- package/dist/main/cli.d.ts +41 -1
- package/dist/main/cli.d.ts.map +1 -1
- package/dist/main/cli.js +228 -88
- package/dist/main/cli.js.map +1 -1
- package/dist/tests/factories/reviewJob.factory.d.ts.map +1 -1
- package/dist/tests/factories/reviewJob.factory.js +1 -0
- package/dist/tests/factories/reviewJob.factory.js.map +1 -1
- package/dist/tests/units/cli/parseCliArgs.test.js +14 -0
- package/dist/tests/units/cli/parseCliArgs.test.js.map +1 -1
- package/dist/tests/units/config/projectConfig.test.d.ts +2 -0
- package/dist/tests/units/config/projectConfig.test.d.ts.map +1 -0
- package/dist/tests/units/config/projectConfig.test.js +69 -0
- package/dist/tests/units/config/projectConfig.test.js.map +1 -0
- package/dist/tests/units/entities/language/language.schema.test.d.ts +2 -0
- package/dist/tests/units/entities/language/language.schema.test.d.ts.map +1 -0
- package/dist/tests/units/entities/language/language.schema.test.js +17 -0
- package/dist/tests/units/entities/language/language.schema.test.js.map +1 -0
- package/dist/tests/units/frameworks/claude/languageDirective.test.d.ts +2 -0
- package/dist/tests/units/frameworks/claude/languageDirective.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/claude/languageDirective.test.js +13 -0
- package/dist/tests/units/frameworks/claude/languageDirective.test.js.map +1 -0
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.d.ts +2 -0
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.js +20 -0
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +1 -0
- package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.js +35 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/assignee.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.js +17 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/constants.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.js +54 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/desktopNotifications.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.js +95 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/formatting.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.js +55 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/html.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js +98 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/i18n.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.js +28 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/icons.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.js +51 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/loading.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.js +43 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.js +78 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/priority.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.js +87 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/quality.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.js +29 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.js +60 -0
- package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.js.map +1 -0
- package/dist/tests/units/main/executeDiscover.test.d.ts +2 -0
- package/dist/tests/units/main/executeDiscover.test.d.ts.map +1 -0
- package/dist/tests/units/main/executeDiscover.test.js +106 -0
- package/dist/tests/units/main/executeDiscover.test.js.map +1 -0
- package/dist/tests/units/main/executeInit.test.d.ts +2 -0
- package/dist/tests/units/main/executeInit.test.d.ts.map +1 -0
- package/dist/tests/units/main/executeInit.test.js +290 -0
- package/dist/tests/units/main/executeInit.test.js.map +1 -0
- package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.js +127 -0
- package/dist/tests/units/usecases/cli/addRepositoriesToConfig.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.d.ts +2 -0
- package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.js +57 -0
- package/dist/tests/units/usecases/cli/checkInitPrerequisites.test.js.map +1 -0
- package/dist/usecases/cli/addRepositoriesToConfig.usecase.d.ts +27 -0
- package/dist/usecases/cli/addRepositoriesToConfig.usecase.d.ts.map +1 -0
- package/dist/usecases/cli/addRepositoriesToConfig.usecase.js +34 -0
- package/dist/usecases/cli/addRepositoriesToConfig.usecase.js.map +1 -0
- package/dist/usecases/cli/checkInitPrerequisites.d.ts +16 -0
- package/dist/usecases/cli/checkInitPrerequisites.d.ts.map +1 -0
- package/dist/usecases/cli/checkInitPrerequisites.js +23 -0
- package/dist/usecases/cli/checkInitPrerequisites.js.map +1 -0
- package/dist/usecases/cli/configureMcp.usecase.d.ts +1 -1
- package/dist/usecases/cli/configureMcp.usecase.d.ts.map +1 -1
- package/dist/usecases/cli/validateConfig.usecase.d.ts +1 -1
- package/dist/usecases/cli/validateConfig.usecase.d.ts.map +1 -1
- package/dist/usecases/triggerReview.usecase.d.ts +2 -0
- package/dist/usecases/triggerReview.usecase.d.ts.map +1 -1
- package/dist/usecases/triggerReview.usecase.js +1 -0
- package/dist/usecases/triggerReview.usecase.js.map +1 -1
- package/package.json +1 -1
- package/templates/SETUP.md +23 -8
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { escapeHtml, markdownToHtml, sanitizeHttpUrl } from '../../../../../../interface-adapters/views/dashboard/modules/html.js';
|
|
3
|
+
describe('escapeHtml', () => {
|
|
4
|
+
it('should return empty string for null or undefined', () => {
|
|
5
|
+
expect(escapeHtml(null)).toBe('');
|
|
6
|
+
expect(escapeHtml(undefined)).toBe('');
|
|
7
|
+
});
|
|
8
|
+
it('should escape HTML special characters', () => {
|
|
9
|
+
expect(escapeHtml('<script>alert("xss")</script>')).toBe('<script>alert("xss")</script>');
|
|
10
|
+
});
|
|
11
|
+
it('should escape ampersands', () => {
|
|
12
|
+
expect(escapeHtml('a & b')).toBe('a & b');
|
|
13
|
+
});
|
|
14
|
+
it('should escape single quotes', () => {
|
|
15
|
+
expect(escapeHtml("it's")).toBe('it's');
|
|
16
|
+
});
|
|
17
|
+
it('should return plain text unchanged', () => {
|
|
18
|
+
expect(escapeHtml('hello world')).toBe('hello world');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('markdownToHtml', () => {
|
|
22
|
+
it('should convert bold text', () => {
|
|
23
|
+
const result = markdownToHtml('**bold**');
|
|
24
|
+
expect(result).toContain('<strong>bold</strong>');
|
|
25
|
+
});
|
|
26
|
+
it('should convert inline code', () => {
|
|
27
|
+
const result = markdownToHtml('use `code` here');
|
|
28
|
+
expect(result).toContain('<code>code</code>');
|
|
29
|
+
});
|
|
30
|
+
it('should convert headers', () => {
|
|
31
|
+
expect(markdownToHtml('# Title')).toContain('<h1>Title</h1>');
|
|
32
|
+
expect(markdownToHtml('## Subtitle')).toContain('<h2>Subtitle</h2>');
|
|
33
|
+
expect(markdownToHtml('### Section')).toContain('<h3>Section</h3>');
|
|
34
|
+
});
|
|
35
|
+
it('should convert links', () => {
|
|
36
|
+
const result = markdownToHtml('[click](https://example.com)');
|
|
37
|
+
expect(result).toContain('<a href="https://example.com" target="_blank">click</a>');
|
|
38
|
+
});
|
|
39
|
+
it('should escape HTML in markdown input', () => {
|
|
40
|
+
const result = markdownToHtml('<script>alert("xss")</script>');
|
|
41
|
+
expect(result).not.toContain('<script>');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('sanitizeHttpUrl', () => {
|
|
45
|
+
it('should keep https URLs untouched', () => {
|
|
46
|
+
expect(sanitizeHttpUrl('https://example.com/path')).toBe('https://example.com/path');
|
|
47
|
+
});
|
|
48
|
+
it('should block non-http schemes', () => {
|
|
49
|
+
expect(sanitizeHttpUrl('javascript:alert(1)')).toBe('#');
|
|
50
|
+
});
|
|
51
|
+
it('should return fallback for invalid URLs', () => {
|
|
52
|
+
expect(sanitizeHttpUrl('http://[::1')).toBe('#');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=html.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/html.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/i18n.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { getLanguage, setLanguage, t } from '../../../../../../interface-adapters/views/dashboard/modules/i18n.js';
|
|
3
|
+
describe('i18n', () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
setLanguage('en');
|
|
6
|
+
});
|
|
7
|
+
it('should default to English language', () => {
|
|
8
|
+
expect(getLanguage()).toBe('en');
|
|
9
|
+
});
|
|
10
|
+
it('should change language to French', () => {
|
|
11
|
+
setLanguage('fr');
|
|
12
|
+
expect(getLanguage()).toBe('fr');
|
|
13
|
+
});
|
|
14
|
+
it('should return English translation for a known key', () => {
|
|
15
|
+
const result = t('time.justNow');
|
|
16
|
+
expect(result).toBe('Just now');
|
|
17
|
+
});
|
|
18
|
+
it('should return French translation when language is fr', () => {
|
|
19
|
+
setLanguage('fr');
|
|
20
|
+
const result = t('time.justNow');
|
|
21
|
+
expect(result).toBe("À l'instant");
|
|
22
|
+
});
|
|
23
|
+
it('should return the key itself when translation is missing', () => {
|
|
24
|
+
const result = t('nonexistent.key');
|
|
25
|
+
expect(result).toBe('nonexistent.key');
|
|
26
|
+
});
|
|
27
|
+
it('should replace multiple occurrences of the same param', () => {
|
|
28
|
+
const result = t('modal.cancel.title', { type: 'review', label: 'MR', number: 42 });
|
|
29
|
+
expect(result).toBe('Cancel the review of MR !42 (review)?');
|
|
30
|
+
});
|
|
31
|
+
it('should translate focus strip labels in English', () => {
|
|
32
|
+
expect(t('strip.now')).toBe('To handle now');
|
|
33
|
+
expect(t('strip.nowMeta')).toBe('Running reviews + MRs pending fix');
|
|
34
|
+
expect(t('strip.modeCompact')).toBe('Compact view');
|
|
35
|
+
expect(t('lane.nowKicker')).toBe('Take action now');
|
|
36
|
+
});
|
|
37
|
+
it('should translate quality labels in English', () => {
|
|
38
|
+
expect(t('quality.onTarget')).toBe('On target');
|
|
39
|
+
expect(t('quality.progress')).toBe('Progress');
|
|
40
|
+
expect(t('quality.trendUp', { delta: '+1.0' })).toBe('Improving +1.0');
|
|
41
|
+
expect(t('quality.trendUnknown')).toBe('No trend yet');
|
|
42
|
+
});
|
|
43
|
+
it('should translate queue and metrics labels in English', () => {
|
|
44
|
+
expect(t('section.queueLanes')).toBe('Priority lanes');
|
|
45
|
+
expect(t('queueLane.readyToApprove')).toBe('Ready for approval');
|
|
46
|
+
expect(t('metrics.priorityResolution')).toBe('Priority resolution');
|
|
47
|
+
expect(t('metrics.breakdown')).toBe('Action breakdown');
|
|
48
|
+
expect(t('metrics.action.followup')).toBe('Followup');
|
|
49
|
+
expect(t('metrics.action.cancelReview')).toBe('Cancel');
|
|
50
|
+
});
|
|
51
|
+
it('should translate notification and review labels in English', () => {
|
|
52
|
+
expect(t('loading.data')).toBe('Syncing dashboard data...');
|
|
53
|
+
expect(t('review.status.running')).toBe('Review in progress');
|
|
54
|
+
expect(t('button.followup')).toBe('Run follow-up');
|
|
55
|
+
expect(t('review.type.followup')).toBe('Follow-up');
|
|
56
|
+
expect(t('notify.reviewStarted', { mrNumber: 42 })).toBe('Review started for !42');
|
|
57
|
+
expect(t('notify.followupCompleted', { mrNumber: 42 })).toBe('Follow-up completed for !42');
|
|
58
|
+
expect(t('notify.desktopTitle')).toBe('Reviewflow alert');
|
|
59
|
+
expect(t('mr.threads.openAction', { count: 2 })).toBe('2 open - fix now');
|
|
60
|
+
expect(t('loading.status')).toBe('Refreshing live status...');
|
|
61
|
+
});
|
|
62
|
+
it('should translate focus strip labels in French', () => {
|
|
63
|
+
setLanguage('fr');
|
|
64
|
+
expect(t('strip.now')).toBe('À traiter');
|
|
65
|
+
expect(t('strip.nowMeta')).toBe('Reviews en cours + MR en attente de correctif');
|
|
66
|
+
expect(t('strip.modeCompact')).toBe('Vue compacte');
|
|
67
|
+
expect(t('lane.nowKicker')).toBe('Action prioritaire');
|
|
68
|
+
});
|
|
69
|
+
it('should translate quality labels in French', () => {
|
|
70
|
+
setLanguage('fr');
|
|
71
|
+
expect(t('quality.onTarget')).toBe('Objectif atteint');
|
|
72
|
+
expect(t('quality.progress')).toBe('Progression');
|
|
73
|
+
expect(t('quality.trendUp', { delta: '+1.0' })).toBe('En amélioration +1.0');
|
|
74
|
+
expect(t('quality.trendUnknown')).toBe('Pas de tendance');
|
|
75
|
+
});
|
|
76
|
+
it('should translate queue and metrics labels in French', () => {
|
|
77
|
+
setLanguage('fr');
|
|
78
|
+
expect(t('section.queueLanes')).toBe('Priorité');
|
|
79
|
+
expect(t('queueLane.readyToApprove')).toBe('Prêtes pour approbation');
|
|
80
|
+
expect(t('metrics.priorityResolution')).toBe('Résolution des priorités');
|
|
81
|
+
expect(t('metrics.breakdown')).toBe('Détail des actions');
|
|
82
|
+
expect(t('metrics.action.followup')).toBe('Followup');
|
|
83
|
+
expect(t('metrics.action.cancelReview')).toBe('Annuler');
|
|
84
|
+
});
|
|
85
|
+
it('should translate notification and review labels in French', () => {
|
|
86
|
+
setLanguage('fr');
|
|
87
|
+
expect(t('loading.data')).toBe('Synchronisation des données du dashboard...');
|
|
88
|
+
expect(t('review.status.running')).toBe('Review en cours');
|
|
89
|
+
expect(t('button.followup')).toBe('Lancer le follow-up');
|
|
90
|
+
expect(t('review.type.followup')).toBe('Follow-up');
|
|
91
|
+
expect(t('notify.reviewStarted', { mrNumber: 42 })).toBe('Review démarrée pour !42');
|
|
92
|
+
expect(t('notify.followupCompleted', { mrNumber: 42 })).toBe('Follow-up terminé pour !42');
|
|
93
|
+
expect(t('notify.desktopTitle')).toBe('Alerte Reviewflow');
|
|
94
|
+
expect(t('mr.threads.openAction', { count: 2 })).toBe('2 ouvert(s) - corriger maintenant');
|
|
95
|
+
expect(t('loading.status')).toBe('Rafraîchissement du statut en direct...');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=i18n.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/i18n.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,sDAAsD,CAAC;AAEnG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACrE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjE,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC5D,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC9D,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnF,MAAM,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5F,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1D,MAAM,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1E,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACjF,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7E,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtE,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC1D,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC9E,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACrF,MAAM,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3F,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC3F,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/icons.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { getAgentIcon, icon } from '../../../../../../interface-adapters/views/dashboard/modules/icons.js';
|
|
3
|
+
describe('getAgentIcon', () => {
|
|
4
|
+
it('should return clock icon for pending status', () => {
|
|
5
|
+
expect(getAgentIcon('pending')).toBe('<i data-lucide="clock"></i>');
|
|
6
|
+
});
|
|
7
|
+
it('should return loader icon for running status', () => {
|
|
8
|
+
expect(getAgentIcon('running')).toBe('<i data-lucide="loader"></i>');
|
|
9
|
+
});
|
|
10
|
+
it('should return check icon for completed status', () => {
|
|
11
|
+
expect(getAgentIcon('completed')).toBe('<i data-lucide="check"></i>');
|
|
12
|
+
});
|
|
13
|
+
it('should return x icon for failed status', () => {
|
|
14
|
+
expect(getAgentIcon('failed')).toBe('<i data-lucide="x"></i>');
|
|
15
|
+
});
|
|
16
|
+
it('should return help-circle icon for unknown status', () => {
|
|
17
|
+
expect(getAgentIcon('unknown')).toBe('<i data-lucide="help-circle"></i>');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('icon', () => {
|
|
21
|
+
it('should return lucide icon markup', () => {
|
|
22
|
+
expect(icon('clock')).toBe('<i data-lucide="clock" class=""></i>');
|
|
23
|
+
});
|
|
24
|
+
it('should include className when provided', () => {
|
|
25
|
+
expect(icon('star', 'active')).toBe('<i data-lucide="star" class="active"></i>');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=icons.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/icons.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,uDAAuD,CAAC;AAE3F,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/loading.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { getLoadingPresentation, getQuietRefreshSectionIdentifiers, } from '../../../../../../interface-adapters/views/dashboard/modules/loading.js';
|
|
3
|
+
describe('getLoadingPresentation', () => {
|
|
4
|
+
it('should show global loading for first status load', () => {
|
|
5
|
+
const result = getLoadingPresentation({ status: 1, reviewFiles: 0, stats: 0, mrTracking: 0 }, { hasLoadedStatusOnce: false });
|
|
6
|
+
expect(result).toEqual({
|
|
7
|
+
showGlobalLoading: true,
|
|
8
|
+
isQuietRefresh: false,
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
it('should use quiet mode for polling-only refreshes once loaded', () => {
|
|
12
|
+
const result = getLoadingPresentation({ status: 1, reviewFiles: 0, stats: 0, mrTracking: 1 }, { hasLoadedStatusOnce: true });
|
|
13
|
+
expect(result).toEqual({
|
|
14
|
+
showGlobalLoading: false,
|
|
15
|
+
isQuietRefresh: true,
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
it('should keep global loading for heavier data refreshes', () => {
|
|
19
|
+
const result = getLoadingPresentation({ status: 1, reviewFiles: 1, stats: 0, mrTracking: 1 }, { hasLoadedStatusOnce: true });
|
|
20
|
+
expect(result).toEqual({
|
|
21
|
+
showGlobalLoading: true,
|
|
22
|
+
isQuietRefresh: false,
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
it('should disable all loading indicators when there is no loading source', () => {
|
|
26
|
+
const result = getLoadingPresentation({ status: 0, reviewFiles: 0, stats: 0, mrTracking: 0 }, { hasLoadedStatusOnce: true });
|
|
27
|
+
expect(result).toEqual({
|
|
28
|
+
showGlobalLoading: false,
|
|
29
|
+
isQuietRefresh: false,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('getQuietRefreshSectionIdentifiers', () => {
|
|
34
|
+
it('should return MR tracking section for quiet MR refresh', () => {
|
|
35
|
+
const result = getQuietRefreshSectionIdentifiers({ status: 0, reviewFiles: 0, stats: 0, mrTracking: 1 }, { hasLoadedStatusOnce: true });
|
|
36
|
+
expect(result).toEqual(['pending-fix-section']);
|
|
37
|
+
});
|
|
38
|
+
it('should return review sections for quiet status refresh', () => {
|
|
39
|
+
const result = getQuietRefreshSectionIdentifiers({ status: 1, reviewFiles: 0, stats: 0, mrTracking: 0 }, { hasLoadedStatusOnce: true });
|
|
40
|
+
expect(result).toEqual([
|
|
41
|
+
'active-reviews-section',
|
|
42
|
+
'active-followups-section',
|
|
43
|
+
'completed-reviews-section',
|
|
44
|
+
]);
|
|
45
|
+
});
|
|
46
|
+
it('should return no section when not in quiet mode', () => {
|
|
47
|
+
const result = getQuietRefreshSectionIdentifiers({ status: 1, reviewFiles: 1, stats: 0, mrTracking: 0 }, { hasLoadedStatusOnce: true });
|
|
48
|
+
expect(result).toEqual([]);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=loading.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/loading.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/units/interface-adapters/views/dashboard/modules/notifications.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/notifications.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { collectReviewNotifications, createReviewNotificationState, } from '../../../../../../interface-adapters/views/dashboard/modules/notifications.js';
|
|
3
|
+
describe('collectReviewNotifications', () => {
|
|
4
|
+
it('should stay silent on first initialization', () => {
|
|
5
|
+
const result = collectReviewNotifications(createReviewNotificationState(), [{ id: 'r-1', status: 'running', jobType: 'review' }], [{ id: 'r-1', type: 'review', status: 'completed', completedAt: '2026-02-14T12:00:00Z' }]);
|
|
6
|
+
expect(result.notifications).toEqual([]);
|
|
7
|
+
expect(result.nextState.initialized).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
it('should notify when a review starts running', () => {
|
|
10
|
+
const initializedState = collectReviewNotifications(createReviewNotificationState(), [{ id: 'r-1', status: 'queued', jobType: 'review' }], []).nextState;
|
|
11
|
+
const result = collectReviewNotifications(initializedState, [{ id: 'r-1', status: 'running', jobType: 'review', mrNumber: 42 }], []);
|
|
12
|
+
expect(result.notifications).toEqual([
|
|
13
|
+
{
|
|
14
|
+
kind: 'reviewStarted',
|
|
15
|
+
review: { id: 'r-1', status: 'running', jobType: 'review', mrNumber: 42 },
|
|
16
|
+
},
|
|
17
|
+
]);
|
|
18
|
+
});
|
|
19
|
+
it('should notify when a follow-up starts running', () => {
|
|
20
|
+
const initializedState = collectReviewNotifications(createReviewNotificationState(), [{ id: 'f-1', status: 'queued', jobType: 'followup' }], []).nextState;
|
|
21
|
+
const result = collectReviewNotifications(initializedState, [{ id: 'f-1', status: 'running', jobType: 'followup', mrNumber: 43 }], []);
|
|
22
|
+
expect(result.notifications[0]?.kind).toBe('followupStarted');
|
|
23
|
+
});
|
|
24
|
+
it('should notify when a completed review appears in recent list', () => {
|
|
25
|
+
const initializedState = collectReviewNotifications(createReviewNotificationState(), [], []).nextState;
|
|
26
|
+
const result = collectReviewNotifications(initializedState, [], [{ id: 'r-2', type: 'review', status: 'completed', completedAt: '2026-02-14T13:00:00Z', mrNumber: 51 }]);
|
|
27
|
+
expect(result.notifications[0]?.kind).toBe('reviewCompleted');
|
|
28
|
+
});
|
|
29
|
+
it('should notify failed review as error event', () => {
|
|
30
|
+
const initializedState = collectReviewNotifications(createReviewNotificationState(), [], []).nextState;
|
|
31
|
+
const result = collectReviewNotifications(initializedState, [], [{ id: 'r-3', type: 'review', status: 'failed', completedAt: '2026-02-14T13:05:00Z' }]);
|
|
32
|
+
expect(result.notifications[0]?.kind).toBe('reviewFailed');
|
|
33
|
+
});
|
|
34
|
+
it('should not notify twice for the same recent review event', () => {
|
|
35
|
+
const initializedState = collectReviewNotifications(createReviewNotificationState(), [], []).nextState;
|
|
36
|
+
const reviewEvent = { id: 'r-4', type: 'review', status: 'completed', completedAt: '2026-02-14T14:00:00Z' };
|
|
37
|
+
const firstPass = collectReviewNotifications(initializedState, [], [reviewEvent]);
|
|
38
|
+
const secondPass = collectReviewNotifications(firstPass.nextState, [], [reviewEvent]);
|
|
39
|
+
expect(firstPass.notifications).toHaveLength(1);
|
|
40
|
+
expect(secondPass.notifications).toHaveLength(0);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=notifications.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/notifications.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priority.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/priority.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { rankPendingFixForNowLane } from '../../../../../../interface-adapters/views/dashboard/modules/priority.js';
|
|
3
|
+
describe('rankPendingFixForNowLane', () => {
|
|
4
|
+
it('should rank items by urgency score', () => {
|
|
5
|
+
const nowIsoDate = '2026-02-14T12:00:00.000Z';
|
|
6
|
+
const pendingFix = [
|
|
7
|
+
{
|
|
8
|
+
id: 'older-low-threads',
|
|
9
|
+
mrNumber: 10,
|
|
10
|
+
openThreads: 2,
|
|
11
|
+
latestScore: 6,
|
|
12
|
+
createdAt: '2026-02-13T08:00:00.000Z',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 'fresh-many-threads',
|
|
16
|
+
mrNumber: 11,
|
|
17
|
+
openThreads: 4,
|
|
18
|
+
latestScore: 7.5,
|
|
19
|
+
createdAt: '2026-02-14T11:00:00.000Z',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'high-score-few-threads',
|
|
23
|
+
mrNumber: 12,
|
|
24
|
+
openThreads: 1,
|
|
25
|
+
latestScore: 9,
|
|
26
|
+
createdAt: '2026-02-12T08:00:00.000Z',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
const ranked = rankPendingFixForNowLane(pendingFix, { nowIsoDate });
|
|
30
|
+
expect(ranked.map((mr) => mr.id)).toEqual([
|
|
31
|
+
'fresh-many-threads',
|
|
32
|
+
'older-low-threads',
|
|
33
|
+
'high-score-few-threads',
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
36
|
+
it('should keep deterministic order when urgency score is identical', () => {
|
|
37
|
+
const nowIsoDate = '2026-02-14T12:00:00.000Z';
|
|
38
|
+
const pendingFix = [
|
|
39
|
+
{
|
|
40
|
+
id: 'newer',
|
|
41
|
+
mrNumber: 32,
|
|
42
|
+
openThreads: 2,
|
|
43
|
+
latestScore: 6,
|
|
44
|
+
createdAt: '2026-02-14T10:00:00.000Z',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'older',
|
|
48
|
+
mrNumber: 31,
|
|
49
|
+
openThreads: 2,
|
|
50
|
+
latestScore: 6,
|
|
51
|
+
createdAt: '2026-02-14T08:00:00.000Z',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'same-date-lower-number',
|
|
55
|
+
mrNumber: 30,
|
|
56
|
+
openThreads: 2,
|
|
57
|
+
latestScore: 6,
|
|
58
|
+
createdAt: '2026-02-14T08:00:00.000Z',
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
const ranked = rankPendingFixForNowLane(pendingFix, { nowIsoDate });
|
|
62
|
+
expect(ranked.map((mr) => mr.id)).toEqual([
|
|
63
|
+
'same-date-lower-number',
|
|
64
|
+
'older',
|
|
65
|
+
'newer',
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
it('should not mutate the input array', () => {
|
|
69
|
+
const pendingFix = [
|
|
70
|
+
{ id: 'a', mrNumber: 10, openThreads: 1, latestScore: 7, createdAt: '2026-02-14T10:00:00.000Z' },
|
|
71
|
+
{ id: 'b', mrNumber: 11, openThreads: 4, latestScore: 5, createdAt: '2026-02-14T09:00:00.000Z' },
|
|
72
|
+
];
|
|
73
|
+
const snapshot = pendingFix.map((mr) => mr.id);
|
|
74
|
+
rankPendingFixForNowLane(pendingFix, { nowIsoDate: '2026-02-14T12:00:00.000Z' });
|
|
75
|
+
expect(pendingFix.map((mr) => mr.id)).toEqual(snapshot);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=priority.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priority.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/priority.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAC;AAEpG,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,UAAU,GAAG,0BAA0B,CAAC;QAC9C,MAAM,UAAU,GAAG;YACjB;gBACE,EAAE,EAAE,mBAAmB;gBACvB,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,0BAA0B;aACtC;YACD;gBACE,EAAE,EAAE,oBAAoB;gBACxB,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,0BAA0B;aACtC;YACD;gBACE,EAAE,EAAE,wBAAwB;gBAC5B,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,0BAA0B;aACtC;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,oBAAoB;YACpB,mBAAmB;YACnB,wBAAwB;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,UAAU,GAAG,0BAA0B,CAAC;QAC9C,MAAM,UAAU,GAAG;YACjB;gBACE,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,0BAA0B;aACtC;YACD;gBACE,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,0BAA0B;aACtC;YACD;gBACE,EAAE,EAAE,wBAAwB;gBAC5B,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,0BAA0B;aACtC;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,wBAAwB;YACxB,OAAO;YACP,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,UAAU,GAAG;YACjB,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE;YAChG,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE;SACjG,CAAC;QACF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE/C,wBAAwB,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAEjF,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/quality.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { getQualityProgress, getQualityTrend } from '../../../../../../interface-adapters/views/dashboard/modules/quality.js';
|
|
3
|
+
describe('getQualityProgress', () => {
|
|
4
|
+
it('should compute progress and target delta when score exists', () => {
|
|
5
|
+
const result = getQualityProgress(6.5, 8);
|
|
6
|
+
expect(result).toEqual({
|
|
7
|
+
qualityScore: 6.5,
|
|
8
|
+
qualityTarget: 8,
|
|
9
|
+
progressPercent: 81.25,
|
|
10
|
+
clampedProgressPercent: 81.25,
|
|
11
|
+
targetDelta: -1.5,
|
|
12
|
+
targetDeltaLabel: '-1.5',
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
it('should clamp progress percent between 0 and 100', () => {
|
|
16
|
+
const highResult = getQualityProgress(11, 8);
|
|
17
|
+
const lowResult = getQualityProgress(-2, 8);
|
|
18
|
+
expect(highResult.clampedProgressPercent).toBe(100);
|
|
19
|
+
expect(lowResult.clampedProgressPercent).toBe(0);
|
|
20
|
+
});
|
|
21
|
+
it('should return empty values when score is not available', () => {
|
|
22
|
+
const result = getQualityProgress(null, 8);
|
|
23
|
+
expect(result).toEqual({
|
|
24
|
+
qualityScore: null,
|
|
25
|
+
qualityTarget: 8,
|
|
26
|
+
progressPercent: null,
|
|
27
|
+
clampedProgressPercent: 0,
|
|
28
|
+
targetDelta: null,
|
|
29
|
+
targetDeltaLabel: '',
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('getQualityTrend', () => {
|
|
34
|
+
it('should return upward trend when latest score improves', () => {
|
|
35
|
+
const result = getQualityTrend({
|
|
36
|
+
reviews: [
|
|
37
|
+
{ score: 6, timestamp: '2026-02-12T10:00:00.000Z' },
|
|
38
|
+
{ score: 7.5, timestamp: '2026-02-13T10:00:00.000Z' },
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
expect(result).toEqual({
|
|
42
|
+
direction: 'up',
|
|
43
|
+
delta: 1.5,
|
|
44
|
+
label: '+1.5',
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('should return downward trend when latest score drops', () => {
|
|
48
|
+
const result = getQualityTrend({
|
|
49
|
+
reviews: [
|
|
50
|
+
{ score: 9, timestamp: '2026-02-12T10:00:00.000Z' },
|
|
51
|
+
{ score: 7.2, timestamp: '2026-02-13T10:00:00.000Z' },
|
|
52
|
+
],
|
|
53
|
+
});
|
|
54
|
+
expect(result).toEqual({
|
|
55
|
+
direction: 'down',
|
|
56
|
+
delta: -1.8,
|
|
57
|
+
label: '-1.8',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it('should return flat trend when latest scores are equal', () => {
|
|
61
|
+
const result = getQualityTrend({
|
|
62
|
+
reviews: [
|
|
63
|
+
{ score: 8, timestamp: '2026-02-12T10:00:00.000Z' },
|
|
64
|
+
{ score: 8, timestamp: '2026-02-13T10:00:00.000Z' },
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
expect(result).toEqual({
|
|
68
|
+
direction: 'flat',
|
|
69
|
+
delta: 0,
|
|
70
|
+
label: '0.0',
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
it('should return unknown trend when there are less than two valid scores', () => {
|
|
74
|
+
const result = getQualityTrend({
|
|
75
|
+
reviews: [
|
|
76
|
+
{ score: null, timestamp: '2026-02-12T10:00:00.000Z' },
|
|
77
|
+
{ score: 8, timestamp: '2026-02-13T10:00:00.000Z' },
|
|
78
|
+
],
|
|
79
|
+
});
|
|
80
|
+
expect(result).toEqual({
|
|
81
|
+
direction: 'unknown',
|
|
82
|
+
delta: null,
|
|
83
|
+
label: '',
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=quality.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/quality.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queueLanes.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { buildQueueLanesModel } from '../../../../../../interface-adapters/views/dashboard/modules/queueLanes.js';
|
|
3
|
+
describe('buildQueueLanesModel', () => {
|
|
4
|
+
it('should split pending fix into now lane and needs-fix lane', () => {
|
|
5
|
+
const pendingFix = [
|
|
6
|
+
{ id: 'mr-high', urgencyScore: 90 },
|
|
7
|
+
{ id: 'mr-mid', urgencyScore: 60 },
|
|
8
|
+
{ id: 'mr-low', urgencyScore: 20 },
|
|
9
|
+
];
|
|
10
|
+
const pendingApproval = [{ id: 'mr-approve-1' }];
|
|
11
|
+
const result = buildQueueLanesModel(pendingFix, pendingApproval);
|
|
12
|
+
expect(result.nowLaneItem?.id).toBe('mr-high');
|
|
13
|
+
expect(result.needsFixItems.map((mergeRequest) => mergeRequest.id)).toEqual(['mr-mid', 'mr-low']);
|
|
14
|
+
expect(result.readyToApproveItems.map((mergeRequest) => mergeRequest.id)).toEqual(['mr-approve-1']);
|
|
15
|
+
});
|
|
16
|
+
it('should keep stable counters when lists are empty', () => {
|
|
17
|
+
const result = buildQueueLanesModel([], []);
|
|
18
|
+
expect(result.nowLaneCount).toBe(0);
|
|
19
|
+
expect(result.needsFixCount).toBe(0);
|
|
20
|
+
expect(result.readyToApproveCount).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
it('should keep one pending fix item only in now lane', () => {
|
|
23
|
+
const result = buildQueueLanesModel([{ id: 'mr-only' }], []);
|
|
24
|
+
expect(result.nowLaneItem?.id).toBe('mr-only');
|
|
25
|
+
expect(result.needsFixItems).toEqual([]);
|
|
26
|
+
expect(result.nowLaneCount).toBe(1);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=queueLanes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queueLanes.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/queueLanes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4DAA4D,CAAC;AAElG,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,UAAU,GAAG;YACjB,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE;YACnC,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;YAClC,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;SACnC,CAAC;QACF,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE7D,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionMetrics.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/interface-adapters/views/dashboard/modules/sessionMetrics.test.ts"],"names":[],"mappings":""}
|