package ctxmgr import ( "context" "testing" "chat-agent-system/internal/replyexport" ) func TestCollectProjectDialogue_ExcludesPrivateAndIncludesShared(t *testing.T) { ctx := context.Background() mgr := NewContextManager(nil, nil, DefaultTimeDecayConfig()) projectID := int64(501) meta := map[string]any{"project_id": projectID} _, _ = mgr.RecordUserMessageWithID(ctx, "sess-501", 1, "user", "[private] 不应纳入", "", "", meta) _, _ = mgr.RecordUserMessageWithID(ctx, "sess-501", 1, "user", "项目需要支持多用户协作", "", "", meta) _, _ = mgr.RecordUserMessageWithID(ctx, "sess-501", 1, "assistant", "好的,我会整理需求要点。", "", "", map[string]any{ "project_id": projectID, "export_policy": string(replyexport.PolicyFull), "content_kind": string(replyexport.KindDocumentText), }) res, err := mgr.CollectProjectDialogue(ctx, projectID, CollectProjectDialogueOptions{}) if err != nil { t.Fatalf("CollectProjectDialogue: %v", err) } if len(res.Lines) != 2 { t.Fatalf("expected 2 shared lines, got %d: %v", len(res.Lines), res.Lines) } if res.ExcludedPrivate < 1 { t.Fatalf("expected excluded private >= 1, got %d", res.ExcludedPrivate) } } func TestCollectProjectDialogue_StageFilter(t *testing.T) { ctx := context.Background() mgr := NewContextManager(nil, nil, DefaultTimeDecayConfig()) projectID := int64(502) _, _ = mgr.RecordUserMessageWithID(ctx, "sess-502", 1, "user", "立项阶段讨论", "", "", map[string]any{ "project_id": projectID, "stage_key": "biz_intake", }) _, _ = mgr.RecordUserMessageWithID(ctx, "sess-502", 1, "user", "研发阶段讨论", "", "", map[string]any{ "project_id": projectID, "stage_key": "biz_feasibility", }) res, err := mgr.CollectProjectDialogue(ctx, projectID, CollectProjectDialogueOptions{ AllowedStageKey: "biz_intake", }) if err != nil { t.Fatalf("CollectProjectDialogue: %v", err) } if len(res.Lines) != 1 { t.Fatalf("expected 1 stage-filtered line, got %d: %v", len(res.Lines), res.Lines) } if res.ExcludedNoAccess != 1 { t.Fatalf("expected 1 excluded by stage, got %d", res.ExcludedNoAccess) } }