This commit is contained in:
2026-06-22 08:55:57 +08:00
parent dbb87823e8
commit 6ade6e8fa9
325 changed files with 41131 additions and 855 deletions
+48
View File
@@ -0,0 +1,48 @@
package app
import (
"testing"
"github.com/google/uuid"
"github.com/yan1h/agent-coding-workflow/internal/project"
)
// projectACL(app 层中央 ACL)必须与 project_service 的 assertReadable/assertWritable
// 语义一致——两侧任一漂移都会让 workspace/ACP/chat 作用域与 project 鉴权分叉
// (autonomy roadmap §11)。本白盒测试直接覆盖 projectACL 的角色叠加矩阵。
func TestProjectACL_RoleMatrix(t *testing.T) {
owner := uuid.New()
stranger := uuid.New()
private := &project.Project{ID: uuid.New(), OwnerID: owner, Visibility: project.VisibilityPrivate}
internal := &project.Project{ID: uuid.New(), OwnerID: owner, Visibility: project.VisibilityInternal}
cases := []struct {
name string
pj *project.Project
caller uuid.UUID
isAdmin bool
role project.Role
wantRead, wantWrt bool
}{
{"owner_private", private, owner, false, project.RoleAdmin, true, true},
{"global_admin_private", private, stranger, true, project.RoleNone, true, true},
{"member_private_write", private, stranger, false, project.RoleMember, true, true},
{"admin_role_private_write", private, stranger, false, project.RoleAdmin, true, true},
{"viewer_private_read_only", private, stranger, false, project.RoleViewer, true, false},
{"nonmember_private_denied", private, stranger, false, project.RoleNone, false, false},
{"nonmember_internal_read", internal, stranger, false, project.RoleNone, true, false},
{"viewer_internal_read", internal, stranger, false, project.RoleViewer, true, false},
{"member_internal_write", internal, stranger, false, project.RoleMember, true, true},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
gotRead, gotWrite := projectACL(tc.pj, tc.caller, tc.isAdmin, tc.role)
if gotRead != tc.wantRead || gotWrite != tc.wantWrt {
t.Fatalf("projectACL(%s)=read:%v,write:%v want read:%v,write:%v",
tc.name, gotRead, gotWrite, tc.wantRead, tc.wantWrt)
}
})
}
}