package projectinstance import ( "context" "testing" "chat-agent-system/internal/workflowdef" ) func TestCheckDocTaskAccess_DisabledDocumentRejected(t *testing.T) { ctx := context.Background() store := NewMemoryStore() _ = SeedProjectMeta(store, 400, LifecyclePlanning, "", 1, 0) resolver := disabledDocResolver() svc := NewService(store, resolver, nil, nil) version := resolver.versions[workflowdef.OfficialKeyMain] plan := buildDefaultPlan(version) for i := range plan.Stages[0].DocTasks { if plan.Stages[0].DocTasks[i].TaskKey == "research" { plan.Stages[0].DocTasks[i].Enabled = false continue } plan.Stages[0].DocTasks[i].Duties = DocDuty{AuthorUserID: 1, ReviewerUserID: 2, ApproverUserID: 3} } _, _ = svc.SaveWorkflowPlan(ctx, 400, 1, true, SavePlanInput{Plan: plan, ExpectedPlanRevision: 0, ExpectedSelectionVersion: 1}) preview, _ := svc.ActivationPreview(ctx, 400, 1, true) _, _ = svc.Activate(ctx, 400, 1, true, ActivateInput{ ConfirmationToken: preview.ConfirmationToken, ExpectedProjectVersion: preview.ExpectedProjectVersion, ExpectedPlanRevision: preview.ExpectedPlanRevision, }) decision := svc.CheckDocTaskAccess(ctx, 400, 1, "research", DocAccessActionRun, true) if decision.Allowed || decision.Code != AccessCodeDocTaskDisabled { t.Fatalf("expected DOC_TASK_DISABLED, got %+v", decision) } } func TestCheckDocTaskAccess_NonDutyUserRejected(t *testing.T) { ctx := context.Background() store := NewMemoryStore() _ = SeedProjectMeta(store, 401, LifecyclePlanning, "", 1, 0) svc := NewService(store, TestResolver(), nil, nil) _, _ = svc.SaveWorkflowPlan(ctx, 401, 1, true, SavePlanInput{ Plan: ValidTestPlan(), ExpectedPlanRevision: 0, ExpectedSelectionVersion: 1, }) preview, _ := svc.ActivationPreview(ctx, 401, 1, true) _, _ = svc.Activate(ctx, 401, 1, true, ActivateInput{ ConfirmationToken: preview.ConfirmationToken, ExpectedProjectVersion: preview.ExpectedProjectVersion, ExpectedPlanRevision: preview.ExpectedPlanRevision, }) decision := svc.CheckDocTaskAccess(ctx, 401, 99, "intake", DocAccessActionRun, false) if decision.Allowed || decision.Code != AccessCodeForbiddenDuty { t.Fatalf("expected DOC_DUTY_FORBIDDEN, got %+v", decision) } }