reviewflow 3.17.1 → 3.19.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 +15 -0
- package/dist/config/projectConfig.d.ts +8 -0
- package/dist/config/projectConfig.d.ts.map +1 -1
- package/dist/config/projectConfig.js +59 -7
- package/dist/config/projectConfig.js.map +1 -1
- package/dist/dashboard/index.html +303 -175
- package/dist/dashboard/modules/budgetSettings.d.ts.map +1 -1
- package/dist/dashboard/modules/budgetSettings.js +2 -4
- package/dist/dashboard/modules/budgetSettings.js.map +1 -1
- package/dist/dashboard/modules/desktopNotifications.d.ts.map +1 -1
- package/dist/dashboard/modules/desktopNotifications.js +1 -0
- package/dist/dashboard/modules/desktopNotifications.js.map +1 -1
- package/dist/dashboard/modules/i18n.d.ts.map +1 -1
- package/dist/dashboard/modules/i18n.js +12 -0
- package/dist/dashboard/modules/i18n.js.map +1 -1
- package/dist/dashboard/modules/pendingReviews.d.ts +49 -0
- package/dist/dashboard/modules/pendingReviews.d.ts.map +1 -0
- package/dist/dashboard/modules/pendingReviews.js +80 -0
- package/dist/dashboard/modules/pendingReviews.js.map +1 -0
- package/dist/dashboard/styles.css +162 -8
- package/dist/frameworks/config/configLoader.d.ts +2 -0
- package/dist/frameworks/config/configLoader.d.ts.map +1 -1
- package/dist/frameworks/config/configLoader.js +27 -2
- package/dist/frameworks/config/configLoader.js.map +1 -1
- package/dist/main/routes.d.ts.map +1 -1
- package/dist/main/routes.js +57 -2
- package/dist/main/routes.js.map +1 -1
- package/dist/main/websocket.d.ts +1 -0
- package/dist/main/websocket.d.ts.map +1 -1
- package/dist/main/websocket.js +11 -0
- package/dist/main/websocket.js.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.d.ts.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js +24 -6
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts +2 -0
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +54 -6
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts +6 -0
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +76 -21
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.d.ts +8 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.js +2 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.gateway.js.map +1 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.d.ts +29 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.js +4 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.js.map +1 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.d.ts +94 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.js +40 -0
- package/dist/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.schema.js.map +1 -0
- package/dist/modules/review-execution/entities/progress/agentDefinition.type.d.ts +4 -0
- package/dist/modules/review-execution/entities/progress/agentDefinition.type.d.ts.map +1 -1
- package/dist/modules/review-execution/entities/progress/agentDefinition.type.js +42 -0
- package/dist/modules/review-execution/entities/progress/agentDefinition.type.js.map +1 -1
- package/dist/modules/review-execution/entities/progress/reviewFocus.type.d.ts +8 -0
- package/dist/modules/review-execution/entities/progress/reviewFocus.type.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/progress/reviewFocus.type.js +30 -0
- package/dist/modules/review-execution/entities/progress/reviewFocus.type.js.map +1 -0
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.d.ts +13 -0
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.d.ts.map +1 -0
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.js +34 -0
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.js.map +1 -0
- package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.d.ts +16 -0
- package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.js +81 -0
- package/dist/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.js.map +1 -0
- package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.d.ts +25 -0
- package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.d.ts.map +1 -0
- package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.js +41 -0
- package/dist/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.js.map +1 -0
- package/dist/modules/review-execution/services/processorRegistry.d.ts +15 -0
- package/dist/modules/review-execution/services/processorRegistry.d.ts.map +1 -0
- package/dist/modules/review-execution/services/processorRegistry.js +23 -0
- package/dist/modules/review-execution/services/processorRegistry.js.map +1 -0
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.d.ts +32 -0
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.js +29 -0
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.js.map +1 -0
- package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.d.ts +26 -0
- package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.js +22 -0
- package/dist/modules/review-execution/usecases/dismissPendingReview.usecase.js.map +1 -0
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts +36 -0
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js +36 -0
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js.map +1 -0
- package/dist/modules/review-execution/usecases/listPendingReviews.usecase.d.ts +11 -0
- package/dist/modules/review-execution/usecases/listPendingReviews.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/listPendingReviews.usecase.js +10 -0
- package/dist/modules/review-execution/usecases/listPendingReviews.usecase.js.map +1 -0
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.d.ts +2 -0
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.d.ts.map +1 -1
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js +22 -4
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.js.map +1 -1
- package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.d.ts +2 -0
- package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.js +161 -0
- package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js +1 -0
- package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js.map +1 -1
- package/dist/tests/acceptance/reviewFocus.acceptance.test.d.ts +2 -0
- package/dist/tests/acceptance/reviewFocus.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/reviewFocus.acceptance.test.js +114 -0
- package/dist/tests/acceptance/reviewFocus.acceptance.test.js.map +1 -0
- package/dist/tests/factories/config.factory.d.ts.map +1 -1
- package/dist/tests/factories/config.factory.js +1 -0
- package/dist/tests/factories/config.factory.js.map +1 -1
- package/dist/tests/factories/pendingReviewRequest.factory.d.ts +5 -0
- package/dist/tests/factories/pendingReviewRequest.factory.d.ts.map +1 -0
- package/dist/tests/factories/pendingReviewRequest.factory.js +25 -0
- package/dist/tests/factories/pendingReviewRequest.factory.js.map +1 -0
- package/dist/tests/factories/projectConfig.factory.d.ts +21 -0
- package/dist/tests/factories/projectConfig.factory.d.ts.map +1 -0
- package/dist/tests/factories/projectConfig.factory.js +43 -0
- package/dist/tests/factories/projectConfig.factory.js.map +1 -0
- package/dist/tests/stubs/pendingReviewRequest.stub.d.ts +14 -0
- package/dist/tests/stubs/pendingReviewRequest.stub.d.ts.map +1 -0
- package/dist/tests/stubs/pendingReviewRequest.stub.js +29 -0
- package/dist/tests/stubs/pendingReviewRequest.stub.js.map +1 -0
- package/dist/tests/units/config/projectConfig.test.js +101 -1
- package/dist/tests/units/config/projectConfig.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/pendingReviews.test.d.ts +2 -0
- package/dist/tests/units/dashboard/modules/pendingReviews.test.d.ts.map +1 -0
- package/dist/tests/units/dashboard/modules/pendingReviews.test.js +60 -0
- package/dist/tests/units/dashboard/modules/pendingReviews.test.js.map +1 -0
- package/dist/tests/units/frameworks/config/configLoader.test.js +85 -0
- package/dist/tests/units/frameworks/config/configLoader.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +1 -0
- package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
- 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/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.d.ts +2 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.d.ts.map +1 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js +130 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.js +32 -0
- package/dist/tests/units/modules/review-execution/entities/pendingReviewRequest/pendingReviewRequest.guard.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.js +108 -0
- package/dist/tests/units/modules/review-execution/entities/progress/agentDefinition.type.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.js +73 -0
- package/dist/tests/units/modules/review-execution/entities/progress/reviewFocus.type.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.js +114 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.js +67 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/pendingReviewRequest.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.js +40 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/services/processorRegistry.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/services/processorRegistry.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/services/processorRegistry.test.js +54 -0
- package/dist/tests/units/modules/review-execution/services/processorRegistry.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js +86 -0
- package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.js +50 -0
- package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js +134 -0
- package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.js +27 -0
- package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pendingReview.presenter.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { PendingReviewPresenter } from '../../../../../../modules/review-execution/interface-adapters/presenters/pendingReview.presenter.js';
|
|
3
|
+
import { PendingReviewRequestFactory } from '../../../../../../tests/factories/pendingReviewRequest.factory.js';
|
|
4
|
+
describe('PendingReviewPresenter', () => {
|
|
5
|
+
it('builds a view model for an initial review pending request', () => {
|
|
6
|
+
const presenter = new PendingReviewPresenter({ now: () => new Date('2026-05-23T10:02:00Z') });
|
|
7
|
+
const pending = PendingReviewRequestFactory.create({
|
|
8
|
+
createdAt: '2026-05-23T10:00:00.000Z',
|
|
9
|
+
});
|
|
10
|
+
const viewModel = presenter.present(pending);
|
|
11
|
+
expect(viewModel.identifier).toBe(pending.pendingReviewRequestId);
|
|
12
|
+
expect(viewModel.mrNumber).toBe(42);
|
|
13
|
+
expect(viewModel.projectPath).toBe('group/project');
|
|
14
|
+
expect(viewModel.mrUrl).toBe(pending.job.mrUrl);
|
|
15
|
+
expect(viewModel.jobTypeLabel).toBe('Review');
|
|
16
|
+
expect(viewModel.triggerSourceLabel).toBe('Webhook');
|
|
17
|
+
expect(viewModel.displayTitle).toContain('!42');
|
|
18
|
+
expect(viewModel.confirmActionUrl).toBe(`/api/pending-reviews/${pending.pendingReviewRequestId}/confirm`);
|
|
19
|
+
expect(viewModel.dismissActionUrl).toBe(`/api/pending-reviews/${pending.pendingReviewRequestId}`);
|
|
20
|
+
expect(viewModel.createdAtRelative).toMatch(/2/);
|
|
21
|
+
});
|
|
22
|
+
it('labels followup job type as "Followup"', () => {
|
|
23
|
+
const presenter = new PendingReviewPresenter();
|
|
24
|
+
const pending = PendingReviewRequestFactory.create({
|
|
25
|
+
jobType: 'followup',
|
|
26
|
+
triggerSource: 'webhook-followup',
|
|
27
|
+
});
|
|
28
|
+
const viewModel = presenter.present(pending);
|
|
29
|
+
expect(viewModel.jobTypeLabel).toBe('Followup');
|
|
30
|
+
});
|
|
31
|
+
it('labels the dashboard-manual trigger source as "Manuel"', () => {
|
|
32
|
+
const presenter = new PendingReviewPresenter();
|
|
33
|
+
const pending = PendingReviewRequestFactory.create({
|
|
34
|
+
triggerSource: 'dashboard-manual',
|
|
35
|
+
});
|
|
36
|
+
const viewModel = presenter.present(pending);
|
|
37
|
+
expect(viewModel.triggerSourceLabel).toBe('Manuel');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=pendingReview.presenter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pendingReview.presenter.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/review-execution/interface-adapters/presenters/pendingReview.presenter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qFAAqF,CAAC;AAC7H,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAEhG,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC;YACjD,SAAS,EAAE,0BAA0B;SACtC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACrC,wBAAwB,OAAO,CAAC,sBAAsB,UAAU,CACjE,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACrC,wBAAwB,OAAO,CAAC,sBAAsB,EAAE,CACzD,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC;YACjD,OAAO,EAAE,UAAU;YACnB,aAAa,EAAE,kBAAkB;SAClC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC;YACjD,aAAa,EAAE,kBAAkB;SAClC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processorRegistry.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/services/processorRegistry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { ProcessorRegistry } from '../../../../../modules/review-execution/services/processorRegistry.js';
|
|
3
|
+
import { PendingReviewRequestFactory } from '../../../../../tests/factories/pendingReviewRequest.factory.js';
|
|
4
|
+
describe('ProcessorRegistry', () => {
|
|
5
|
+
it('resolves a registered builder using triggerSource:platform:jobType', () => {
|
|
6
|
+
const registry = new ProcessorRegistry();
|
|
7
|
+
const processor = vi.fn(async () => { });
|
|
8
|
+
const builder = vi.fn((_job) => processor);
|
|
9
|
+
registry.register({ triggerSource: 'webhook-initial', platform: 'gitlab', jobType: 'review' }, builder);
|
|
10
|
+
const pending = PendingReviewRequestFactory.create({
|
|
11
|
+
triggerSource: 'webhook-initial',
|
|
12
|
+
platform: 'gitlab',
|
|
13
|
+
jobType: 'review',
|
|
14
|
+
});
|
|
15
|
+
const resolved = registry.resolve(pending);
|
|
16
|
+
expect(builder).toHaveBeenCalledWith(pending.job);
|
|
17
|
+
expect(resolved).toBe(processor);
|
|
18
|
+
});
|
|
19
|
+
it('throws a descriptive error when no builder is registered for the key', () => {
|
|
20
|
+
const registry = new ProcessorRegistry();
|
|
21
|
+
const pending = PendingReviewRequestFactory.create({
|
|
22
|
+
triggerSource: 'dashboard-manual',
|
|
23
|
+
platform: 'github',
|
|
24
|
+
jobType: 'followup',
|
|
25
|
+
});
|
|
26
|
+
expect(() => registry.resolve(pending)).toThrow(/No processor builder registered/);
|
|
27
|
+
expect(() => registry.resolve(pending)).toThrow(/dashboard-manual:github:followup/);
|
|
28
|
+
});
|
|
29
|
+
it('lists available keys in the error message when builder is missing', () => {
|
|
30
|
+
const registry = new ProcessorRegistry();
|
|
31
|
+
registry.register({ triggerSource: 'webhook-initial', platform: 'gitlab', jobType: 'review' }, vi.fn());
|
|
32
|
+
const pending = PendingReviewRequestFactory.create({
|
|
33
|
+
triggerSource: 'webhook-followup',
|
|
34
|
+
platform: 'github',
|
|
35
|
+
jobType: 'followup',
|
|
36
|
+
});
|
|
37
|
+
expect(() => registry.resolve(pending)).toThrow(/Available keys.*webhook-initial:gitlab:review/);
|
|
38
|
+
});
|
|
39
|
+
it('replaces an existing builder when register is called twice with the same key', () => {
|
|
40
|
+
const registry = new ProcessorRegistry();
|
|
41
|
+
const oldProcessor = vi.fn(async () => { });
|
|
42
|
+
const newProcessor = vi.fn(async () => { });
|
|
43
|
+
registry.register({ triggerSource: 'webhook-initial', platform: 'gitlab', jobType: 'review' }, () => oldProcessor);
|
|
44
|
+
registry.register({ triggerSource: 'webhook-initial', platform: 'gitlab', jobType: 'review' }, () => newProcessor);
|
|
45
|
+
const pending = PendingReviewRequestFactory.create({
|
|
46
|
+
triggerSource: 'webhook-initial',
|
|
47
|
+
platform: 'gitlab',
|
|
48
|
+
jobType: 'review',
|
|
49
|
+
});
|
|
50
|
+
const resolved = registry.resolve(pending);
|
|
51
|
+
expect(resolved).toBe(newProcessor);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=processorRegistry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processorRegistry.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/services/processorRegistry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmPendingReview.usecase.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.ts"],"names":[],"mappings":""}
|
package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { ConfirmPendingReviewUseCase } from '../../../../../modules/review-execution/usecases/confirmPendingReview.usecase.js';
|
|
3
|
+
import { StubPendingReviewRequestGateway } from '../../../../../tests/stubs/pendingReviewRequest.stub.js';
|
|
4
|
+
import { PendingReviewRequestFactory } from '../../../../../tests/factories/pendingReviewRequest.factory.js';
|
|
5
|
+
import { createStubLogger } from '../../../../../tests/stubs/logger.stub.js';
|
|
6
|
+
describe('ConfirmPendingReviewUseCase', () => {
|
|
7
|
+
let gateway;
|
|
8
|
+
let activeJobs;
|
|
9
|
+
let enqueueCalls;
|
|
10
|
+
let processorRuns;
|
|
11
|
+
const logger = createStubLogger();
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
gateway = new StubPendingReviewRequestGateway();
|
|
14
|
+
activeJobs = new Set();
|
|
15
|
+
enqueueCalls = [];
|
|
16
|
+
processorRuns = 0;
|
|
17
|
+
});
|
|
18
|
+
const enqueueSuccess = async (job, processor) => {
|
|
19
|
+
enqueueCalls.push(job);
|
|
20
|
+
activeJobs.add(job.id);
|
|
21
|
+
await processor(job, new AbortController().signal);
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
const fakeProcessor = async () => {
|
|
25
|
+
processorRuns += 1;
|
|
26
|
+
};
|
|
27
|
+
function makeUseCase() {
|
|
28
|
+
return new ConfirmPendingReviewUseCase({
|
|
29
|
+
pendingReviewRequestGateway: gateway,
|
|
30
|
+
queuePort: {
|
|
31
|
+
hasActiveJob: (id) => activeJobs.has(id),
|
|
32
|
+
getJobStatus: () => null,
|
|
33
|
+
},
|
|
34
|
+
enqueue: enqueueSuccess,
|
|
35
|
+
resolveProcessor: () => fakeProcessor,
|
|
36
|
+
logger,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
describe('Rule: confirming a pending job enqueues it and invokes Claude', () => {
|
|
40
|
+
it('returns confirmed and deletes the pending entry', async () => {
|
|
41
|
+
const pending = PendingReviewRequestFactory.create();
|
|
42
|
+
gateway.prepopulate(pending);
|
|
43
|
+
const result = await makeUseCase().execute({ pendingId: pending.pendingReviewRequestId });
|
|
44
|
+
expect(result.status).toBe('confirmed');
|
|
45
|
+
expect(enqueueCalls).toHaveLength(1);
|
|
46
|
+
expect(processorRuns).toBe(1);
|
|
47
|
+
expect(gateway.deleteCount).toBe(1);
|
|
48
|
+
expect(await gateway.listAll()).toHaveLength(0);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('Rule: confirming a missing job returns not-found', () => {
|
|
52
|
+
it('returns not-found when the pending id is unknown', async () => {
|
|
53
|
+
const result = await makeUseCase().execute({ pendingId: 'unknown-id' });
|
|
54
|
+
expect(result.status).toBe('not-found');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('Rule: confirming an already-running review is rejected with a French message', () => {
|
|
58
|
+
it('returns already-running and the exact French message from the spec', async () => {
|
|
59
|
+
const pending = PendingReviewRequestFactory.create();
|
|
60
|
+
gateway.prepopulate(pending);
|
|
61
|
+
activeJobs.add(pending.job.id);
|
|
62
|
+
const result = await makeUseCase().execute({ pendingId: pending.pendingReviewRequestId });
|
|
63
|
+
expect(result.status).toBe('already-running');
|
|
64
|
+
if (result.status === 'already-running') {
|
|
65
|
+
expect(result.message).toBe('Cette review est déjà en cours');
|
|
66
|
+
}
|
|
67
|
+
expect(enqueueCalls).toHaveLength(0);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('Rule: confirming a request that the queue refuses returns already-running', () => {
|
|
71
|
+
it('reports already-running when enqueue refuses (race against running job)', async () => {
|
|
72
|
+
const pending = PendingReviewRequestFactory.create();
|
|
73
|
+
gateway.prepopulate(pending);
|
|
74
|
+
const useCase = new ConfirmPendingReviewUseCase({
|
|
75
|
+
pendingReviewRequestGateway: gateway,
|
|
76
|
+
queuePort: { hasActiveJob: () => false, getJobStatus: () => null },
|
|
77
|
+
enqueue: async () => false,
|
|
78
|
+
resolveProcessor: () => fakeProcessor,
|
|
79
|
+
logger,
|
|
80
|
+
});
|
|
81
|
+
const result = await useCase.execute({ pendingId: pending.pendingReviewRequestId });
|
|
82
|
+
expect(result.status).toBe('already-running');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=confirmPendingReview.usecase.test.js.map
|
package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmPendingReview.usecase.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissPendingReview.usecase.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.ts"],"names":[],"mappings":""}
|
package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { DismissPendingReviewUseCase } from '../../../../../modules/review-execution/usecases/dismissPendingReview.usecase.js';
|
|
3
|
+
import { StubPendingReviewRequestGateway } from '../../../../../tests/stubs/pendingReviewRequest.stub.js';
|
|
4
|
+
import { PendingReviewRequestFactory } from '../../../../../tests/factories/pendingReviewRequest.factory.js';
|
|
5
|
+
import { createStubLogger } from '../../../../../tests/stubs/logger.stub.js';
|
|
6
|
+
describe('DismissPendingReviewUseCase', () => {
|
|
7
|
+
let gateway;
|
|
8
|
+
let activeJobs;
|
|
9
|
+
const logger = createStubLogger();
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
gateway = new StubPendingReviewRequestGateway();
|
|
12
|
+
activeJobs = new Set();
|
|
13
|
+
});
|
|
14
|
+
function makeUseCase() {
|
|
15
|
+
return new DismissPendingReviewUseCase({
|
|
16
|
+
pendingReviewRequestGateway: gateway,
|
|
17
|
+
queuePort: { hasActiveJob: (id) => activeJobs.has(id) },
|
|
18
|
+
logger,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
describe('Rule: dismissing a pending job removes it', () => {
|
|
22
|
+
it('returns dismissed and deletes the pending entry', async () => {
|
|
23
|
+
const pending = PendingReviewRequestFactory.create();
|
|
24
|
+
gateway.prepopulate(pending);
|
|
25
|
+
const result = await makeUseCase().execute({ pendingId: pending.pendingReviewRequestId });
|
|
26
|
+
expect(result.status).toBe('dismissed');
|
|
27
|
+
expect(gateway.deleteCount).toBe(1);
|
|
28
|
+
expect(await gateway.listAll()).toHaveLength(0);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('Rule: dismissing an unknown id returns not-found', () => {
|
|
32
|
+
it('returns not-found when the pending id is unknown', async () => {
|
|
33
|
+
const result = await makeUseCase().execute({ pendingId: 'unknown-id' });
|
|
34
|
+
expect(result.status).toBe('not-found');
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('Rule: dismissing a job already running is rejected with the French message', () => {
|
|
38
|
+
it('returns already-running and the exact French message from the spec', async () => {
|
|
39
|
+
const pending = PendingReviewRequestFactory.create();
|
|
40
|
+
gateway.prepopulate(pending);
|
|
41
|
+
activeJobs.add(pending.job.id);
|
|
42
|
+
const result = await makeUseCase().execute({ pendingId: pending.pendingReviewRequestId });
|
|
43
|
+
expect(result.status).toBe('already-running');
|
|
44
|
+
if (result.status === 'already-running') {
|
|
45
|
+
expect(result.message).toBe("Cette review est déjà en cours, impossible de l'ignorer");
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=dismissPendingReview.usecase.test.js.map
|
package/dist/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissPendingReview.usecase.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/dismissPendingReview.usecase.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateClaudeInvocation.usecase.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.ts"],"names":[],"mappings":""}
|
package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { GateClaudeInvocationUseCase } from '../../../../../modules/review-execution/usecases/gateClaudeInvocation.usecase.js';
|
|
3
|
+
import { StubPendingReviewRequestGateway } from '../../../../../tests/stubs/pendingReviewRequest.stub.js';
|
|
4
|
+
import { createStubLogger } from '../../../../../tests/stubs/logger.stub.js';
|
|
5
|
+
function buildReviewJob(overrides = {}) {
|
|
6
|
+
return {
|
|
7
|
+
id: 'gitlab:group/project:42',
|
|
8
|
+
platform: 'gitlab',
|
|
9
|
+
projectPath: 'group/project',
|
|
10
|
+
localPath: '/home/user/projects/test',
|
|
11
|
+
mrNumber: 42,
|
|
12
|
+
skill: 'review-code',
|
|
13
|
+
mrUrl: 'https://gitlab.example.com/group/project/-/merge_requests/42',
|
|
14
|
+
sourceBranch: 'feature/x',
|
|
15
|
+
targetBranch: 'main',
|
|
16
|
+
jobType: 'review',
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
describe('GateClaudeInvocationUseCase', () => {
|
|
21
|
+
let gateway;
|
|
22
|
+
let enqueueCalls;
|
|
23
|
+
let processorRuns;
|
|
24
|
+
let broadcasts;
|
|
25
|
+
const logger = createStubLogger();
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
gateway = new StubPendingReviewRequestGateway();
|
|
28
|
+
enqueueCalls = [];
|
|
29
|
+
processorRuns = 0;
|
|
30
|
+
broadcasts = 0;
|
|
31
|
+
});
|
|
32
|
+
const enqueueSuccess = async (job, processor) => {
|
|
33
|
+
enqueueCalls.push(job);
|
|
34
|
+
await processor(job, new AbortController().signal);
|
|
35
|
+
return true;
|
|
36
|
+
};
|
|
37
|
+
const processor = async () => {
|
|
38
|
+
processorRuns += 1;
|
|
39
|
+
};
|
|
40
|
+
describe('Rule: full-auto delegates directly to enqueue', () => {
|
|
41
|
+
it('returns enqueued status and invokes the processor', async () => {
|
|
42
|
+
const useCase = new GateClaudeInvocationUseCase({
|
|
43
|
+
triggerMode: 'full-auto',
|
|
44
|
+
pendingReviewRequestGateway: gateway,
|
|
45
|
+
enqueue: enqueueSuccess,
|
|
46
|
+
broadcastPendingChanged: () => { },
|
|
47
|
+
logger,
|
|
48
|
+
});
|
|
49
|
+
const result = await useCase.execute({
|
|
50
|
+
job: buildReviewJob(),
|
|
51
|
+
triggerSource: 'webhook-initial',
|
|
52
|
+
processor,
|
|
53
|
+
});
|
|
54
|
+
expect(result.status).toBe('enqueued');
|
|
55
|
+
expect(enqueueCalls).toHaveLength(1);
|
|
56
|
+
expect(processorRuns).toBe(1);
|
|
57
|
+
});
|
|
58
|
+
it('returns rejected status when enqueue refuses the job', async () => {
|
|
59
|
+
const enqueueRejects = async () => false;
|
|
60
|
+
const useCase = new GateClaudeInvocationUseCase({
|
|
61
|
+
triggerMode: 'full-auto',
|
|
62
|
+
pendingReviewRequestGateway: gateway,
|
|
63
|
+
enqueue: enqueueRejects,
|
|
64
|
+
broadcastPendingChanged: () => { },
|
|
65
|
+
logger,
|
|
66
|
+
});
|
|
67
|
+
const result = await useCase.execute({
|
|
68
|
+
job: buildReviewJob(),
|
|
69
|
+
triggerSource: 'webhook-initial',
|
|
70
|
+
processor,
|
|
71
|
+
});
|
|
72
|
+
expect(result.status).toBe('rejected');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('Rule: semi-auto persists a pending request and skips enqueue', () => {
|
|
76
|
+
it('saves the pending request and never calls enqueue', async () => {
|
|
77
|
+
const useCase = new GateClaudeInvocationUseCase({
|
|
78
|
+
triggerMode: 'semi-auto',
|
|
79
|
+
pendingReviewRequestGateway: gateway,
|
|
80
|
+
enqueue: enqueueSuccess,
|
|
81
|
+
broadcastPendingChanged: () => {
|
|
82
|
+
broadcasts += 1;
|
|
83
|
+
},
|
|
84
|
+
logger,
|
|
85
|
+
});
|
|
86
|
+
const result = await useCase.execute({
|
|
87
|
+
job: buildReviewJob(),
|
|
88
|
+
triggerSource: 'webhook-initial',
|
|
89
|
+
processor,
|
|
90
|
+
});
|
|
91
|
+
expect(result.status).toBe('pending');
|
|
92
|
+
expect(enqueueCalls).toHaveLength(0);
|
|
93
|
+
expect(processorRuns).toBe(0);
|
|
94
|
+
expect(gateway.saveCount).toBe(1);
|
|
95
|
+
expect(broadcasts).toBe(1);
|
|
96
|
+
});
|
|
97
|
+
it('persists followup job type when triggered from webhook-followup source', async () => {
|
|
98
|
+
const useCase = new GateClaudeInvocationUseCase({
|
|
99
|
+
triggerMode: 'semi-auto',
|
|
100
|
+
pendingReviewRequestGateway: gateway,
|
|
101
|
+
enqueue: enqueueSuccess,
|
|
102
|
+
broadcastPendingChanged: () => { },
|
|
103
|
+
logger,
|
|
104
|
+
});
|
|
105
|
+
await useCase.execute({
|
|
106
|
+
job: buildReviewJob({ jobType: 'followup' }),
|
|
107
|
+
triggerSource: 'webhook-followup',
|
|
108
|
+
processor,
|
|
109
|
+
});
|
|
110
|
+
const allPending = await gateway.listAll();
|
|
111
|
+
expect(allPending).toHaveLength(1);
|
|
112
|
+
expect(allPending[0].jobType).toBe('followup');
|
|
113
|
+
expect(allPending[0].triggerSource).toBe('webhook-followup');
|
|
114
|
+
});
|
|
115
|
+
it('full-auto followup is unchanged: delegates to enqueue and invokes Claude', async () => {
|
|
116
|
+
const useCase = new GateClaudeInvocationUseCase({
|
|
117
|
+
triggerMode: 'full-auto',
|
|
118
|
+
pendingReviewRequestGateway: gateway,
|
|
119
|
+
enqueue: enqueueSuccess,
|
|
120
|
+
broadcastPendingChanged: () => { },
|
|
121
|
+
logger,
|
|
122
|
+
});
|
|
123
|
+
const result = await useCase.execute({
|
|
124
|
+
job: buildReviewJob({ jobType: 'followup' }),
|
|
125
|
+
triggerSource: 'webhook-followup',
|
|
126
|
+
processor,
|
|
127
|
+
});
|
|
128
|
+
expect(result.status).toBe('enqueued');
|
|
129
|
+
expect(processorRuns).toBe(1);
|
|
130
|
+
expect(gateway.saveCount).toBe(0);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=gateClaudeInvocation.usecase.test.js.map
|
package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateClaudeInvocation.usecase.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listPendingReviews.usecase.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { ListPendingReviewsUseCase } from '../../../../../modules/review-execution/usecases/listPendingReviews.usecase.js';
|
|
3
|
+
import { StubPendingReviewRequestGateway } from '../../../../../tests/stubs/pendingReviewRequest.stub.js';
|
|
4
|
+
import { PendingReviewRequestFactory } from '../../../../../tests/factories/pendingReviewRequest.factory.js';
|
|
5
|
+
describe('ListPendingReviewsUseCase', () => {
|
|
6
|
+
let gateway;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
gateway = new StubPendingReviewRequestGateway();
|
|
9
|
+
});
|
|
10
|
+
it('returns an empty list when nothing is pending', async () => {
|
|
11
|
+
const useCase = new ListPendingReviewsUseCase({ pendingReviewRequestGateway: gateway });
|
|
12
|
+
const result = await useCase.execute();
|
|
13
|
+
expect(result).toEqual([]);
|
|
14
|
+
});
|
|
15
|
+
it('returns every pending request currently stored', async () => {
|
|
16
|
+
gateway.prepopulate(PendingReviewRequestFactory.create({ pendingReviewRequestId: 'pending-1' }));
|
|
17
|
+
gateway.prepopulate(PendingReviewRequestFactory.create({ pendingReviewRequestId: 'pending-2' }));
|
|
18
|
+
const useCase = new ListPendingReviewsUseCase({ pendingReviewRequestGateway: gateway });
|
|
19
|
+
const result = await useCase.execute();
|
|
20
|
+
expect(result).toHaveLength(2);
|
|
21
|
+
expect(result.map((entry) => entry.pendingReviewRequestId).sort()).toEqual([
|
|
22
|
+
'pending-1',
|
|
23
|
+
'pending-2',
|
|
24
|
+
]);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=listPendingReviews.usecase.test.js.map
|
package/dist/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listPendingReviews.usecase.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/listPendingReviews.usecase.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mEAAmE,CAAC;AAC9G,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAEhG,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,OAAwC,CAAC;IAE7C,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,+BAA+B,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,EAAE,2BAA2B,EAAE,OAAO,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,OAAO,CAAC,WAAW,CAAC,2BAA2B,CAAC,MAAM,CAAC,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,WAAW,CAAC,2BAA2B,CAAC,MAAM,CAAC,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACjG,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,EAAE,2BAA2B,EAAE,OAAO,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEvC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;YACzE,WAAW;YACX,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|