perms_test.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. package auth
  2. import (
  3. "context"
  4. "fmt"
  5. "math/rand"
  6. "testing"
  7. "time"
  8. deptModel "perms-system-server/internal/model/dept"
  9. "perms-system-server/internal/model/perm"
  10. "perms-system-server/internal/model/productmember"
  11. "perms-system-server/internal/model/role"
  12. "perms-system-server/internal/model/roleperm"
  13. "perms-system-server/internal/model/userperm"
  14. "perms-system-server/internal/model/userrole"
  15. "perms-system-server/internal/svc"
  16. "perms-system-server/internal/testutil"
  17. "github.com/stretchr/testify/assert"
  18. "github.com/stretchr/testify/require"
  19. "github.com/zeromicro/go-zero/core/stores/sqlx"
  20. )
  21. func newTestSvcCtx() *svc.ServiceContext {
  22. c := testutil.GetTestConfig()
  23. return svc.NewServiceContext(c)
  24. }
  25. // TC-0231: isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回["a","b"]
  26. func TestGetUserPerms_SuperAdmin(t *testing.T) {
  27. ctx := context.Background()
  28. svcCtx := newTestSvcCtx()
  29. conn := testutil.GetTestSqlConn()
  30. now := time.Now().Unix()
  31. pc := fmt.Sprintf("tp_%d", rand.Intn(100000))
  32. p1, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  33. ProductCode: pc, Name: "sa_perm1", Code: "sa_code1", Status: 1, CreateTime: now, UpdateTime: now,
  34. })
  35. require.NoError(t, err)
  36. p1Id, _ := p1.LastInsertId()
  37. p2, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  38. ProductCode: pc, Name: "sa_perm2", Code: "sa_code2", Status: 1, CreateTime: now, UpdateTime: now,
  39. })
  40. require.NoError(t, err)
  41. p2Id, _ := p2.LastInsertId()
  42. p3, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  43. ProductCode: pc, Name: "sa_disabled", Code: "sa_code3", Status: 2, CreateTime: now, UpdateTime: now,
  44. })
  45. require.NoError(t, err)
  46. p3Id, _ := p3.LastInsertId()
  47. t.Cleanup(func() {
  48. testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id, p2Id, p3Id)
  49. })
  50. perms, memberType, err := GetUserPerms(ctx, svcCtx, 1, 0, pc, true)
  51. require.NoError(t, err)
  52. assert.Equal(t, "SUPER_ADMIN", memberType)
  53. assert.ElementsMatch(t, []string{"sa_code1", "sa_code2"}, perms)
  54. }
  55. // TC-0232: isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回err
  56. func TestGetUserPerms_SuperAdmin_EmptyProduct(t *testing.T) {
  57. ctx := context.Background()
  58. svcCtx := newTestSvcCtx()
  59. perms, memberType, err := GetUserPerms(ctx, svcCtx, 1, 0, "nonexist_product_xyz", true)
  60. require.NoError(t, err)
  61. assert.Equal(t, "SUPER_ADMIN", memberType)
  62. assert.Empty(t, perms)
  63. }
  64. // TC-0233: deptId=0, FindOneByProductCodeUserId返回ErrNotFound
  65. func TestGetUserPerms_NotProductMember(t *testing.T) {
  66. ctx := context.Background()
  67. svcCtx := newTestSvcCtx()
  68. perms, memberType, err := GetUserPerms(ctx, svcCtx, 999999, 0, "some_product", false)
  69. require.NoError(t, err)
  70. assert.Empty(t, memberType)
  71. assert.Nil(t, perms)
  72. }
  73. // TC-0235: deptId=0, member.MemberType="DEVELOPER"
  74. func TestGetUserPerms_Developer(t *testing.T) {
  75. ctx := context.Background()
  76. svcCtx := newTestSvcCtx()
  77. conn := testutil.GetTestSqlConn()
  78. now := time.Now().Unix()
  79. pc := fmt.Sprintf("tp_dev_%d", rand.Intn(100000))
  80. userId := int64(900000 + rand.Intn(10000))
  81. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  82. ProductCode: pc, UserId: userId, MemberType: "DEVELOPER", Status: 1, CreateTime: now, UpdateTime: now,
  83. })
  84. require.NoError(t, err)
  85. pmId, _ := pmRes.LastInsertId()
  86. p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  87. ProductCode: pc, Name: "dev_p1", Code: "dev_c1", Status: 1, CreateTime: now, UpdateTime: now,
  88. })
  89. require.NoError(t, err)
  90. p1Id, _ := p1Res.LastInsertId()
  91. t.Cleanup(func() {
  92. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  93. testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id)
  94. })
  95. perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  96. require.NoError(t, err)
  97. assert.Equal(t, "DEVELOPER", memberType)
  98. assert.Contains(t, perms, "dev_c1")
  99. }
  100. // TC-0236: deptId=0, member.MemberType="ADMIN"
  101. func TestGetUserPerms_Admin(t *testing.T) {
  102. ctx := context.Background()
  103. svcCtx := newTestSvcCtx()
  104. conn := testutil.GetTestSqlConn()
  105. now := time.Now().Unix()
  106. pc := fmt.Sprintf("tp_adm_%d", rand.Intn(100000))
  107. userId := int64(900000 + rand.Intn(10000))
  108. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  109. ProductCode: pc, UserId: userId, MemberType: "ADMIN", Status: 1, CreateTime: now, UpdateTime: now,
  110. })
  111. require.NoError(t, err)
  112. pmId, _ := pmRes.LastInsertId()
  113. p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  114. ProductCode: pc, Name: "adm_p1", Code: "adm_c1", Status: 1, CreateTime: now, UpdateTime: now,
  115. })
  116. require.NoError(t, err)
  117. p1Id, _ := p1Res.LastInsertId()
  118. t.Cleanup(func() {
  119. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  120. testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id)
  121. })
  122. perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  123. require.NoError(t, err)
  124. assert.Equal(t, "ADMIN", memberType)
  125. assert.Contains(t, perms, "adm_c1")
  126. }
  127. // TC-0243: deptId=0, MemberType="MEMBER", roleIds=[], allowPermIds=[], denyPermIds=[]
  128. func TestGetUserPerms_Member_NoRolesNoUserPerms(t *testing.T) {
  129. ctx := context.Background()
  130. svcCtx := newTestSvcCtx()
  131. conn := testutil.GetTestSqlConn()
  132. now := time.Now().Unix()
  133. pc := fmt.Sprintf("tp_mbr0_%d", rand.Intn(100000))
  134. userId := int64(900000 + rand.Intn(10000))
  135. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  136. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  137. })
  138. require.NoError(t, err)
  139. pmId, _ := pmRes.LastInsertId()
  140. t.Cleanup(func() {
  141. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  142. })
  143. perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  144. require.NoError(t, err)
  145. assert.Equal(t, "MEMBER", memberType)
  146. assert.Empty(t, perms)
  147. }
  148. // TC-0244: deptId=0, roleIds=[1], role.ProductCode=productCode+Status=1, rolePermIds=[10,20]
  149. func TestGetUserPerms_Member_WithRoles(t *testing.T) {
  150. ctx := context.Background()
  151. svcCtx := newTestSvcCtx()
  152. conn := testutil.GetTestSqlConn()
  153. now := time.Now().Unix()
  154. pc := fmt.Sprintf("tp_mbrr_%d", rand.Intn(100000))
  155. userId := int64(900000 + rand.Intn(10000))
  156. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  157. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  158. })
  159. require.NoError(t, err)
  160. pmId, _ := pmRes.LastInsertId()
  161. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
  162. ProductCode: pc, Name: fmt.Sprintf("role_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  163. })
  164. require.NoError(t, err)
  165. roleId, _ := roleRes.LastInsertId()
  166. perm1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  167. ProductCode: pc, Name: "role_perm1", Code: fmt.Sprintf("rc1_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  168. })
  169. require.NoError(t, err)
  170. perm1Id, _ := perm1Res.LastInsertId()
  171. perm2Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  172. ProductCode: pc, Name: "role_perm2", Code: fmt.Sprintf("rc2_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  173. })
  174. require.NoError(t, err)
  175. perm2Id, _ := perm2Res.LastInsertId()
  176. urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  177. UserId: userId, RoleId: roleId, CreateTime: now, UpdateTime: now,
  178. })
  179. require.NoError(t, err)
  180. urId, _ := urRes.LastInsertId()
  181. rpRes1, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  182. RoleId: roleId, PermId: perm1Id, CreateTime: now, UpdateTime: now,
  183. })
  184. require.NoError(t, err)
  185. rpId1, _ := rpRes1.LastInsertId()
  186. rpRes2, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  187. RoleId: roleId, PermId: perm2Id, CreateTime: now, UpdateTime: now,
  188. })
  189. require.NoError(t, err)
  190. rpId2, _ := rpRes2.LastInsertId()
  191. t.Cleanup(func() {
  192. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId1, rpId2)
  193. testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
  194. testutil.CleanTable(ctx, conn, "`sys_perm`", perm1Id, perm2Id)
  195. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  196. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  197. })
  198. perms, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  199. require.NoError(t, err)
  200. assert.Equal(t, "MEMBER", memberType)
  201. assert.Len(t, perms, 2)
  202. p1, _ := svcCtx.SysPermModel.FindOne(ctx, perm1Id)
  203. p2, _ := svcCtx.SysPermModel.FindOne(ctx, perm2Id)
  204. assert.ElementsMatch(t, []string{p1.Code, p2.Code}, perms)
  205. }
  206. // TC-0248: deptId=0, rolePermIds=[10], denyPermIds=[10]
  207. func TestGetUserPerms_Member_DENYOverridesRolePerm(t *testing.T) {
  208. ctx := context.Background()
  209. svcCtx := newTestSvcCtx()
  210. conn := testutil.GetTestSqlConn()
  211. now := time.Now().Unix()
  212. pc := fmt.Sprintf("tp_deny_%d", rand.Intn(100000))
  213. userId := int64(900000 + rand.Intn(10000))
  214. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  215. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  216. })
  217. require.NoError(t, err)
  218. pmId, _ := pmRes.LastInsertId()
  219. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
  220. ProductCode: pc, Name: fmt.Sprintf("role_deny_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  221. })
  222. require.NoError(t, err)
  223. roleId, _ := roleRes.LastInsertId()
  224. permARes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  225. ProductCode: pc, Name: "pA", Code: fmt.Sprintf("pA_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  226. })
  227. require.NoError(t, err)
  228. permAId, _ := permARes.LastInsertId()
  229. permBRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  230. ProductCode: pc, Name: "pB", Code: fmt.Sprintf("pB_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  231. })
  232. require.NoError(t, err)
  233. permBId, _ := permBRes.LastInsertId()
  234. urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  235. UserId: userId, RoleId: roleId, CreateTime: now, UpdateTime: now,
  236. })
  237. require.NoError(t, err)
  238. urId, _ := urRes.LastInsertId()
  239. rpA, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  240. RoleId: roleId, PermId: permAId, CreateTime: now, UpdateTime: now,
  241. })
  242. require.NoError(t, err)
  243. rpAId, _ := rpA.LastInsertId()
  244. rpB, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  245. RoleId: roleId, PermId: permBId, CreateTime: now, UpdateTime: now,
  246. })
  247. require.NoError(t, err)
  248. rpBId, _ := rpB.LastInsertId()
  249. denyRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  250. UserId: userId, PermId: permAId, Effect: "DENY", CreateTime: now, UpdateTime: now,
  251. })
  252. require.NoError(t, err)
  253. denyId, _ := denyRes.LastInsertId()
  254. t.Cleanup(func() {
  255. testutil.CleanTable(ctx, conn, "`sys_user_perm`", denyId)
  256. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpAId, rpBId)
  257. testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
  258. testutil.CleanTable(ctx, conn, "`sys_perm`", permAId, permBId)
  259. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  260. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  261. })
  262. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  263. require.NoError(t, err)
  264. assert.Equal(t, "MEMBER", memberType)
  265. permB, _ := svcCtx.SysPermModel.FindOne(ctx, permBId)
  266. assert.Equal(t, []string{permB.Code}, permsResult)
  267. }
  268. // TC-0247: deptId=0, rolePermIds=[], allowPermIds=[30]
  269. func TestGetUserPerms_Member_ALLOWAddsExtra(t *testing.T) {
  270. ctx := context.Background()
  271. svcCtx := newTestSvcCtx()
  272. conn := testutil.GetTestSqlConn()
  273. now := time.Now().Unix()
  274. pc := fmt.Sprintf("tp_allow_%d", rand.Intn(100000))
  275. userId := int64(900000 + rand.Intn(10000))
  276. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  277. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  278. })
  279. require.NoError(t, err)
  280. pmId, _ := pmRes.LastInsertId()
  281. permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  282. ProductCode: pc, Name: "extra_p", Code: fmt.Sprintf("ex_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  283. })
  284. require.NoError(t, err)
  285. permId, _ := permRes.LastInsertId()
  286. allowRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  287. UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
  288. })
  289. require.NoError(t, err)
  290. allowId, _ := allowRes.LastInsertId()
  291. t.Cleanup(func() {
  292. testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowId)
  293. testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
  294. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  295. })
  296. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  297. require.NoError(t, err)
  298. assert.Equal(t, "MEMBER", memberType)
  299. assert.Len(t, permsResult, 1)
  300. permObj, _ := svcCtx.SysPermModel.FindOne(ctx, permId)
  301. assert.Contains(t, permsResult, permObj.Code)
  302. }
  303. // TC-0245: deptId=0, roleIds=[1,2], role1.ProductCode=target, role2.ProductCode=other
  304. func TestGetUserPerms_Member_CrossProductRoleFilter(t *testing.T) {
  305. ctx := context.Background()
  306. svcCtx := newTestSvcCtx()
  307. conn := testutil.GetTestSqlConn()
  308. now := time.Now().Unix()
  309. pcTarget := fmt.Sprintf("tp_cross_t_%d", rand.Intn(100000))
  310. pcOther := fmt.Sprintf("tp_cross_o_%d", rand.Intn(100000))
  311. userId := int64(900000 + rand.Intn(10000))
  312. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  313. ProductCode: pcTarget, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  314. })
  315. require.NoError(t, err)
  316. pmId, _ := pmRes.LastInsertId()
  317. targetRoleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
  318. ProductCode: pcTarget, Name: fmt.Sprintf("tr_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  319. })
  320. require.NoError(t, err)
  321. targetRoleId, _ := targetRoleRes.LastInsertId()
  322. otherRoleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
  323. ProductCode: pcOther, Name: fmt.Sprintf("or_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  324. })
  325. require.NoError(t, err)
  326. otherRoleId, _ := otherRoleRes.LastInsertId()
  327. targetPermRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  328. ProductCode: pcTarget, Name: "tp", Code: fmt.Sprintf("tp_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  329. })
  330. require.NoError(t, err)
  331. targetPermId, _ := targetPermRes.LastInsertId()
  332. otherPermRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  333. ProductCode: pcOther, Name: "op", Code: fmt.Sprintf("op_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  334. })
  335. require.NoError(t, err)
  336. otherPermId, _ := otherPermRes.LastInsertId()
  337. ur1, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{UserId: userId, RoleId: targetRoleId, CreateTime: now, UpdateTime: now})
  338. require.NoError(t, err)
  339. ur1Id, _ := ur1.LastInsertId()
  340. ur2, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{UserId: userId, RoleId: otherRoleId, CreateTime: now, UpdateTime: now})
  341. require.NoError(t, err)
  342. ur2Id, _ := ur2.LastInsertId()
  343. rp1, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{RoleId: targetRoleId, PermId: targetPermId, CreateTime: now, UpdateTime: now})
  344. require.NoError(t, err)
  345. rp1Id, _ := rp1.LastInsertId()
  346. rp2, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{RoleId: otherRoleId, PermId: otherPermId, CreateTime: now, UpdateTime: now})
  347. require.NoError(t, err)
  348. rp2Id, _ := rp2.LastInsertId()
  349. t.Cleanup(func() {
  350. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rp1Id, rp2Id)
  351. testutil.CleanTable(ctx, conn, "`sys_user_role`", ur1Id, ur2Id)
  352. testutil.CleanTable(ctx, conn, "`sys_perm`", targetPermId, otherPermId)
  353. testutil.CleanTable(ctx, conn, "`sys_role`", targetRoleId, otherRoleId)
  354. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  355. })
  356. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pcTarget, false)
  357. require.NoError(t, err)
  358. assert.Equal(t, "MEMBER", memberType)
  359. targetPerm, _ := svcCtx.SysPermModel.FindOne(ctx, targetPermId)
  360. assert.Equal(t, []string{targetPerm.Code}, permsResult)
  361. }
  362. // TC-0246: deptId=0, role.Status=2
  363. func TestGetUserPerms_Member_DisabledRoleFiltered(t *testing.T) {
  364. ctx := context.Background()
  365. svcCtx := newTestSvcCtx()
  366. conn := testutil.GetTestSqlConn()
  367. now := time.Now().Unix()
  368. pc := fmt.Sprintf("tp_disrole_%d", rand.Intn(100000))
  369. userId := int64(900000 + rand.Intn(10000))
  370. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  371. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  372. })
  373. require.NoError(t, err)
  374. pmId, _ := pmRes.LastInsertId()
  375. disabledRoleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
  376. ProductCode: pc, Name: fmt.Sprintf("dis_%d", rand.Intn(100000)), Status: 2, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  377. })
  378. require.NoError(t, err)
  379. disabledRoleId, _ := disabledRoleRes.LastInsertId()
  380. permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  381. ProductCode: pc, Name: "dp", Code: fmt.Sprintf("dp_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  382. })
  383. require.NoError(t, err)
  384. permId, _ := permRes.LastInsertId()
  385. urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{UserId: userId, RoleId: disabledRoleId, CreateTime: now, UpdateTime: now})
  386. require.NoError(t, err)
  387. urId, _ := urRes.LastInsertId()
  388. rpRes, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{RoleId: disabledRoleId, PermId: permId, CreateTime: now, UpdateTime: now})
  389. require.NoError(t, err)
  390. rpId, _ := rpRes.LastInsertId()
  391. t.Cleanup(func() {
  392. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId)
  393. testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
  394. testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
  395. testutil.CleanTable(ctx, conn, "`sys_role`", disabledRoleId)
  396. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  397. })
  398. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  399. require.NoError(t, err)
  400. assert.Equal(t, "MEMBER", memberType)
  401. assert.Empty(t, permsResult)
  402. }
  403. // TC-0251: deptId=0, finalIds含已禁用权限
  404. func TestGetUserPerms_Member_DisabledPermFiltered(t *testing.T) {
  405. ctx := context.Background()
  406. svcCtx := newTestSvcCtx()
  407. conn := testutil.GetTestSqlConn()
  408. now := time.Now().Unix()
  409. pc := fmt.Sprintf("tp_disperm_%d", rand.Intn(100000))
  410. userId := int64(900000 + rand.Intn(10000))
  411. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  412. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  413. })
  414. require.NoError(t, err)
  415. pmId, _ := pmRes.LastInsertId()
  416. disabledPermRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  417. ProductCode: pc, Name: "dp2", Code: fmt.Sprintf("dp2_%d", rand.Intn(100000)), Status: 2, CreateTime: now, UpdateTime: now,
  418. })
  419. require.NoError(t, err)
  420. disabledPermId, _ := disabledPermRes.LastInsertId()
  421. allowRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  422. UserId: userId, PermId: disabledPermId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
  423. })
  424. require.NoError(t, err)
  425. allowId, _ := allowRes.LastInsertId()
  426. t.Cleanup(func() {
  427. testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowId)
  428. testutil.CleanTable(ctx, conn, "`sys_perm`", disabledPermId)
  429. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  430. })
  431. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  432. require.NoError(t, err)
  433. assert.Equal(t, "MEMBER", memberType)
  434. assert.Empty(t, permsResult)
  435. }
  436. // TC-0249: deptId=0, allowPermIds=[10], denyPermIds=[10]
  437. func TestGetUserPerms_Member_DENYOnlyExcludesTargetPerm(t *testing.T) {
  438. ctx := context.Background()
  439. svcCtx := newTestSvcCtx()
  440. conn := testutil.GetTestSqlConn()
  441. now := time.Now().Unix()
  442. pc := fmt.Sprintf("tp_denyonly_%d", rand.Intn(100000))
  443. userId := int64(900000 + rand.Intn(10000))
  444. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  445. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  446. })
  447. require.NoError(t, err)
  448. pmId, _ := pmRes.LastInsertId()
  449. permARes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  450. ProductCode: pc, Name: "pA", Code: fmt.Sprintf("doA_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  451. })
  452. require.NoError(t, err)
  453. permAId, _ := permARes.LastInsertId()
  454. permBRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  455. ProductCode: pc, Name: "pB", Code: fmt.Sprintf("doB_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  456. })
  457. require.NoError(t, err)
  458. permBId, _ := permBRes.LastInsertId()
  459. allowARes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  460. UserId: userId, PermId: permAId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
  461. })
  462. require.NoError(t, err)
  463. allowAId, _ := allowARes.LastInsertId()
  464. denyBRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  465. UserId: userId, PermId: permBId, Effect: "DENY", CreateTime: now, UpdateTime: now,
  466. })
  467. require.NoError(t, err)
  468. denyBId, _ := denyBRes.LastInsertId()
  469. t.Cleanup(func() {
  470. testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowAId, denyBId)
  471. testutil.CleanTable(ctx, conn, "`sys_perm`", permAId, permBId)
  472. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  473. })
  474. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  475. require.NoError(t, err)
  476. assert.Equal(t, "MEMBER", memberType)
  477. permA, _ := svcCtx.SysPermModel.FindOne(ctx, permAId)
  478. permB, _ := svcCtx.SysPermModel.FindOne(ctx, permBId)
  479. assert.Contains(t, permsResult, permA.Code, "ALLOW perm should be present")
  480. assert.NotContains(t, permsResult, permB.Code, "DENY perm should be excluded even if it exists")
  481. }
  482. // TC-0250: deptId=0, rolePermIds=[10], allowPermIds=[10]
  483. func TestGetUserPerms_Member_ALLOWAndRoleDedup(t *testing.T) {
  484. ctx := context.Background()
  485. svcCtx := newTestSvcCtx()
  486. conn := testutil.GetTestSqlConn()
  487. now := time.Now().Unix()
  488. pc := fmt.Sprintf("tp_dedup_%d", rand.Intn(100000))
  489. userId := int64(900000 + rand.Intn(10000))
  490. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  491. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  492. })
  493. require.NoError(t, err)
  494. pmId, _ := pmRes.LastInsertId()
  495. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &role.SysRole{
  496. ProductCode: pc, Name: fmt.Sprintf("dedup_r_%d", rand.Intn(100000)), Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now,
  497. })
  498. require.NoError(t, err)
  499. roleId, _ := roleRes.LastInsertId()
  500. permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  501. ProductCode: pc, Name: "dedup_p", Code: fmt.Sprintf("dd_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  502. })
  503. require.NoError(t, err)
  504. permId, _ := permRes.LastInsertId()
  505. urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  506. UserId: userId, RoleId: roleId, CreateTime: now, UpdateTime: now,
  507. })
  508. require.NoError(t, err)
  509. urId, _ := urRes.LastInsertId()
  510. rpRes, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  511. RoleId: roleId, PermId: permId, CreateTime: now, UpdateTime: now,
  512. })
  513. require.NoError(t, err)
  514. rpId, _ := rpRes.LastInsertId()
  515. allowRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  516. UserId: userId, PermId: permId, Effect: "ALLOW", CreateTime: now, UpdateTime: now,
  517. })
  518. require.NoError(t, err)
  519. allowId, _ := allowRes.LastInsertId()
  520. t.Cleanup(func() {
  521. testutil.CleanTable(ctx, conn, "`sys_user_perm`", allowId)
  522. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId)
  523. testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
  524. testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
  525. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  526. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  527. })
  528. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, 0, pc, false)
  529. require.NoError(t, err)
  530. assert.Equal(t, "MEMBER", memberType)
  531. permObj, _ := svcCtx.SysPermModel.FindOne(ctx, permId)
  532. assert.Len(t, permsResult, 1, "role perm and ALLOW same perm should be deduped")
  533. assert.Equal(t, permObj.Code, permsResult[0])
  534. }
  535. // TC-0238: deptId>0, MemberType="MEMBER", SysDeptModel.FindOne返回DeptType="DEV", FindAllCodesByProductCode返回["a","b","c"]
  536. func TestGetUserPerms_Member_DevDept_AllPerms(t *testing.T) {
  537. ctx := context.Background()
  538. svcCtx := newTestSvcCtx()
  539. conn := testutil.GetTestSqlConn()
  540. now := time.Now().Unix()
  541. pc := fmt.Sprintf("tp_devdept_%d", rand.Intn(100000))
  542. userId := int64(900000 + rand.Intn(10000))
  543. deptRes, err := svcCtx.SysDeptModel.Insert(ctx, &deptModel.SysDept{
  544. ParentId: 0, Name: "dev_dept_" + fmt.Sprintf("%d", rand.Intn(100000)),
  545. Path: "/", Sort: 1, DeptType: "DEV", Status: 1, CreateTime: now, UpdateTime: now,
  546. })
  547. require.NoError(t, err)
  548. deptId, _ := deptRes.LastInsertId()
  549. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  550. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  551. })
  552. require.NoError(t, err)
  553. pmId, _ := pmRes.LastInsertId()
  554. p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  555. ProductCode: pc, Name: "dp1", Code: fmt.Sprintf("dc1_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  556. })
  557. require.NoError(t, err)
  558. p1Id, _ := p1Res.LastInsertId()
  559. p2Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  560. ProductCode: pc, Name: "dp2", Code: fmt.Sprintf("dc2_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  561. })
  562. require.NoError(t, err)
  563. p2Id, _ := p2Res.LastInsertId()
  564. t.Cleanup(func() {
  565. testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id, p2Id)
  566. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  567. testutil.CleanTable(ctx, conn, "`sys_dept`", deptId)
  568. })
  569. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, deptId, pc, false)
  570. require.NoError(t, err)
  571. assert.Equal(t, "MEMBER", memberType)
  572. p1, _ := svcCtx.SysPermModel.FindOne(ctx, p1Id)
  573. p2, _ := svcCtx.SysPermModel.FindOne(ctx, p2Id)
  574. assert.ElementsMatch(t, []string{p1.Code, p2.Code}, permsResult)
  575. }
  576. // TC-0240: deptId>0, DeptType="NORMAL"
  577. func TestGetUserPerms_Member_NormalDept_NoAutoPerms(t *testing.T) {
  578. ctx := context.Background()
  579. svcCtx := newTestSvcCtx()
  580. conn := testutil.GetTestSqlConn()
  581. now := time.Now().Unix()
  582. pc := fmt.Sprintf("tp_normdept_%d", rand.Intn(100000))
  583. userId := int64(900000 + rand.Intn(10000))
  584. deptRes, err := svcCtx.SysDeptModel.Insert(ctx, &deptModel.SysDept{
  585. ParentId: 0, Name: "normal_dept_" + fmt.Sprintf("%d", rand.Intn(100000)),
  586. Path: "/", Sort: 1, DeptType: "NORMAL", Status: 1, CreateTime: now, UpdateTime: now,
  587. })
  588. require.NoError(t, err)
  589. deptId, _ := deptRes.LastInsertId()
  590. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  591. ProductCode: pc, UserId: userId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now,
  592. })
  593. require.NoError(t, err)
  594. pmId, _ := pmRes.LastInsertId()
  595. p1Res, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  596. ProductCode: pc, Name: "np1", Code: fmt.Sprintf("nc1_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  597. })
  598. require.NoError(t, err)
  599. p1Id, _ := p1Res.LastInsertId()
  600. t.Cleanup(func() {
  601. testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id)
  602. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  603. testutil.CleanTable(ctx, conn, "`sys_dept`", deptId)
  604. })
  605. permsResult, memberType, err := GetUserPerms(ctx, svcCtx, userId, deptId, pc, false)
  606. require.NoError(t, err)
  607. assert.Equal(t, "MEMBER", memberType)
  608. assert.Empty(t, permsResult)
  609. }
  610. // suppress unused import
  611. var _ = sqlx.ErrNotFound