perms_mock_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. package auth
  2. import (
  3. "context"
  4. "errors"
  5. "testing"
  6. "perms-system-server/internal/consts"
  7. "perms-system-server/internal/model/dept"
  8. "perms-system-server/internal/model/productmember"
  9. "perms-system-server/internal/testutil/mocks"
  10. "github.com/stretchr/testify/assert"
  11. "go.uber.org/mock/gomock"
  12. )
  13. var errDB = errors.New("db error")
  14. // TC-0232: isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回err
  15. func TestGetUserPerms_Mock_SuperAdmin_FindAllCodesFail(t *testing.T) {
  16. ctrl := gomock.NewController(t)
  17. defer ctrl.Finish()
  18. mockPerm := mocks.NewMockSysPermModel(ctrl)
  19. mockPerm.EXPECT().FindAllCodesByProductCode(gomock.Any(), "pc").Return(nil, errDB)
  20. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  21. Perm: mockPerm,
  22. })
  23. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", true)
  24. assert.ErrorIs(t, err, errDB)
  25. assert.Nil(t, perms)
  26. assert.Empty(t, memberType)
  27. }
  28. // TC-0234: deptId=0, FindOneByProductCodeUserId返回DB error
  29. func TestGetUserPerms_Mock_MemberQueryDBError(t *testing.T) {
  30. ctrl := gomock.NewController(t)
  31. defer ctrl.Finish()
  32. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  33. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).Return(nil, errDB)
  34. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  35. ProductMember: mockPM,
  36. })
  37. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  38. assert.ErrorIs(t, err, errDB)
  39. assert.Nil(t, perms)
  40. assert.Empty(t, memberType)
  41. }
  42. // TC-0237: deptId=0, MemberType="DEVELOPER", FindAllCodesByProductCode失败
  43. func TestGetUserPerms_Mock_Developer_FindAllCodesFail(t *testing.T) {
  44. ctrl := gomock.NewController(t)
  45. defer ctrl.Finish()
  46. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  47. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  48. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeDeveloper}, nil)
  49. mockPerm := mocks.NewMockSysPermModel(ctrl)
  50. mockPerm.EXPECT().FindAllCodesByProductCode(gomock.Any(), "pc").Return(nil, errDB)
  51. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  52. ProductMember: mockPM,
  53. Perm: mockPerm,
  54. })
  55. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  56. assert.ErrorIs(t, err, errDB)
  57. assert.Nil(t, perms)
  58. assert.Equal(t, consts.MemberTypeDeveloper, memberType)
  59. }
  60. // TC-0252: deptId=0, 返回err
  61. func TestGetUserPerms_Mock_Member_FindRoleIdsFail(t *testing.T) {
  62. ctrl := gomock.NewController(t)
  63. defer ctrl.Finish()
  64. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  65. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  66. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  67. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  68. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return(nil, errDB)
  69. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  70. ProductMember: mockPM,
  71. UserRole: mockUR,
  72. })
  73. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  74. assert.ErrorIs(t, err, errDB)
  75. assert.Nil(t, perms)
  76. assert.Equal(t, consts.MemberTypeMember, memberType)
  77. }
  78. // TC-0253: deptId=0, 返回err
  79. func TestGetUserPerms_Mock_Member_FindRoleByIdsFail(t *testing.T) {
  80. ctrl := gomock.NewController(t)
  81. defer ctrl.Finish()
  82. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  83. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  84. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  85. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  86. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{10, 20}, nil)
  87. mockRole := mocks.NewMockSysRoleModel(ctrl)
  88. mockRole.EXPECT().FindByIds(gomock.Any(), []int64{10, 20}).Return(nil, errDB)
  89. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  90. ProductMember: mockPM,
  91. UserRole: mockUR,
  92. Role: mockRole,
  93. })
  94. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  95. assert.ErrorIs(t, err, errDB)
  96. assert.Nil(t, perms)
  97. assert.Equal(t, consts.MemberTypeMember, memberType)
  98. }
  99. // TC-0254: deptId=0, 返回err
  100. func TestGetUserPerms_Mock_Member_FindPermIdsByRoleIdsFail(t *testing.T) {
  101. ctrl := gomock.NewController(t)
  102. defer ctrl.Finish()
  103. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  104. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  105. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  106. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  107. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  108. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  109. mockRP.EXPECT().FindPermIdsByRoleIds(gomock.Any(), gomock.Any()).Return(nil, errDB)
  110. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  111. ProductMember: mockPM,
  112. UserRole: mockUR,
  113. RolePerm: mockRP,
  114. })
  115. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  116. assert.ErrorIs(t, err, errDB)
  117. assert.Nil(t, perms)
  118. assert.Equal(t, consts.MemberTypeMember, memberType)
  119. }
  120. // TC-0255: deptId=0, 返回err
  121. func TestGetUserPerms_Mock_Member_FindAllowPermIdsFail(t *testing.T) {
  122. ctrl := gomock.NewController(t)
  123. defer ctrl.Finish()
  124. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  125. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  126. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  127. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  128. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  129. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  130. mockRP.EXPECT().FindPermIdsByRoleIds(gomock.Any(), gomock.Any()).Return([]int64{}, nil)
  131. mockUP := mocks.NewMockSysUserPermModel(ctrl)
  132. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectAllow).Return(nil, errDB)
  133. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  134. ProductMember: mockPM,
  135. UserRole: mockUR,
  136. RolePerm: mockRP,
  137. UserPerm: mockUP,
  138. })
  139. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  140. assert.ErrorIs(t, err, errDB)
  141. assert.Nil(t, perms)
  142. assert.Equal(t, consts.MemberTypeMember, memberType)
  143. }
  144. // TC-0256: deptId=0, 返回err
  145. func TestGetUserPerms_Mock_Member_FindDenyPermIdsFail(t *testing.T) {
  146. ctrl := gomock.NewController(t)
  147. defer ctrl.Finish()
  148. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  149. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  150. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  151. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  152. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  153. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  154. mockRP.EXPECT().FindPermIdsByRoleIds(gomock.Any(), gomock.Any()).Return([]int64{}, nil)
  155. mockUP := mocks.NewMockSysUserPermModel(ctrl)
  156. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectAllow).Return([]int64{}, nil)
  157. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectDeny).Return(nil, errDB)
  158. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  159. ProductMember: mockPM,
  160. UserRole: mockUR,
  161. RolePerm: mockRP,
  162. UserPerm: mockUP,
  163. })
  164. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  165. assert.ErrorIs(t, err, errDB)
  166. assert.Nil(t, perms)
  167. assert.Equal(t, consts.MemberTypeMember, memberType)
  168. }
  169. // TC-0257: deptId=0, 返回err
  170. func TestGetUserPerms_Mock_Member_FindPermByIdsFail(t *testing.T) {
  171. ctrl := gomock.NewController(t)
  172. defer ctrl.Finish()
  173. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  174. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  175. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  176. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  177. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  178. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  179. mockRP.EXPECT().FindPermIdsByRoleIds(gomock.Any(), gomock.Any()).Return([]int64{}, nil)
  180. mockUP := mocks.NewMockSysUserPermModel(ctrl)
  181. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectAllow).Return([]int64{100}, nil)
  182. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectDeny).Return([]int64{}, nil)
  183. mockPerm := mocks.NewMockSysPermModel(ctrl)
  184. mockPerm.EXPECT().FindByIds(gomock.Any(), gomock.Any()).Return(nil, errDB)
  185. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  186. ProductMember: mockPM,
  187. UserRole: mockUR,
  188. RolePerm: mockRP,
  189. UserPerm: mockUP,
  190. Perm: mockPerm,
  191. })
  192. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 0, "pc", false)
  193. assert.ErrorIs(t, err, errDB)
  194. assert.Nil(t, perms)
  195. assert.Equal(t, consts.MemberTypeMember, memberType)
  196. }
  197. // TC-0238: deptId>0, MemberType="MEMBER", SysDeptModel.FindOne返回DeptType="DEV", FindAllCodesByProductCode返回["a","b","c"]
  198. func TestGetUserPerms_Mock_Member_DevDeptGetAllPerms(t *testing.T) {
  199. ctrl := gomock.NewController(t)
  200. defer ctrl.Finish()
  201. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  202. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  203. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  204. mockDept := mocks.NewMockSysDeptModel(ctrl)
  205. mockDept.EXPECT().FindOne(gomock.Any(), int64(100)).
  206. Return(&dept.SysDept{Id: 100, DeptType: consts.DeptTypeDev}, nil)
  207. mockPerm := mocks.NewMockSysPermModel(ctrl)
  208. mockPerm.EXPECT().FindAllCodesByProductCode(gomock.Any(), "pc").Return([]string{"p1", "p2", "p3"}, nil)
  209. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  210. ProductMember: mockPM,
  211. Dept: mockDept,
  212. Perm: mockPerm,
  213. })
  214. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 100, "pc", false)
  215. assert.NoError(t, err)
  216. assert.Equal(t, consts.MemberTypeMember, memberType)
  217. assert.ElementsMatch(t, []string{"p1", "p2", "p3"}, perms)
  218. }
  219. // TC-0239: deptId>0, DeptType="DEV", FindAllCodesByProductCode返回err
  220. func TestGetUserPerms_Mock_Member_DevDeptFindAllCodesFail(t *testing.T) {
  221. ctrl := gomock.NewController(t)
  222. defer ctrl.Finish()
  223. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  224. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  225. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  226. mockDept := mocks.NewMockSysDeptModel(ctrl)
  227. mockDept.EXPECT().FindOne(gomock.Any(), int64(100)).
  228. Return(&dept.SysDept{Id: 100, DeptType: consts.DeptTypeDev}, nil)
  229. mockPerm := mocks.NewMockSysPermModel(ctrl)
  230. mockPerm.EXPECT().FindAllCodesByProductCode(gomock.Any(), "pc").Return(nil, errDB)
  231. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  232. ProductMember: mockPM,
  233. Dept: mockDept,
  234. Perm: mockPerm,
  235. })
  236. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 100, "pc", false)
  237. assert.ErrorIs(t, err, errDB)
  238. assert.Nil(t, perms)
  239. assert.Equal(t, consts.MemberTypeMember, memberType)
  240. }
  241. // TC-0241: deptId>0, FindOne返回ErrNotFound
  242. func TestGetUserPerms_Mock_Member_DeptFindOneFail_FallsThrough(t *testing.T) {
  243. ctrl := gomock.NewController(t)
  244. defer ctrl.Finish()
  245. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  246. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  247. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  248. mockDept := mocks.NewMockSysDeptModel(ctrl)
  249. mockDept.EXPECT().FindOne(gomock.Any(), int64(100)).
  250. Return(nil, errors.New("dept not found"))
  251. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  252. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  253. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  254. mockRP.EXPECT().FindPermIdsByRoleIds(gomock.Any(), gomock.Any()).Return([]int64{}, nil)
  255. mockUP := mocks.NewMockSysUserPermModel(ctrl)
  256. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectAllow).Return([]int64{}, nil)
  257. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectDeny).Return([]int64{}, nil)
  258. mockPerm := mocks.NewMockSysPermModel(ctrl)
  259. mockPerm.EXPECT().FindByIds(gomock.Any(), gomock.Any()).Return(nil, nil)
  260. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  261. ProductMember: mockPM,
  262. Dept: mockDept,
  263. UserRole: mockUR,
  264. RolePerm: mockRP,
  265. UserPerm: mockUP,
  266. Perm: mockPerm,
  267. })
  268. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 100, "pc", false)
  269. assert.NoError(t, err)
  270. assert.Equal(t, consts.MemberTypeMember, memberType)
  271. assert.Empty(t, perms)
  272. }
  273. // TC-0240: deptId>0, DeptType="NORMAL"
  274. func TestGetUserPerms_Mock_Member_NormalDeptFallsThrough(t *testing.T) {
  275. ctrl := gomock.NewController(t)
  276. defer ctrl.Finish()
  277. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  278. mockPM.EXPECT().FindOneByProductCodeUserId(gomock.Any(), "pc", int64(1)).
  279. Return(&productmember.SysProductMember{MemberType: consts.MemberTypeMember}, nil)
  280. mockDept := mocks.NewMockSysDeptModel(ctrl)
  281. mockDept.EXPECT().FindOne(gomock.Any(), int64(100)).
  282. Return(&dept.SysDept{Id: 100, DeptType: consts.DeptTypeNormal}, nil)
  283. mockUR := mocks.NewMockSysUserRoleModel(ctrl)
  284. mockUR.EXPECT().FindRoleIdsByUserId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  285. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  286. mockRP.EXPECT().FindPermIdsByRoleIds(gomock.Any(), gomock.Any()).Return([]int64{}, nil)
  287. mockUP := mocks.NewMockSysUserPermModel(ctrl)
  288. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectAllow).Return([]int64{}, nil)
  289. mockUP.EXPECT().FindPermIdsByUserIdAndEffect(gomock.Any(), int64(1), consts.PermEffectDeny).Return([]int64{}, nil)
  290. mockPerm := mocks.NewMockSysPermModel(ctrl)
  291. mockPerm.EXPECT().FindByIds(gomock.Any(), gomock.Any()).Return(nil, nil)
  292. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  293. ProductMember: mockPM,
  294. Dept: mockDept,
  295. UserRole: mockUR,
  296. RolePerm: mockRP,
  297. UserPerm: mockUP,
  298. Perm: mockPerm,
  299. })
  300. perms, memberType, err := GetUserPerms(context.Background(), svcCtx, 1, 100, "pc", false)
  301. assert.NoError(t, err)
  302. assert.Equal(t, consts.MemberTypeMember, memberType)
  303. assert.Empty(t, perms)
  304. }