| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729 |
- package auth
- import (
- "context"
- "fmt"
- "math/rand"
- "testing"
- "time"
- deptModel "perms-system-server/internal/model/dept"
- "perms-system-server/internal/model/perm"
- "perms-system-server/internal/model/productmember"
- "perms-system-server/internal/model/role"
- "perms-system-server/internal/model/roleperm"
- "perms-system-server/internal/model/userperm"
- "perms-system-server/internal/model/userrole"
- "perms-system-server/internal/svc"
- "perms-system-server/internal/testutil"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "github.com/zeromicro/go-zero/core/stores/sqlx"
- )
- func newTestSvcCtx() *svc.ServiceContext {
- c := testutil.GetTestConfig()
- return svc.NewServiceContext(c)
- }
- // TC-0231: isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回["a","b"]
- func TestGetUserPerms_SuperAdmin(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_%d", rand.Intn(100000))
- p1, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "sa_perm1", Code: "sa_code1", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p1Id, _ := p1.LastInsertId()
- p2, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "sa_perm2", Code: "sa_code2", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p2Id, _ := p2.LastInsertId()
- p3, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "sa_disabled", Code: "sa_code3", Status: 2, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p3Id, _ := p3.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id, p2Id, p3Id)
- })
- perms, memberType, err := GetUserPerms(ctx, svcCtx, 1, 0, pc, true)
- require.NoError(t, err)
- assert.Equal(t, "SUPER_ADMIN", memberType)
- assert.ElementsMatch(t, []string{"sa_code1", "sa_code2"}, perms)
- }
- // TC-0232: isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回err
- func TestGetUserPerms_SuperAdmin_EmptyProduct(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- perms, memberType, err := GetUserPerms(ctx, svcCtx, 1, 0, "nonexist_product_xyz", true)
- require.NoError(t, err)
- assert.Equal(t, "SUPER_ADMIN", memberType)
- assert.Empty(t, perms)
- }
- // TC-0233: deptId=0, FindOneByProductCodeUserId返回ErrNotFound
- func TestGetUserPerms_NotProductMember(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- perms, memberType, err := GetUserPerms(ctx, svcCtx, 999999, 0, "some_product", false)
- require.NoError(t, err)
- assert.Empty(t, memberType)
- assert.Nil(t, perms)
- }
- // TC-0235: deptId=0, member.MemberType="DEVELOPER"
- func TestGetUserPerms_Developer(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_dev_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "DEVELOPER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "dev_p1", Code: "dev_c1", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p1Id, _ := p1Res.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id)
- })
- perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "DEVELOPER", memberType)
- assert.Contains(t, perms, "dev_c1")
- }
- // TC-0236: deptId=0, member.MemberType="ADMIN"
- func TestGetUserPerms_Admin(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_adm_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "ADMIN", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "adm_p1", Code: "adm_c1", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p1Id, _ := p1Res.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id)
- })
- perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "ADMIN", memberType)
- assert.Contains(t, perms, "adm_c1")
- }
- // TC-0243: deptId=0, MemberType="MEMBER", roleIds=[], allowPermIds=[], denyPermIds=[]
- func TestGetUserPerms_Member_NoRolesNoUserPerms(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_mbr0_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- assert.Empty(t, perms)
- }
- // TC-0244: deptId=0, roleIds=[1], role.ProductCode=productCode+Status=1, rolePermIds=[10,20]
- func TestGetUserPerms_Member_WithRoles(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_mbrr_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
- ProductCode: pc, Name: fmt.Sprintf("role_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- roleId, _ := roleRes.LastInsertId()
- perm1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "role_perm1", Code: fmt.Sprintf("rc1_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- perm1Id, _ := perm1Res.LastInsertId()
- perm2Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "role_perm2", Code: fmt.Sprintf("rc2_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- perm2Id, _ := perm2Res.LastInsertId()
- urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
- UserId: userId, RoleId: roleId, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- urId, _ := urRes.LastInsertId()
- rpRes1, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
- RoleId: roleId, PermId: perm1Id, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- rpId1, _ := rpRes1.LastInsertId()
- rpRes2, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
- RoleId: roleId, PermId: perm2Id, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- rpId2, _ := rpRes2.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId1, rpId2)
- testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", perm1Id, perm2Id)
- testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- assert.Len(t, perms, 2)
- p1, _ := svcCtx.SysPermModel.FindOne(ctx, perm1Id)
- p2, _ := svcCtx.SysPermModel.FindOne(ctx, perm2Id)
- assert.ElementsMatch(t, []string{p1.Code, p2.Code}, perms)
- }
- // TC-0248: deptId=0, rolePermIds=[10], denyPermIds=[10]
- func TestGetUserPerms_Member_DENYOverridesRolePerm(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_deny_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
- ProductCode: pc, Name: fmt.Sprintf("role_deny_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- roleId, _ := roleRes.LastInsertId()
- permARes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "pA", Code: fmt.Sprintf("pA_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permAId, _ := permARes.LastInsertId()
- permBRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "pB", Code: fmt.Sprintf("pB_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permBId, _ := permBRes.LastInsertId()
- urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
- UserId: userId, RoleId: roleId, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- urId, _ := urRes.LastInsertId()
- rpA, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
- RoleId: roleId, PermId: permAId, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- rpAId, _ := rpA.LastInsertId()
- rpB, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
- RoleId: roleId, PermId: permBId, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- rpBId, _ := rpB.LastInsertId()
- denyRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
- UserId: userId, PermId: permAId, Effect: "DENY", CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- denyId, _ := denyRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_user_perm`", denyId)
- testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpAId, rpBId)
- testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", permAId, permBId)
- testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- permB, _ := svcCtx.SysPermModel.FindOne(ctx, permBId)
- assert.Equal(t, []string{permB.Code}, permsResult)
- }
- // TC-0247: deptId=0, rolePermIds=[], allowPermIds=[30]
- func TestGetUserPerms_Member_ALLOWAddsExtra(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_allow_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "extra_p", Code: fmt.Sprintf("ex_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permId, _ := permRes.LastInsertId()
- allowRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
- UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- allowId, _ := allowRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- assert.Len(t, permsResult, 1)
- permObj, _ := svcCtx.SysPermModel.FindOne(ctx, permId)
- assert.Contains(t, permsResult, permObj.Code)
- }
- // TC-0245: deptId=0, roleIds=[1,2], role1.ProductCode=target, role2.ProductCode=other
- func TestGetUserPerms_Member_CrossProductRoleFilter(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pcTarget := fmt.Sprintf("tp_cross_t_%d", rand.Intn(100000))
- pcOther := fmt.Sprintf("tp_cross_o_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pcTarget, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- targetRoleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
- ProductCode: pcTarget, Name: fmt.Sprintf("tr_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- targetRoleId, _ := targetRoleRes.LastInsertId()
- otherRoleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
- ProductCode: pcOther, Name: fmt.Sprintf("or_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- otherRoleId, _ := otherRoleRes.LastInsertId()
- targetPermRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pcTarget, Name: "tp", Code: fmt.Sprintf("tp_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- targetPermId, _ := targetPermRes.LastInsertId()
- otherPermRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pcOther, Name: "op", Code: fmt.Sprintf("op_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- otherPermId, _ := otherPermRes.LastInsertId()
- ur1, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{UserId: userId, RoleId: targetRoleId, CreateTime: now, UpdateTime: now})
- require.NoError(t, err)
- ur1Id, _ := ur1.LastInsertId()
- ur2, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{UserId: userId, RoleId: otherRoleId, CreateTime: now, UpdateTime: now})
- require.NoError(t, err)
- ur2Id, _ := ur2.LastInsertId()
- rp1, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{RoleId: targetRoleId, PermId: targetPermId, CreateTime: now, UpdateTime: now})
- require.NoError(t, err)
- rp1Id, _ := rp1.LastInsertId()
- rp2, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{RoleId: otherRoleId, PermId: otherPermId, CreateTime: now, UpdateTime: now})
- require.NoError(t, err)
- rp2Id, _ := rp2.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_role_perm`", rp1Id, rp2Id)
- testutil.CleanTable(ctx, conn, "`sys_user_role`", ur1Id, ur2Id)
- testutil.CleanTable(ctx, conn, "`sys_perm`", targetPermId, otherPermId)
- testutil.CleanTable(ctx, conn, "`sys_role`", targetRoleId, otherRoleId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pcTarget, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- targetPerm, _ := svcCtx.SysPermModel.FindOne(ctx, targetPermId)
- assert.Equal(t, []string{targetPerm.Code}, permsResult)
- }
- // TC-0246: deptId=0, role.Status=2
- func TestGetUserPerms_Member_DisabledRoleFiltered(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_disrole_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- disabledRoleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
- ProductCode: pc, Name: fmt.Sprintf("dis_%d", rand.Intn(100000)), Status: 2, PermsLevel: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- disabledRoleId, _ := disabledRoleRes.LastInsertId()
- permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "dp", Code: fmt.Sprintf("dp_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permId, _ := permRes.LastInsertId()
- urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{UserId: userId, RoleId: disabledRoleId, CreateTime: now, UpdateTime: now})
- require.NoError(t, err)
- urId, _ := urRes.LastInsertId()
- rpRes, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{RoleId: disabledRoleId, PermId: permId, CreateTime: now, UpdateTime: now})
- require.NoError(t, err)
- rpId, _ := rpRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId)
- testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
- testutil.CleanTable(ctx, conn, "`sys_role`", disabledRoleId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- assert.Empty(t, permsResult)
- }
- // TC-0251: deptId=0, finalIds含已禁用权限
- func TestGetUserPerms_Member_DisabledPermFiltered(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_disperm_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- disabledPermRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "dp2", Code: fmt.Sprintf("dp2_%d", rand.Intn(100000)), Status: 2, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- disabledPermId, _ := disabledPermRes.LastInsertId()
- allowRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
- UserId: userId, PermId: disabledPermId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- allowId, _ := allowRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", disabledPermId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- assert.Empty(t, permsResult)
- }
- // TC-0249: deptId=0, allowPermIds=[10], denyPermIds=[10]
- func TestGetUserPerms_Member_DENYOnlyExcludesTargetPerm(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_denyonly_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- permARes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "pA", Code: fmt.Sprintf("doA_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permAId, _ := permARes.LastInsertId()
- permBRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "pB", Code: fmt.Sprintf("doB_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permBId, _ := permBRes.LastInsertId()
- allowARes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
- UserId: userId, PermId: permAId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- allowAId, _ := allowARes.LastInsertId()
- denyBRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
- UserId: userId, PermId: permBId, Effect: "DENY", CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- denyBId, _ := denyBRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowAId, denyBId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", permAId, permBId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- permA, _ := svcCtx.SysPermModel.FindOne(ctx, permAId)
- permB, _ := svcCtx.SysPermModel.FindOne(ctx, permBId)
- assert.Contains(t, permsResult, permA.Code, "ALLOW perm should be present")
- assert.NotContains(t, permsResult, permB.Code, "DENY perm should be excluded even if it exists")
- }
- // TC-0250: deptId=0, rolePermIds=[10], allowPermIds=[10]
- func TestGetUserPerms_Member_ALLOWAndRoleDedup(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_dedup_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
- ProductCode: pc, Name: fmt.Sprintf("dedup_r_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- roleId, _ := roleRes.LastInsertId()
- permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "dedup_p", Code: fmt.Sprintf("dd_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permId, _ := permRes.LastInsertId()
- urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
- UserId: userId, RoleId: roleId, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- urId, _ := urRes.LastInsertId()
- rpRes, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
- RoleId: roleId, PermId: permId, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- rpId, _ := rpRes.LastInsertId()
- allowRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
- UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- allowId, _ := allowRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowId)
- testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId)
- testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
- testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
- testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- permObj, _ := svcCtx.SysPermModel.FindOne(ctx, permId)
- assert.Len(t, permsResult, 1, "role perm and ALLOW same perm should be deduped")
- assert.Equal(t, permObj.Code, permsResult[0])
- }
- // TC-0238: deptId>0, MemberType="MEMBER", SysDeptModel.FindOne返回DeptType="DEV", FindAllCodesByProductCode返回["a","b","c"]
- func TestGetUserPerms_Member_DevDept_AllPerms(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_devdept_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- deptRes, err := svcCtx.SysDeptModel.Insert(ctx, &deptModel.SysDept{
- ParentId: 0, Name: "dev_dept_" + fmt.Sprintf("%d", rand.Intn(100000)),
- Path: "/", Sort: 1, DeptType: "DEV", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- deptId, _ := deptRes.LastInsertId()
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "dp1", Code: fmt.Sprintf("dc1_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p1Id, _ := p1Res.LastInsertId()
- p2Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "dp2", Code: fmt.Sprintf("dc2_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p2Id, _ := p2Res.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id, p2Id)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- testutil.CleanTable(ctx, conn, "`sys_dept`", deptId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, deptId, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- p1, _ := svcCtx.SysPermModel.FindOne(ctx, p1Id)
- p2, _ := svcCtx.SysPermModel.FindOne(ctx, p2Id)
- assert.ElementsMatch(t, []string{p1.Code, p2.Code}, permsResult)
- }
- // TC-0240: deptId>0, DeptType="NORMAL"
- func TestGetUserPerms_Member_NormalDept_NoAutoPerms(t *testing.T) {
- ctx := context.Background()
- svcCtx := newTestSvcCtx()
- conn := testutil.GetTestSqlConn()
- now := time.Now().Unix()
- pc := fmt.Sprintf("tp_normdept_%d", rand.Intn(100000))
- userId := int64(900000 + rand.Intn(10000))
- deptRes, err := svcCtx.SysDeptModel.Insert(ctx, &deptModel.SysDept{
- ParentId: 0, Name: "normal_dept_" + fmt.Sprintf("%d", rand.Intn(100000)),
- Path: "/", Sort: 1, DeptType: "NORMAL", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- deptId, _ := deptRes.LastInsertId()
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "np1", Code: fmt.Sprintf("nc1_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- p1Id, _ := p1Res.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- testutil.CleanTable(ctx, conn, "`sys_dept`", deptId)
- })
- permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, deptId, pc, false)
- require.NoError(t, err)
- assert.Equal(t, "MEMBER", memberType)
- assert.Empty(t, permsResult)
- }
- // suppress unused import
- var _ = sqlx.ErrNotFound
|