package projectinstance import ( "context" "chat-agent-system/internal/workflowdef" ) // NewMemoryStore 返回内存 Store,供跨包集成测试使用。 func NewMemoryStore() Store { return newMemStore() } // TestResolver 返回最小正式商务工作流解析器。 func TestResolver() VersionResolver { return testResolver() } // ValidTestPlan 返回单阶段 intake 测试规划。 func ValidTestPlan() WorkflowPlan { return validPlan() } // StubDocChecker 内存文档批准状态探针。 type StubDocChecker struct { States map[string]string } func (s *StubDocChecker) TaskApprovalStates(_ context.Context, _ int64) (map[string]string, error) { if s == nil { return map[string]string{}, nil } return s.States, nil } type stubVersionResolver struct { versions map[string]*workflowdef.Version defs map[string]*workflowdef.Definition } func (s *stubVersionResolver) GetDefinitionByKey(_ context.Context, key string) (*workflowdef.Definition, error) { d, ok := s.defs[key] if !ok { return nil, workflowdef.ErrNotFound } return d, nil } func (s *stubVersionResolver) GetVersion(_ context.Context, workflowID int64, version int) (*workflowdef.Version, error) { for _, v := range s.versions { if v.WorkflowID == workflowID && v.Version == version { copyV := *v return ©V, nil } } return nil, workflowdef.ErrNotFound } func (s *stubVersionResolver) ListDefinitions(_ context.Context) ([]workflowdef.Definition, error) { out := make([]workflowdef.Definition, 0, len(s.defs)) for _, d := range s.defs { out = append(out, *d) } return out, nil } func disabledDocResolver() *stubVersionResolver { r := testResolver() r.versions[workflowdef.OfficialKeyMain].Definition.Stages[0].DocTasks = append( r.versions[workflowdef.OfficialKeyMain].Definition.Stages[0].DocTasks, workflowdef.DocTaskDef{ Key: "research", Title: "市场调研", CreatorConfigurable: true, BlockingWhenEnabled: false, DefaultEnabled: false, OutputDocType: "research", OutputDocTitle: "市场调研", }, ) return r } func testResolver() *stubVersionResolver { key := workflowdef.OfficialKeyMain ver := &workflowdef.Version{ ID: 100, WorkflowID: 10, Version: 1, Status: workflowdef.StatusPublished, WorkflowKey: key, WorkflowName: workflowdef.OfficialWorkflowName(key), Definition: workflowdef.VersionDefinition{ SchemaVersion: 2, WorkflowKey: key, Stages: []workflowdef.StageDef{{ Key: "V0.1_triage", Name: "V0.1 需求摸底", Optional: false, Position: 10, DocTasks: []workflowdef.DocTaskDef{{ Key: "intake", Title: "用户初始需求收集表", CreatorConfigurable: true, BlockingWhenEnabled: true, DefaultEnabled: true, OutputDocType: "intake", OutputDocTitle: "用户初始需求收集表", }}, }}, }, } return &stubVersionResolver{ defs: map[string]*workflowdef.Definition{ key: {ID: 10, Key: key, Name: workflowdef.OfficialWorkflowName(key), LatestPublishedVersion: 1}, }, versions: map[string]*workflowdef.Version{key: ver}, } } // OptionalDutyResolver 导出含可裁剪 research 文档的测试定义。 func OptionalDutyResolver() VersionResolver { return optionalDutyResolver() } // OptionalDutyPlan 导出一份 full + none 测试规划。 func OptionalDutyPlan(intake, research DocDuty) WorkflowPlan { return optionalDutyPlan(intake, research) } func optionalDutyResolver() *stubVersionResolver { r := testResolver() r.versions[workflowdef.OfficialKeyMain].Definition.Stages[0].DocTasks = []workflowdef.DocTaskDef{ { Key: "intake", Title: "用户初始需求收集表", CreatorConfigurable: true, BlockingWhenEnabled: true, DefaultEnabled: true, OutputDocType: "intake", OutputDocTitle: "用户初始需求收集表", }, { Key: "research", Title: "市场调研", CreatorConfigurable: true, BlockingWhenEnabled: false, DefaultEnabled: true, OutputDocType: "research", OutputDocTitle: "市场调研", }, } return r } func requiredDutyResolver() *stubVersionResolver { r := testResolver() r.versions[workflowdef.OfficialKeyMain].Definition.Stages[0].DocTasks[0].Required = true r.versions[workflowdef.OfficialKeyMain].Definition.Stages[0].DocTasks[0].CreatorConfigurable = false return r } func optionalDutyPlan(intake, research DocDuty) WorkflowPlan { return WorkflowPlan{ WorkflowDefinitionKey: workflowdef.OfficialKeyMain, WorkflowVersion: 1, Stages: []StagePlan{{ StageKey: "V0.1_triage", Enabled: true, DocTasks: []DocTaskPlan{ {TaskKey: "intake", Enabled: true, Duties: intake}, {TaskKey: "research", Enabled: true, Duties: research}, }, }}, } } func validPlan() WorkflowPlan { return WorkflowPlan{ WorkflowDefinitionKey: workflowdef.OfficialKeyMain, WorkflowVersion: 1, Stages: []StagePlan{{ StageKey: "V0.1_triage", Enabled: true, DocTasks: []DocTaskPlan{{ TaskKey: "intake", Enabled: true, Duties: DocDuty{AuthorUserID: 1, ReviewerUserID: 2, ApproverUserID: 3}, }}, }}, } }