createProductLogic_mock_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package product
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "testing"
  7. productModel "perms-system-server/internal/model/product"
  8. userModel "perms-system-server/internal/model/user"
  9. "perms-system-server/internal/testutil/ctxhelper"
  10. "perms-system-server/internal/testutil/mocks"
  11. "perms-system-server/internal/types"
  12. "github.com/stretchr/testify/assert"
  13. "github.com/zeromicro/go-zero/core/stores/sqlx"
  14. "go.uber.org/mock/gomock"
  15. )
  16. type fakeResult struct{ id int64 }
  17. func (r fakeResult) LastInsertId() (int64, error) { return r.id, nil }
  18. func (r fakeResult) RowsAffected() (int64, error) { return 1, nil }
  19. // TC-0061: 事务回滚-用户创建失败
  20. func TestCreateProduct_Mock_UserInsertFail(t *testing.T) {
  21. ctrl := gomock.NewController(t)
  22. defer ctrl.Finish()
  23. dbErr := errors.New("db error")
  24. mockProduct := mocks.NewMockSysProductModel(ctrl)
  25. mockProduct.EXPECT().FindOneByCode(gomock.Any(), "test_code").
  26. Return(nil, productModel.ErrNotFound)
  27. mockProduct.EXPECT().TransactCtx(gomock.Any(), gomock.Any()).
  28. DoAndReturn(func(ctx context.Context, fn func(context.Context, sqlx.Session) error) error {
  29. return fn(ctx, nil)
  30. })
  31. mockProduct.EXPECT().InsertWithTx(gomock.Any(), nil, gomock.Any()).
  32. Return(fakeResult{id: 1}, nil)
  33. mockUser := mocks.NewMockSysUserModel(ctrl)
  34. mockUser.EXPECT().FindOneByUsername(gomock.Any(), "admin_test_code").
  35. Return(nil, userModel.ErrNotFound)
  36. mockUser.EXPECT().InsertWithTx(gomock.Any(), nil, gomock.Any()).
  37. Return(nil, dbErr)
  38. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  39. Product: mockProduct,
  40. User: mockUser,
  41. })
  42. logic := NewCreateProductLogic(ctxhelper.SuperAdminCtx(), svcCtx)
  43. resp, err := logic.CreateProduct(&types.CreateProductReq{
  44. Code: "test_code",
  45. Name: "Test Product",
  46. })
  47. assert.Error(t, err)
  48. assert.ErrorIs(t, err, dbErr)
  49. assert.Nil(t, resp)
  50. }
  51. // TC-0062: 事务回滚-成员创建失败
  52. func TestCreateProduct_Mock_MemberInsertFail(t *testing.T) {
  53. ctrl := gomock.NewController(t)
  54. defer ctrl.Finish()
  55. dbErr := errors.New("db error")
  56. mockProduct := mocks.NewMockSysProductModel(ctrl)
  57. mockProduct.EXPECT().FindOneByCode(gomock.Any(), "test_code").
  58. Return(nil, productModel.ErrNotFound)
  59. mockProduct.EXPECT().TransactCtx(gomock.Any(), gomock.Any()).
  60. DoAndReturn(func(ctx context.Context, fn func(context.Context, sqlx.Session) error) error {
  61. return fn(ctx, nil)
  62. })
  63. mockProduct.EXPECT().InsertWithTx(gomock.Any(), nil, gomock.Any()).
  64. Return(fakeResult{id: 1}, nil)
  65. mockUser := mocks.NewMockSysUserModel(ctrl)
  66. mockUser.EXPECT().FindOneByUsername(gomock.Any(), "admin_test_code").
  67. Return(nil, userModel.ErrNotFound)
  68. mockUser.EXPECT().InsertWithTx(gomock.Any(), nil, gomock.Any()).
  69. Return(fakeResult{id: 10}, nil)
  70. mockPM := mocks.NewMockSysProductMemberModel(ctrl)
  71. mockPM.EXPECT().InsertWithTx(gomock.Any(), nil, gomock.Any()).
  72. Return(sql.Result(nil), dbErr)
  73. svcCtx := mocks.NewMockServiceContext(mocks.MockModels{
  74. Product: mockProduct,
  75. User: mockUser,
  76. ProductMember: mockPM,
  77. })
  78. logic := NewCreateProductLogic(ctxhelper.SuperAdminCtx(), svcCtx)
  79. resp, err := logic.CreateProduct(&types.CreateProductReq{
  80. Code: "test_code",
  81. Name: "Test Product",
  82. })
  83. assert.Error(t, err)
  84. assert.ErrorIs(t, err, dbErr)
  85. assert.Nil(t, resp)
  86. }