Use business campaign rules instead of status errors

Introduce accessreview.Campaign with draft/deletable predicates and
operation-specific client errors. Drop errUnlessDraftCampaign and
status-to-sentinel switches in the service layer.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
This commit is contained in:
Cursor Agent
2026-07-27 13:37:49 +00:00
parent 5dca6bb883
commit 3f545652d5
5 changed files with 163 additions and 105 deletions

View File

@@ -52,27 +52,39 @@ func TestCampaignClientErrors(t *testing.T) {
sentinel: accessreview.ErrCampaignMissingSources,
},
{
name: "in progress",
err: accessreview.NewCampaignInProgressError(campaignID),
wantText: fmt.Sprintf("access review campaign %q is in progress", campaignID),
sentinel: accessreview.ErrCampaignInProgress,
name: "not draft",
err: accessreview.NewCampaignNotDraftError(campaignID),
wantText: fmt.Sprintf("access review campaign %q is not in draft", campaignID),
sentinel: accessreview.ErrCampaignNotDraft,
},
{
name: "pending actions",
err: accessreview.NewCampaignPendingActionsError(campaignID),
wantText: fmt.Sprintf("access review campaign %q is pending actions", campaignID),
sentinel: accessreview.ErrCampaignPendingActions,
name: "not deletable",
err: accessreview.NewCampaignNotDeletableError(campaignID),
wantText: fmt.Sprintf(
"access review campaign %q cannot be deleted unless it is draft or cancelled",
campaignID,
),
sentinel: accessreview.ErrCampaignNotDeletable,
},
{
name: "not pending actions",
err: accessreview.NewCampaignNotPendingActionsError(campaignID),
wantText: fmt.Sprintf(
"access review campaign %q cannot be closed unless it is pending actions",
campaignID,
),
sentinel: accessreview.ErrCampaignNotPendingActions,
},
{
name: "completed",
err: accessreview.NewCampaignCompletedError(campaignID),
wantText: fmt.Sprintf("access review campaign %q is completed", campaignID),
wantText: fmt.Sprintf("access review campaign %q is already completed", campaignID),
sentinel: accessreview.ErrCampaignCompleted,
},
{
name: "cancelled",
err: accessreview.NewCampaignCancelledError(campaignID),
wantText: fmt.Sprintf("access review campaign %q is cancelled", campaignID),
wantText: fmt.Sprintf("access review campaign %q is already cancelled", campaignID),
sentinel: accessreview.ErrCampaignCancelled,
},
}