You've already forked agentic-coding-workflow
feat(project): add workspace_id to issue/requirement with tri-state update
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/yan1h/agent-coding-workflow/internal/audit"
|
||||
"github.com/yan1h/agent-coding-workflow/internal/infra/errs"
|
||||
)
|
||||
|
||||
@@ -99,3 +100,78 @@ func TestRequirementService_Reopen_AllowsPhaseAgain(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, PhaseDone, out.Phase)
|
||||
}
|
||||
|
||||
func TestRequirementService_Create_WithWorkspaceID(t *testing.T) {
|
||||
repo := newFakeRepo()
|
||||
owner := uuid.New()
|
||||
seedProject(t, repo, owner)
|
||||
svc, _, spy := newReqSvc(repo)
|
||||
caller := Caller{UserID: owner}
|
||||
|
||||
wsID := uuid.New()
|
||||
out, err := svc.Create(context.Background(), caller, "demo", CreateRequirementInput{
|
||||
Title: "R", WorkspaceID: &wsID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, out.WorkspaceID)
|
||||
require.Equal(t, wsID, *out.WorkspaceID)
|
||||
|
||||
// 再 Get 一次确认持久化
|
||||
got, err := svc.Get(context.Background(), caller, "demo", out.Number)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, got.WorkspaceID)
|
||||
require.Equal(t, wsID, *got.WorkspaceID)
|
||||
|
||||
// audit metadata 包含 workspace_id
|
||||
require.NotEmpty(t, spy.entries)
|
||||
var createEntry *audit.Entry
|
||||
for i := range spy.entries {
|
||||
if spy.entries[i].Action == "requirement.create" {
|
||||
createEntry = &spy.entries[i]
|
||||
}
|
||||
}
|
||||
require.NotNil(t, createEntry)
|
||||
require.Equal(t, wsID.String(), createEntry.Metadata["workspace_id"])
|
||||
}
|
||||
|
||||
func TestRequirementService_Update_WorkspaceID_TriState(t *testing.T) {
|
||||
repo := newFakeRepo()
|
||||
owner := uuid.New()
|
||||
seedProject(t, repo, owner)
|
||||
svc, _, _ := newReqSvc(repo)
|
||||
caller := Caller{UserID: owner}
|
||||
|
||||
wsA := uuid.New()
|
||||
r, err := svc.Create(context.Background(), caller, "demo", CreateRequirementInput{
|
||||
Title: "R", WorkspaceID: &wsA,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, r.WorkspaceID)
|
||||
require.Equal(t, wsA, *r.WorkspaceID)
|
||||
|
||||
// 1) nil → 不变(结合一个其它 patch 字段触发 update)
|
||||
newTitle := "R2"
|
||||
out, err := svc.Update(context.Background(), caller, "demo", r.Number, UpdateRequirementInput{
|
||||
Title: &newTitle,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, out.WorkspaceID)
|
||||
require.Equal(t, wsA, *out.WorkspaceID)
|
||||
|
||||
// 2) &id(非 Nil)→ 关联到新 workspace
|
||||
wsB := uuid.New()
|
||||
out, err = svc.Update(context.Background(), caller, "demo", r.Number, UpdateRequirementInput{
|
||||
WorkspaceID: &wsB,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, out.WorkspaceID)
|
||||
require.Equal(t, wsB, *out.WorkspaceID)
|
||||
|
||||
// 3) &uuid.Nil → 显式解绑
|
||||
nilUUID := uuid.Nil
|
||||
out, err = svc.Update(context.Background(), caller, "demo", r.Number, UpdateRequirementInput{
|
||||
WorkspaceID: &nilUUID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, out.WorkspaceID)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user