syncPermsLogic_mock_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package pub
  2. import (
  3. "context"
  4. "errors"
  5. "testing"
  6. permModel "perms-system-server/internal/model/perm"
  7. productModel "perms-system-server/internal/model/product"
  8. "perms-system-server/internal/testutil/mocks"
  9. "perms-system-server/internal/types"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. "github.com/zeromicro/go-zero/core/stores/sqlx"
  13. "go.uber.org/mock/gomock"
  14. "golang.org/x/crypto/bcrypt"
  15. )
  16. // TC-0044: 事务保护-中途失败回滚
  17. func TestSyncPerms_Mock_TransactionRollbackOnBatchUpdateFail(t *testing.T) {
  18. ctrl := gomock.NewController(t)
  19. defer ctrl.Finish()
  20. dbErr := errors.New("batch update failed")
  21. hashedSecret, err := bcrypt.GenerateFromPassword([]byte("test_app_secret"), bcrypt.MinCost)
  22. require.NoError(t, err)
  23. mockProduct := mocks.NewMockSysProductModel(ctrl)
  24. mockProduct.EXPECT().FindOneByAppKey(gomock.Any(), "test_app_key").
  25. Return(&productModel.SysProduct{
  26. Id: 1,
  27. Code: "test_product",
  28. AppKey: "test_app_key",
  29. AppSecret: string(hashedSecret),
  30. Status: 1,
  31. }, nil)
  32. mockPerm := mocks.NewMockSysPermModel(ctrl)
  33. mockPerm.EXPECT().FindMapByProductCode(gomock.Any(), "test_product").
  34. Return(map[string]*permModel.SysPerm{
  35. "existing_code": {
  36. Id: 10,
  37. ProductCode: "test_product",
  38. Code: "existing_code",
  39. Name: "Old Name",
  40. Remark: "old remark",
  41. Status: 1,
  42. },
  43. }, nil)
  44. mockPerm.EXPECT().TransactCtx(gomock.Any(), gomock.Any()).
  45. DoAndReturn(func(ctx context.Context, fn func(context.Context, sqlx.Session) error) error {
  46. return fn(ctx, nil)
  47. })
  48. mockPerm.EXPECT().BatchInsertWithTx(gomock.Any(), nil, gomock.Any()).Return(nil)
  49. mockPerm.EXPECT().BatchUpdateWithTx(gomock.Any(), nil, gomock.Any()).Return(dbErr)
  50. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  51. Product: mockProduct,
  52. Perm: mockPerm,
  53. })
  54. logic := NewSyncPermsLogic(context.Background(), svcCtx)
  55. resp, err := logic.SyncPerms(&types.SyncPermsReq{
  56. AppKey: "test_app_key",
  57. AppSecret: "test_app_secret",
  58. Perms: []types.SyncPermItem{
  59. {Code: "new_code", Name: "New Perm"},
  60. {Code: "existing_code", Name: "Updated Name", Remark: "new remark"},
  61. },
  62. })
  63. assert.Nil(t, resp)
  64. assert.Error(t, err)
  65. assert.Contains(t, err.Error(), "同步权限事务失败")
  66. }