bindRolePermsLogic_mock_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package role
  2. import (
  3. "context"
  4. "errors"
  5. "testing"
  6. permModel "perms-system-server/internal/model/perm"
  7. roleModel "perms-system-server/internal/model/role"
  8. "perms-system-server/internal/testutil/ctxhelper"
  9. "perms-system-server/internal/testutil/mocks"
  10. "perms-system-server/internal/types"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/zeromicro/go-zero/core/stores/sqlx"
  13. "go.uber.org/mock/gomock"
  14. )
  15. // TC-0133: 事务回滚
  16. func TestBindRolePerms_Mock_BatchInsertFail(t *testing.T) {
  17. ctrl := gomock.NewController(t)
  18. defer ctrl.Finish()
  19. dbErr := errors.New("db error")
  20. pc := "test_product"
  21. mockRole := mocks.NewMockSysRoleModel(ctrl)
  22. mockRole.EXPECT().FindOne(gomock.Any(), int64(1)).
  23. Return(&roleModel.SysRole{Id: 1, ProductCode: pc}, nil)
  24. mockPerm := mocks.NewMockSysPermModel(ctrl)
  25. mockPerm.EXPECT().FindByIds(gomock.Any(), []int64{10, 20}).
  26. Return([]*permModel.SysPerm{
  27. {Id: 10, ProductCode: pc, Code: "perm_10", Status: 1},
  28. {Id: 20, ProductCode: pc, Code: "perm_20", Status: 1},
  29. }, nil)
  30. mockRP := mocks.NewMockSysRolePermModel(ctrl)
  31. mockRP.EXPECT().FindPermIdsByRoleId(gomock.Any(), int64(1)).Return([]int64{}, nil)
  32. mockRP.EXPECT().TableName().Return("`sys_role_perm`").AnyTimes()
  33. mockRP.EXPECT().TransactCtx(gomock.Any(), gomock.Any()).
  34. DoAndReturn(func(ctx context.Context, fn func(context.Context, sqlx.Session) error) error {
  35. return fn(ctx, nil)
  36. })
  37. // audit M-2 修复:循环 DELETE 替换为批量 DeleteByRoleIdAndPermIdsTx;toRemove 为空时也被调用
  38. mockRP.EXPECT().DeleteByRoleIdAndPermIdsTx(gomock.Any(), nil, int64(1), []int64(nil)).Return(nil)
  39. mockRP.EXPECT().BatchInsertWithTx(gomock.Any(), nil, gomock.Any()).Return(dbErr)
  40. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  41. Role: mockRole,
  42. Perm: mockPerm,
  43. RolePerm: mockRP,
  44. })
  45. logic := NewBindRolePermsLogic(ctxhelper.SuperAdminCtx(), svcCtx)
  46. err := logic.BindRolePerms(&types.BindPermsReq{
  47. RoleId: 1,
  48. PermIds: []int64{10, 20},
  49. })
  50. assert.Error(t, err)
  51. assert.ErrorIs(t, err, dbErr)
  52. }