reviewflow 3.34.0 → 3.36.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 +30 -0
- package/dist/dashboard/index.html +63 -2
- package/dist/dashboard/modules/i18n.d.ts.map +1 -1
- package/dist/dashboard/modules/i18n.js +10 -0
- package/dist/dashboard/modules/i18n.js.map +1 -1
- package/dist/dashboard/setup.html +17 -1
- package/dist/dashboard/styles.css +75 -0
- package/dist/frameworks/settings/runtimeSettings.d.ts +7 -0
- package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
- package/dist/frameworks/settings/runtimeSettings.js +14 -0
- package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
- package/dist/main/routes.d.ts.map +1 -1
- package/dist/main/routes.js +63 -30
- package/dist/main/routes.js.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/settings.routes.d.ts.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/settings.routes.js +19 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/settings.routes.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts +4 -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 -46
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.js +4 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.github.cli.gateway.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.js +4 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.gitlab.cli.gateway.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.js +3 -0
- package/dist/modules/platform-integration/interface-adapters/gateways/threadFetch.gitlab.gateway.js.map +1 -1
- package/dist/modules/platform-integration/services/scopedExecutorEnvironment.d.ts +1 -0
- package/dist/modules/platform-integration/services/scopedExecutorEnvironment.d.ts.map +1 -1
- package/dist/modules/platform-integration/services/scopedExecutorEnvironment.js +10 -3
- package/dist/modules/platform-integration/services/scopedExecutorEnvironment.js.map +1 -1
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.d.ts.map +1 -1
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.js +5 -1
- package/dist/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.js.map +1 -1
- package/dist/modules/review-execution/interface-adapters/gateways/cli/reviewAction.github.cli.gateway.d.ts.map +1 -1
- package/dist/modules/review-execution/interface-adapters/gateways/cli/reviewAction.github.cli.gateway.js +6 -4
- package/dist/modules/review-execution/interface-adapters/gateways/cli/reviewAction.github.cli.gateway.js.map +1 -1
- package/dist/modules/review-execution/services/contextActionsExecutor.d.ts.map +1 -1
- package/dist/modules/review-execution/services/contextActionsExecutor.js +23 -1
- package/dist/modules/review-execution/services/contextActionsExecutor.js.map +1 -1
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.d.ts +4 -0
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.d.ts.map +1 -1
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.js +6 -1
- package/dist/modules/review-execution/usecases/confirmPendingReview.usecase.js.map +1 -1
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts +3 -2
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.d.ts.map +1 -1
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js +2 -1
- package/dist/modules/review-execution/usecases/gateClaudeInvocation.usecase.js.map +1 -1
- package/dist/modules/setup-wizard/interface-adapters/controllers/http/setupWizard.routes.d.ts.map +1 -1
- package/dist/modules/setup-wizard/interface-adapters/controllers/http/setupWizard.routes.js +9 -0
- package/dist/modules/setup-wizard/interface-adapters/controllers/http/setupWizard.routes.js.map +1 -1
- package/dist/modules/setup-wizard/usecases/streamSetupRun.usecase.d.ts +14 -1
- package/dist/modules/setup-wizard/usecases/streamSetupRun.usecase.d.ts.map +1 -1
- package/dist/modules/setup-wizard/usecases/streamSetupRun.usecase.js +50 -6
- package/dist/modules/setup-wizard/usecases/streamSetupRun.usecase.js.map +1 -1
- package/dist/modules/shared-kernel/entities/triggerMode/triggerMode.schema.d.ts +7 -0
- package/dist/modules/shared-kernel/entities/triggerMode/triggerMode.schema.d.ts.map +1 -0
- package/dist/modules/shared-kernel/entities/triggerMode/triggerMode.schema.js +3 -0
- package/dist/modules/shared-kernel/entities/triggerMode/triggerMode.schema.js.map +1 -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 +14 -6
- 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.js +4 -3
- package/dist/tests/acceptance/174-semi-auto-review-trigger-mode.acceptance.test.js.map +1 -1
- package/dist/tests/acceptance/202-confirm-pending-review-runs-review.acceptance.test.d.ts +2 -0
- package/dist/tests/acceptance/202-confirm-pending-review-runs-review.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/202-confirm-pending-review-runs-review.acceptance.test.js +173 -0
- package/dist/tests/acceptance/202-confirm-pending-review-runs-review.acceptance.test.js.map +1 -0
- package/dist/tests/factories/pendingReviewRequest.factory.d.ts +1 -0
- package/dist/tests/factories/pendingReviewRequest.factory.d.ts.map +1 -1
- package/dist/tests/factories/pendingReviewRequest.factory.js +22 -0
- package/dist/tests/factories/pendingReviewRequest.factory.js.map +1 -1
- package/dist/tests/stubs/claudeSession.stub.d.ts +8 -0
- package/dist/tests/stubs/claudeSession.stub.d.ts.map +1 -1
- package/dist/tests/stubs/claudeSession.stub.js +24 -2
- package/dist/tests/stubs/claudeSession.stub.js.map +1 -1
- package/dist/tests/units/entities/insight/teamInsight.guard.test.d.ts +2 -0
- package/dist/tests/units/entities/insight/teamInsight.guard.test.d.ts.map +1 -0
- package/dist/tests/units/entities/insight/teamInsight.guard.test.js +45 -0
- package/dist/tests/units/entities/insight/teamInsight.guard.test.js.map +1 -0
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.js +48 -3
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.js +36 -1
- package/dist/tests/units/interface-adapters/controllers/http/settings.routes.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/controllers/http/stats.routes.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/controllers/http/stats.routes.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/controllers/http/stats.routes.test.js +208 -0
- package/dist/tests/units/interface-adapters/controllers/http/stats.routes.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/controllers/mcp/addAction.handler.test.js +92 -0
- package/dist/tests/units/interface-adapters/controllers/mcp/addAction.handler.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +303 -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 +360 -2
- package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/gateways/cli/reviewAction.github.cli.gateway.test.js +10 -3
- package/dist/tests/units/interface-adapters/gateways/cli/reviewAction.github.cli.gateway.test.js.map +1 -1
- package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.js +66 -0
- package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.js.map +1 -1
- package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.js +62 -0
- package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.js.map +1 -1
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/cliStatus.routes.test.d.ts +2 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/cliStatus.routes.test.d.ts.map +1 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/cliStatus.routes.test.js +182 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/cliStatus.routes.test.js.map +1 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js +225 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js.map +1 -1
- package/dist/tests/units/modules/ember-chat/gateways/emberAnswerTransport.claude.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/ember-chat/gateways/emberAnswerTransport.claude.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/ember-chat/gateways/emberAnswerTransport.claude.gateway.test.js +171 -0
- package/dist/tests/units/modules/ember-chat/gateways/emberAnswerTransport.claude.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/platform-integration/controllers/githubProcessorProvenance.test.d.ts +2 -0
- package/dist/tests/units/modules/platform-integration/controllers/githubProcessorProvenance.test.d.ts.map +1 -0
- package/dist/tests/units/modules/platform-integration/controllers/githubProcessorProvenance.test.js +70 -0
- package/dist/tests/units/modules/platform-integration/controllers/githubProcessorProvenance.test.js.map +1 -0
- package/dist/tests/units/modules/platform-integration/entities/transport/cidr.test.d.ts +2 -0
- package/dist/tests/units/modules/platform-integration/entities/transport/cidr.test.d.ts.map +1 -0
- package/dist/tests/units/modules/platform-integration/entities/transport/cidr.test.js +51 -0
- package/dist/tests/units/modules/platform-integration/entities/transport/cidr.test.js.map +1 -0
- package/dist/tests/units/modules/platform-integration/gateways/scopedGitLabExecutor.test.js +4 -0
- package/dist/tests/units/modules/platform-integration/gateways/scopedGitLabExecutor.test.js.map +1 -1
- package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.cli.shellSafety.test.d.ts +2 -0
- package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.cli.shellSafety.test.d.ts.map +1 -0
- package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.cli.shellSafety.test.js +39 -0
- package/dist/tests/units/modules/platform-integration/interface-adapters/gateways/cli/noteCommentPost.cli.shellSafety.test.js.map +1 -0
- package/dist/tests/units/modules/platform-integration/services/scopedExecutorEnvironment.test.js +15 -2
- package/dist/tests/units/modules/platform-integration/services/scopedExecutorEnvironment.test.js.map +1 -1
- package/dist/tests/units/modules/review-execution/entities/reviewRequest/reviewRequest.guard.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/entities/reviewRequest/reviewRequest.guard.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/reviewRequest/reviewRequest.guard.test.js +34 -0
- package/dist/tests/units/modules/review-execution/entities/reviewRequest/reviewRequest.guard.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.js +21 -2
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.js.map +1 -1
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/reviews.routes.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/reviews.routes.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/reviews.routes.test.js +210 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/controllers/http/reviews.routes.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.test.js +103 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js +25 -0
- package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js.map +1 -1
- package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js +34 -7
- package/dist/tests/units/modules/review-execution/usecases/gateClaudeInvocation.usecase.test.js.map +1 -1
- package/dist/tests/units/modules/setup-wizard/gateways/serverConfig.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/setup-wizard/gateways/serverConfig.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/setup-wizard/gateways/serverConfig.fileSystem.gateway.test.js +98 -0
- package/dist/tests/units/modules/setup-wizard/gateways/serverConfig.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/controllers/http/setupWizard.routes.test.js +12 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/controllers/http/setupWizard.routes.test.js.map +1 -1
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/skillTemplate.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/skillTemplate.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/skillTemplate.fileSystem.gateway.test.js +51 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/skillTemplate.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/validation.adapter.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/validation.adapter.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/validation.adapter.gateway.test.js +70 -0
- package/dist/tests/units/modules/setup-wizard/interface-adapters/gateways/validation.adapter.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/setup-wizard/usecases/streamSetupRun.usecase.test.js +60 -1
- package/dist/tests/units/modules/setup-wizard/usecases/streamSetupRun.usecase.test.js.map +1 -1
- package/dist/tests/units/modules/shared-kernel/entities/triggerMode/triggerMode.schema.test.d.ts +2 -0
- package/dist/tests/units/modules/shared-kernel/entities/triggerMode/triggerMode.schema.test.d.ts.map +1 -0
- package/dist/tests/units/modules/shared-kernel/entities/triggerMode/triggerMode.schema.test.js +14 -0
- package/dist/tests/units/modules/shared-kernel/entities/triggerMode/triggerMode.schema.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/developerInsight.guard.test.d.ts +2 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/developerInsight.guard.test.d.ts.map +1 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/developerInsight.guard.test.js +49 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/developerInsight.guard.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/persistedInsightsData.guard.test.d.ts +2 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/persistedInsightsData.guard.test.d.ts.map +1 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/persistedInsightsData.guard.test.js +29 -0
- package/dist/tests/units/modules/statistics-insights/entities/insight/persistedInsightsData.guard.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/gateways/aiInsightsSession.claude.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/statistics-insights/gateways/aiInsightsSession.claude.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/statistics-insights/gateways/aiInsightsSession.claude.gateway.test.js +63 -0
- package/dist/tests/units/modules/statistics-insights/gateways/aiInsightsSession.claude.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/gateways/stats.fileSystem.test.d.ts +2 -0
- package/dist/tests/units/modules/statistics-insights/gateways/stats.fileSystem.test.d.ts.map +1 -0
- package/dist/tests/units/modules/statistics-insights/gateways/stats.fileSystem.test.js +73 -0
- package/dist/tests/units/modules/statistics-insights/gateways/stats.fileSystem.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js +99 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js.map +1 -1
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.js +60 -2
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.js.map +1 -1
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.test.js +499 -18
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTrackingAdvanced.routes.test.js.map +1 -1
- package/dist/tests/units/modules/tracking/interface-adapters/gateways/fileSystem/reviewRequestTracking.fileSystem.test.d.ts +2 -0
- package/dist/tests/units/modules/tracking/interface-adapters/gateways/fileSystem/reviewRequestTracking.fileSystem.test.d.ts.map +1 -0
- package/dist/tests/units/modules/tracking/interface-adapters/gateways/fileSystem/reviewRequestTracking.fileSystem.test.js +273 -0
- package/dist/tests/units/modules/tracking/interface-adapters/gateways/fileSystem/reviewRequestTracking.fileSystem.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.js +47 -1
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.js.map +1 -1
- package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js +98 -0
- package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js.map +1 -1
- package/dist/tests/units/services/contextActionsExecutor.test.js +67 -0
- package/dist/tests/units/services/contextActionsExecutor.test.js.map +1 -1
- package/dist/tests/units/services/statsService.branches.test.d.ts +2 -0
- package/dist/tests/units/services/statsService.branches.test.d.ts.map +1 -0
- package/dist/tests/units/services/statsService.branches.test.js +266 -0
- package/dist/tests/units/services/statsService.branches.test.js.map +1 -0
- package/dist/tests/units/shared/services/logFileReader.test.d.ts +2 -0
- package/dist/tests/units/shared/services/logFileReader.test.d.ts.map +1 -0
- package/dist/tests/units/shared/services/logFileReader.test.js +70 -0
- package/dist/tests/units/shared/services/logFileReader.test.js.map +1 -0
- package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.js +206 -0
- package/dist/tests/units/usecases/insights/buildAiInsightsPrompt.test.js.map +1 -1
- package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.js +40 -0
- package/dist/tests/units/usecases/insights/computeDeveloperInsights.usecase.test.js.map +1 -1
- package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.js +204 -0
- package/dist/tests/units/usecases/insights/computeInsightsWithPersistence.usecase.test.js.map +1 -1
- package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.js +57 -0
- package/dist/tests/units/usecases/insights/getInsightsWithAiStatus.usecase.test.js.map +1 -1
- package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.js +391 -1
- package/dist/tests/units/usecases/insights/insightLevelComputation.service.test.js.map +1 -1
- package/package.json +4 -1
package/dist/tests/units/modules/review-execution/entities/reviewRequest/reviewRequest.guard.test.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseReviewRequest, safeParseReviewRequest, isValidReviewRequest, } from '../../../../../../modules/review-execution/entities/reviewRequest/reviewRequest.guard.js';
|
|
3
|
+
const validReviewRequest = {
|
|
4
|
+
platform: 'gitlab',
|
|
5
|
+
projectPath: 'group/project',
|
|
6
|
+
reviewRequestNumber: 42,
|
|
7
|
+
title: 'Add feature',
|
|
8
|
+
sourceBranch: 'feat/x',
|
|
9
|
+
targetBranch: 'main',
|
|
10
|
+
state: 'open',
|
|
11
|
+
isDraft: false,
|
|
12
|
+
author: 'alice',
|
|
13
|
+
webUrl: 'https://gitlab.example.com/group/project/-/merge_requests/42',
|
|
14
|
+
createdAt: '2026-05-30T10:00:00Z',
|
|
15
|
+
updatedAt: '2026-05-30T11:00:00Z',
|
|
16
|
+
};
|
|
17
|
+
describe('reviewRequest.guard', () => {
|
|
18
|
+
it('parses a valid review request', () => {
|
|
19
|
+
const result = parseReviewRequest(validReviewRequest);
|
|
20
|
+
expect(result.reviewRequestNumber).toBe(42);
|
|
21
|
+
});
|
|
22
|
+
it('throws when parsing an invalid review request', () => {
|
|
23
|
+
expect(() => parseReviewRequest({ ...validReviewRequest, reviewRequestNumber: -1 })).toThrow();
|
|
24
|
+
});
|
|
25
|
+
it('safeParse succeeds on a valid request and fails on a bad url', () => {
|
|
26
|
+
expect(safeParseReviewRequest(validReviewRequest).success).toBe(true);
|
|
27
|
+
expect(safeParseReviewRequest({ ...validReviewRequest, webUrl: 'not-a-url' }).success).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
it('isValid reflects validity', () => {
|
|
30
|
+
expect(isValidReviewRequest(validReviewRequest)).toBe(true);
|
|
31
|
+
expect(isValidReviewRequest({ platform: 'bitbucket' })).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=reviewRequest.guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewRequest.guard.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/review-execution/entities/reviewRequest/reviewRequest.guard.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0EAA0E,CAAC;AAElF,MAAM,kBAAkB,GAAG;IACzB,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,eAAe;IAC5B,mBAAmB,EAAE,EAAE;IACvB,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,MAAM;IACpB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,8DAA8D;IACtE,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,sBAAsB;CAClC,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,GAAG,kBAAkB,EAAE,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,sBAAsB,CAAC,EAAE,GAAG,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { PendingReviewPresenter } from '../../../../../../../modules/review-exec
|
|
|
8
8
|
import { StubPendingReviewRequestGateway } from '../../../../../../../tests/stubs/pendingReviewRequest.stub.js';
|
|
9
9
|
import { PendingReviewRequestFactory } from '../../../../../../../tests/factories/pendingReviewRequest.factory.js';
|
|
10
10
|
import { createStubLogger } from '../../../../../../../tests/stubs/logger.stub.js';
|
|
11
|
-
async function buildApp(gateway, activeJobs) {
|
|
11
|
+
async function buildApp(gateway, activeJobs, isProjectRunnable = () => true) {
|
|
12
12
|
const app = Fastify();
|
|
13
13
|
const logger = createStubLogger();
|
|
14
14
|
await app.register(pendingReviewsRoutes, {
|
|
@@ -21,6 +21,7 @@ async function buildApp(gateway, activeJobs) {
|
|
|
21
21
|
return true;
|
|
22
22
|
},
|
|
23
23
|
resolveProcessor: () => async () => { },
|
|
24
|
+
isProjectRunnable,
|
|
24
25
|
logger,
|
|
25
26
|
}),
|
|
26
27
|
dismissPendingReview: new DismissPendingReviewUseCase({
|
|
@@ -70,7 +71,10 @@ describe('pendingReviewsRoutes', () => {
|
|
|
70
71
|
url: '/api/pending-reviews/unknown/confirm',
|
|
71
72
|
});
|
|
72
73
|
expect(response.statusCode).toBe(404);
|
|
73
|
-
expect(response.json()).toEqual({
|
|
74
|
+
expect(response.json()).toEqual({
|
|
75
|
+
status: 'not-found',
|
|
76
|
+
message: 'Cette review en attente est introuvable',
|
|
77
|
+
});
|
|
74
78
|
});
|
|
75
79
|
it('POST .../confirm returns 409 with French message when already running', async () => {
|
|
76
80
|
const pending = PendingReviewRequestFactory.create();
|
|
@@ -86,6 +90,21 @@ describe('pendingReviewsRoutes', () => {
|
|
|
86
90
|
message: 'Cette review est déjà en cours',
|
|
87
91
|
});
|
|
88
92
|
});
|
|
93
|
+
it('POST .../confirm returns 422 with French message when the project is no longer configured', async () => {
|
|
94
|
+
const pending = PendingReviewRequestFactory.create();
|
|
95
|
+
gateway.prepopulate(pending);
|
|
96
|
+
await app.close();
|
|
97
|
+
app = await buildApp(gateway, activeJobs, () => false);
|
|
98
|
+
const response = await app.inject({
|
|
99
|
+
method: 'POST',
|
|
100
|
+
url: `/api/pending-reviews/${pending.pendingReviewRequestId}/confirm`,
|
|
101
|
+
});
|
|
102
|
+
expect(response.statusCode).toBe(422);
|
|
103
|
+
expect(response.json()).toEqual({
|
|
104
|
+
status: 'project-not-configured',
|
|
105
|
+
message: "Le projet associé n'est plus configuré",
|
|
106
|
+
});
|
|
107
|
+
});
|
|
89
108
|
it('DELETE /api/pending-reviews/:id returns dismissed status', async () => {
|
|
90
109
|
const pending = PendingReviewRequestFactory.create();
|
|
91
110
|
gateway.prepopulate(pending);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pendingReviews.routes.test.js","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,OAAiC,MAAM,SAAS,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yFAAyF,CAAC;AAC/H,OAAO,EAAE,yBAAyB,EAAE,MAAM,mEAAmE,CAAC;AAC9G,OAAO,EAAE,2BAA2B,EAAE,MAAM,qEAAqE,CAAC;AAClH,OAAO,EAAE,2BAA2B,EAAE,MAAM,qEAAqE,CAAC;AAClH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qFAAqF,CAAC;AAC7H,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,KAAK,UAAU,QAAQ,CACrB,OAAwC,EACxC,UAAuB;
|
|
1
|
+
{"version":3,"file":"pendingReviews.routes.test.js","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/review-execution/interface-adapters/controllers/http/pendingReviews.routes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviews.routes.test.d.ts","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/review-execution/interface-adapters/controllers/http/reviews.routes.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import Fastify from 'fastify';
|
|
3
|
+
import { reviewRoutes } from '../../../../../../../modules/review-execution/interface-adapters/controllers/http/reviews.routes.js';
|
|
4
|
+
import { InMemoryReviewFileGateway } from '../../../../../../../tests/stubs/reviewFile.stub.js';
|
|
5
|
+
import { InMemoryReviewRequestTrackingGateway } from '../../../../../../../tests/stubs/reviewRequestTracking.stub.js';
|
|
6
|
+
import { StubReviewQueuePort } from '../../../../../../../tests/stubs/reviewQueue.stub.js';
|
|
7
|
+
import { createStubLogger } from '../../../../../../../tests/stubs/logger.stub.js';
|
|
8
|
+
import { TrackedMrFactory } from '../../../../../../../tests/factories/trackedMr.factory.js';
|
|
9
|
+
describe('reviewRoutes', () => {
|
|
10
|
+
let app;
|
|
11
|
+
let reviewFileGateway;
|
|
12
|
+
let reviewRequestTrackingGateway;
|
|
13
|
+
let queuePort;
|
|
14
|
+
let repositories;
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
app = Fastify();
|
|
17
|
+
reviewFileGateway = new InMemoryReviewFileGateway();
|
|
18
|
+
reviewRequestTrackingGateway = new InMemoryReviewRequestTrackingGateway();
|
|
19
|
+
queuePort = new StubReviewQueuePort();
|
|
20
|
+
repositories = [];
|
|
21
|
+
await app.register(reviewRoutes, {
|
|
22
|
+
reviewFileGateway,
|
|
23
|
+
reviewRequestTrackingGateway,
|
|
24
|
+
getRepositories: () => repositories,
|
|
25
|
+
queuePort,
|
|
26
|
+
logger: createStubLogger(),
|
|
27
|
+
});
|
|
28
|
+
await app.ready();
|
|
29
|
+
});
|
|
30
|
+
afterEach(async () => {
|
|
31
|
+
await app.close();
|
|
32
|
+
});
|
|
33
|
+
describe('GET /api/reviews', () => {
|
|
34
|
+
it('returns reviews for an explicit valid path', async () => {
|
|
35
|
+
reviewFileGateway.addReview('/repo/a', '2026-05-01-MR-12-front.md', '# Code Review - MR #12 (login)');
|
|
36
|
+
const response = await app.inject({
|
|
37
|
+
method: 'GET',
|
|
38
|
+
url: '/api/reviews?path=/repo/a',
|
|
39
|
+
});
|
|
40
|
+
expect(response.statusCode).toBe(200);
|
|
41
|
+
const body = response.json();
|
|
42
|
+
expect(body.count).toBe(1);
|
|
43
|
+
expect(body.reviews[0].filename).toBe('2026-05-01-MR-12-front.md');
|
|
44
|
+
});
|
|
45
|
+
it('rejects a path without a leading slash', async () => {
|
|
46
|
+
const response = await app.inject({
|
|
47
|
+
method: 'GET',
|
|
48
|
+
url: '/api/reviews?path=relative/path',
|
|
49
|
+
});
|
|
50
|
+
expect(response.statusCode).toBe(200);
|
|
51
|
+
const body = response.json();
|
|
52
|
+
expect(body.error).toBe('Invalid path');
|
|
53
|
+
expect(body.reviews).toEqual([]);
|
|
54
|
+
expect(body.count).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
it('rejects a path containing directory traversal', async () => {
|
|
57
|
+
const response = await app.inject({
|
|
58
|
+
method: 'GET',
|
|
59
|
+
url: '/api/reviews?path=/repo/../etc',
|
|
60
|
+
});
|
|
61
|
+
expect(response.statusCode).toBe(200);
|
|
62
|
+
const body = response.json();
|
|
63
|
+
expect(body.error).toBe('Invalid path');
|
|
64
|
+
});
|
|
65
|
+
it('aggregates enabled repositories and skips disabled ones when no path is given', async () => {
|
|
66
|
+
reviewFileGateway.addReview('/repo/a', '2026-05-01-MR-1-front.md', '# Code Review - MR #1 (a)');
|
|
67
|
+
reviewFileGateway.addReview('/repo/b', '2026-05-02-MR-2-front.md', '# Code Review - MR #2 (b)');
|
|
68
|
+
repositories = [
|
|
69
|
+
{ localPath: '/repo/a', enabled: true },
|
|
70
|
+
{ localPath: '/repo/b', enabled: false },
|
|
71
|
+
];
|
|
72
|
+
const response = await app.inject({
|
|
73
|
+
method: 'GET',
|
|
74
|
+
url: '/api/reviews',
|
|
75
|
+
});
|
|
76
|
+
expect(response.statusCode).toBe(200);
|
|
77
|
+
const body = response.json();
|
|
78
|
+
expect(body.count).toBe(1);
|
|
79
|
+
expect(body.reviews[0].filename).toBe('2026-05-01-MR-1-front.md');
|
|
80
|
+
});
|
|
81
|
+
it('returns an empty aggregate when no repositories are configured', async () => {
|
|
82
|
+
const response = await app.inject({
|
|
83
|
+
method: 'GET',
|
|
84
|
+
url: '/api/reviews',
|
|
85
|
+
});
|
|
86
|
+
expect(response.statusCode).toBe(200);
|
|
87
|
+
const body = response.json();
|
|
88
|
+
expect(body.reviews).toEqual([]);
|
|
89
|
+
expect(body.count).toBe(0);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('GET /api/reviews/:filename', () => {
|
|
93
|
+
it('returns 400 for an invalid filename format', async () => {
|
|
94
|
+
const response = await app.inject({
|
|
95
|
+
method: 'GET',
|
|
96
|
+
url: '/api/reviews/not-a-valid-name',
|
|
97
|
+
});
|
|
98
|
+
expect(response.statusCode).toBe(400);
|
|
99
|
+
expect(response.json().error).toBe('Invalid filename format');
|
|
100
|
+
});
|
|
101
|
+
it('returns the review content from an enabled repository', async () => {
|
|
102
|
+
reviewFileGateway.addReview('/repo/a', '2026-05-01-MR-12-front.md', 'CONTENT');
|
|
103
|
+
repositories = [{ localPath: '/repo/a', enabled: true }];
|
|
104
|
+
const response = await app.inject({
|
|
105
|
+
method: 'GET',
|
|
106
|
+
url: '/api/reviews/2026-05-01-MR-12-front.md',
|
|
107
|
+
});
|
|
108
|
+
expect(response.statusCode).toBe(200);
|
|
109
|
+
const body = response.json();
|
|
110
|
+
expect(body.filename).toBe('2026-05-01-MR-12-front.md');
|
|
111
|
+
expect(body.content).toBe('CONTENT');
|
|
112
|
+
});
|
|
113
|
+
it('skips disabled repositories and returns 404 when not found anywhere', async () => {
|
|
114
|
+
reviewFileGateway.addReview('/repo/a', '2026-05-01-MR-12-front.md', 'CONTENT');
|
|
115
|
+
repositories = [{ localPath: '/repo/a', enabled: false }];
|
|
116
|
+
const response = await app.inject({
|
|
117
|
+
method: 'GET',
|
|
118
|
+
url: '/api/reviews/2026-05-01-MR-12-front.md',
|
|
119
|
+
});
|
|
120
|
+
expect(response.statusCode).toBe(404);
|
|
121
|
+
expect(response.json().error).toBe('Review not found');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('DELETE /api/reviews/:filename', () => {
|
|
125
|
+
it('returns 400 for an invalid filename format', async () => {
|
|
126
|
+
const response = await app.inject({
|
|
127
|
+
method: 'DELETE',
|
|
128
|
+
url: '/api/reviews/invalid',
|
|
129
|
+
});
|
|
130
|
+
expect(response.statusCode).toBe(400);
|
|
131
|
+
const body = response.json();
|
|
132
|
+
expect(body.success).toBe(false);
|
|
133
|
+
expect(body.error).toBe('Invalid filename format');
|
|
134
|
+
});
|
|
135
|
+
it('deletes an existing review in an enabled repository', async () => {
|
|
136
|
+
reviewFileGateway.addReview('/repo/a', '2026-05-01-MR-12-front.md', 'CONTENT');
|
|
137
|
+
repositories = [{ localPath: '/repo/a', enabled: true }];
|
|
138
|
+
const response = await app.inject({
|
|
139
|
+
method: 'DELETE',
|
|
140
|
+
url: '/api/reviews/2026-05-01-MR-12-front.md',
|
|
141
|
+
});
|
|
142
|
+
expect(response.statusCode).toBe(200);
|
|
143
|
+
expect(response.json().success).toBe(true);
|
|
144
|
+
expect(await reviewFileGateway.reviewExists('/repo/a', '2026-05-01-MR-12-front.md')).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
it('skips disabled repositories and returns 404 when nothing is deleted', async () => {
|
|
147
|
+
reviewFileGateway.addReview('/repo/a', '2026-05-01-MR-12-front.md', 'CONTENT');
|
|
148
|
+
repositories = [{ localPath: '/repo/a', enabled: false }];
|
|
149
|
+
const response = await app.inject({
|
|
150
|
+
method: 'DELETE',
|
|
151
|
+
url: '/api/reviews/2026-05-01-MR-12-front.md',
|
|
152
|
+
});
|
|
153
|
+
expect(response.statusCode).toBe(404);
|
|
154
|
+
const body = response.json();
|
|
155
|
+
expect(body.success).toBe(false);
|
|
156
|
+
expect(body.error).toBe('Review not found');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('POST /api/reviews/cancel/:jobId', () => {
|
|
160
|
+
it('cancels a running job without tracking removal when body is empty', async () => {
|
|
161
|
+
queuePort.setJobStatus('job-1', 'running');
|
|
162
|
+
const response = await app.inject({
|
|
163
|
+
method: 'POST',
|
|
164
|
+
url: '/api/reviews/cancel/job-1',
|
|
165
|
+
payload: {},
|
|
166
|
+
});
|
|
167
|
+
expect(response.statusCode).toBe(200);
|
|
168
|
+
const body = response.json();
|
|
169
|
+
expect(body.success).toBe(true);
|
|
170
|
+
expect(body.message).toBe('Job job-1 cancelled');
|
|
171
|
+
expect(queuePort.cancelledJobs).toContain('job-1');
|
|
172
|
+
});
|
|
173
|
+
it('cancels a job and removes tracking when projectPath and mrId are provided', async () => {
|
|
174
|
+
queuePort.setJobStatus('job-2', 'queued');
|
|
175
|
+
reviewRequestTrackingGateway.create('/repo/a', TrackedMrFactory.create({ id: 'mr-99', mrNumber: 99 }));
|
|
176
|
+
const response = await app.inject({
|
|
177
|
+
method: 'POST',
|
|
178
|
+
url: '/api/reviews/cancel/job-2',
|
|
179
|
+
payload: { projectPath: '/repo/a', mrId: 'mr-99' },
|
|
180
|
+
});
|
|
181
|
+
expect(response.statusCode).toBe(200);
|
|
182
|
+
expect(response.json().success).toBe(true);
|
|
183
|
+
expect(reviewRequestTrackingGateway.getById('/repo/a', 'mr-99')).toBeNull();
|
|
184
|
+
});
|
|
185
|
+
it('returns already-completed status when the job is finished', async () => {
|
|
186
|
+
queuePort.setJobStatus('job-3', 'completed');
|
|
187
|
+
const response = await app.inject({
|
|
188
|
+
method: 'POST',
|
|
189
|
+
url: '/api/reviews/cancel/job-3',
|
|
190
|
+
payload: {},
|
|
191
|
+
});
|
|
192
|
+
expect(response.statusCode).toBe(200);
|
|
193
|
+
const body = response.json();
|
|
194
|
+
expect(body.success).toBe(false);
|
|
195
|
+
expect(body.status).toBe('already-completed');
|
|
196
|
+
});
|
|
197
|
+
it('returns 404 when the job does not exist', async () => {
|
|
198
|
+
const response = await app.inject({
|
|
199
|
+
method: 'POST',
|
|
200
|
+
url: '/api/reviews/cancel/unknown-job',
|
|
201
|
+
payload: {},
|
|
202
|
+
});
|
|
203
|
+
expect(response.statusCode).toBe(404);
|
|
204
|
+
const body = response.json();
|
|
205
|
+
expect(body.success).toBe(false);
|
|
206
|
+
expect(body.error).toBe('Job non trouvé');
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=reviews.routes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviews.routes.test.js","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/review-execution/interface-adapters/controllers/http/reviews.routes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewFile.fileSystem.test.d.ts","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { FileSystemReviewFileGateway } from '../../../../../../../modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.js';
|
|
6
|
+
function reviewsDir(projectPath) {
|
|
7
|
+
const dir = join(projectPath, '.claude', 'reviews');
|
|
8
|
+
mkdirSync(dir, { recursive: true });
|
|
9
|
+
return dir;
|
|
10
|
+
}
|
|
11
|
+
describe('FileSystemReviewFileGateway (integration with real filesystem)', () => {
|
|
12
|
+
let projectPath;
|
|
13
|
+
let gateway;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
projectPath = mkdtempSync(join(tmpdir(), 'review-file-'));
|
|
16
|
+
gateway = new FileSystemReviewFileGateway();
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
rmSync(projectPath, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
describe('getReviewsDirectory', () => {
|
|
22
|
+
it('returns the .claude/reviews directory under the project path', () => {
|
|
23
|
+
expect(gateway.getReviewsDirectory('/my/project')).toBe('/my/project/.claude/reviews');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('listReviews', () => {
|
|
27
|
+
it('returns an empty array when the reviews directory does not exist', async () => {
|
|
28
|
+
const result = await gateway.listReviews(projectPath);
|
|
29
|
+
expect(result).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
it('parses metadata and title for MR and PR review files, sorted by mtime desc', async () => {
|
|
32
|
+
const dir = reviewsDir(projectPath);
|
|
33
|
+
writeFileSync(join(dir, '2024-01-15-MR-42-review.md'), '# Code Review - MR !42 (fix: resolve bug)\n\nbody');
|
|
34
|
+
writeFileSync(join(dir, '2024-01-16-PR-123-review.md'), '# Code Review - PR #123 (feat: add feature)\n\nbody');
|
|
35
|
+
const result = await gateway.listReviews(projectPath);
|
|
36
|
+
expect(result).toHaveLength(2);
|
|
37
|
+
const byNumber = new Map(result.map(review => [review.mrNumber, review]));
|
|
38
|
+
const mrReview = byNumber.get('42');
|
|
39
|
+
const prReview = byNumber.get('123');
|
|
40
|
+
expect(mrReview?.date).toBe('2024-01-15');
|
|
41
|
+
expect(mrReview?.type).toBe('review');
|
|
42
|
+
expect(mrReview?.title).toBe('fix: resolve bug');
|
|
43
|
+
expect(mrReview?.size).toBeGreaterThan(0);
|
|
44
|
+
expect(mrReview?.path).toBe(join(dir, '2024-01-15-MR-42-review.md'));
|
|
45
|
+
expect(prReview?.title).toBe('feat: add feature');
|
|
46
|
+
expect(typeof prReview?.mtime).toBe('string');
|
|
47
|
+
});
|
|
48
|
+
it('leaves the title absent when the first line does not match the title format', async () => {
|
|
49
|
+
const dir = reviewsDir(projectPath);
|
|
50
|
+
writeFileSync(join(dir, '2024-01-15-PR-7-review.md'), '# Some other heading\n\nbody');
|
|
51
|
+
const result = await gateway.listReviews(projectPath);
|
|
52
|
+
expect(result).toHaveLength(1);
|
|
53
|
+
expect(result[0].title).toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
it('ignores non-markdown files and markdown files not matching the review pattern', async () => {
|
|
56
|
+
const dir = reviewsDir(projectPath);
|
|
57
|
+
writeFileSync(join(dir, '2024-01-15-MR-42-review.md'), '# Code Review - MR !42 (ok)\n');
|
|
58
|
+
writeFileSync(join(dir, 'notes.txt'), 'plain text');
|
|
59
|
+
writeFileSync(join(dir, 'random.md'), '# not a review');
|
|
60
|
+
const result = await gateway.listReviews(projectPath);
|
|
61
|
+
expect(result).toHaveLength(1);
|
|
62
|
+
expect(result[0].mrNumber).toBe('42');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('readReview', () => {
|
|
66
|
+
it('returns the file content when the review exists', async () => {
|
|
67
|
+
const dir = reviewsDir(projectPath);
|
|
68
|
+
writeFileSync(join(dir, '2024-01-15-MR-42-review.md'), '# Review\n\nContent here');
|
|
69
|
+
const result = await gateway.readReview(projectPath, '2024-01-15-MR-42-review.md');
|
|
70
|
+
expect(result).toBe('# Review\n\nContent here');
|
|
71
|
+
});
|
|
72
|
+
it('returns null when the review file is missing', async () => {
|
|
73
|
+
const result = await gateway.readReview(projectPath, 'missing.md');
|
|
74
|
+
expect(result).toBeNull();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('reviewExists', () => {
|
|
78
|
+
it('returns true when the review file exists', async () => {
|
|
79
|
+
const dir = reviewsDir(projectPath);
|
|
80
|
+
writeFileSync(join(dir, '2024-01-15-MR-42-review.md'), 'Content');
|
|
81
|
+
const result = await gateway.reviewExists(projectPath, '2024-01-15-MR-42-review.md');
|
|
82
|
+
expect(result).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it('returns false when the review file is missing', async () => {
|
|
85
|
+
const result = await gateway.reviewExists(projectPath, 'missing.md');
|
|
86
|
+
expect(result).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('deleteReview', () => {
|
|
90
|
+
it('deletes an existing review and returns true', async () => {
|
|
91
|
+
const dir = reviewsDir(projectPath);
|
|
92
|
+
writeFileSync(join(dir, '2024-01-15-MR-42-review.md'), 'Content');
|
|
93
|
+
const result = await gateway.deleteReview(projectPath, '2024-01-15-MR-42-review.md');
|
|
94
|
+
expect(result).toBe(true);
|
|
95
|
+
expect(await gateway.reviewExists(projectPath, '2024-01-15-MR-42-review.md')).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('returns false when the review file is missing', async () => {
|
|
98
|
+
const result = await gateway.deleteReview(projectPath, 'missing.md');
|
|
99
|
+
expect(result).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=reviewFile.fileSystem.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewFile.fileSystem.test.js","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/reviewFile.fileSystem.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js
CHANGED
|
@@ -33,6 +33,7 @@ describe('ConfirmPendingReviewUseCase', () => {
|
|
|
33
33
|
},
|
|
34
34
|
enqueue: enqueueSuccess,
|
|
35
35
|
resolveProcessor: () => fakeProcessor,
|
|
36
|
+
isProjectRunnable: () => true,
|
|
36
37
|
logger,
|
|
37
38
|
});
|
|
38
39
|
}
|
|
@@ -76,11 +77,35 @@ describe('ConfirmPendingReviewUseCase', () => {
|
|
|
76
77
|
queuePort: { hasActiveJob: () => false, getJobStatus: () => null },
|
|
77
78
|
enqueue: async () => false,
|
|
78
79
|
resolveProcessor: () => fakeProcessor,
|
|
80
|
+
isProjectRunnable: () => true,
|
|
79
81
|
logger,
|
|
80
82
|
});
|
|
81
83
|
const result = await useCase.execute({ pendingId: pending.pendingReviewRequestId });
|
|
82
84
|
expect(result.status).toBe('already-running');
|
|
83
85
|
});
|
|
84
86
|
});
|
|
87
|
+
describe('Rule: confirming a request whose project is no longer configured is rejected', () => {
|
|
88
|
+
it('returns project-not-configured with the exact French message and keeps the pending entry', async () => {
|
|
89
|
+
const pending = PendingReviewRequestFactory.create();
|
|
90
|
+
gateway.prepopulate(pending);
|
|
91
|
+
const useCase = new ConfirmPendingReviewUseCase({
|
|
92
|
+
pendingReviewRequestGateway: gateway,
|
|
93
|
+
queuePort: { hasActiveJob: (id) => activeJobs.has(id), getJobStatus: () => null },
|
|
94
|
+
enqueue: enqueueSuccess,
|
|
95
|
+
resolveProcessor: () => fakeProcessor,
|
|
96
|
+
isProjectRunnable: () => false,
|
|
97
|
+
logger,
|
|
98
|
+
});
|
|
99
|
+
const result = await useCase.execute({ pendingId: pending.pendingReviewRequestId });
|
|
100
|
+
expect(result.status).toBe('project-not-configured');
|
|
101
|
+
if (result.status === 'project-not-configured') {
|
|
102
|
+
expect(result.message).toBe("Le projet associé n'est plus configuré");
|
|
103
|
+
}
|
|
104
|
+
expect(enqueueCalls).toHaveLength(0);
|
|
105
|
+
expect(processorRuns).toBe(0);
|
|
106
|
+
expect(gateway.deleteCount).toBe(0);
|
|
107
|
+
expect(await gateway.listAll()).toHaveLength(1);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
85
110
|
});
|
|
86
111
|
//# sourceMappingURL=confirmPendingReview.usecase.test.js.map
|
package/dist/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.js.map
CHANGED
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"confirmPendingReview.usecase.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/review-execution/usecases/confirmPendingReview.usecase.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qEAAqE,CAAC;AAClH,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,OAAwC,CAAC;IAC7C,IAAI,UAAuB,CAAC;IAC5B,IAAI,YAAyB,CAAC;IAC9B,IAAI,aAAqB,CAAC;IAC1B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,+BAA+B,EAAE,CAAC;QAChD,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,YAAY,GAAG,EAAE,CAAC;QAClB,aAAa,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,KAAK,EAC1B,GAAc,EACd,SAAiE,EAC/C,EAAE;QACpB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;QAC9C,aAAa,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,SAAS,WAAW;QAClB,OAAO,IAAI,2BAA2B,CAAC;YACrC,2BAA2B,EAAE,OAAO;YACpC,SAAS,EAAE;gBACT,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;aACzB;YACD,OAAO,EAAE,cAAc;YACvB,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;YACrC,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI;YAC7B,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;QAC7E,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,CAAC;YACrD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAE7B,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAE1F,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAChE,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8EAA8E,EAAE,GAAG,EAAE;QAC5F,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,CAAC;YACrD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAE1F,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACzF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,CAAC;YACrD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC;gBAC9C,2BAA2B,EAAE,OAAO;gBACpC,SAAS,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;gBAClE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;gBAC1B,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;gBACrC,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI;gBAC7B,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAEpF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8EAA8E,EAAE,GAAG,EAAE;QAC5F,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;YACxG,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,CAAC;YACrD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC;gBAC9C,2BAA2B,EAAE,OAAO;gBACpC,SAAS,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;gBACjF,OAAO,EAAE,cAAc;gBACvB,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;gBACrC,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;gBAC9B,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAEpF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,MAAM,KAAK,wBAAwB,EAAE,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|