updateProductLogic_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package product
  2. import (
  3. "context"
  4. "errors"
  5. "testing"
  6. "time"
  7. productModel "perms-system-server/internal/model/product"
  8. "perms-system-server/internal/response"
  9. "perms-system-server/internal/svc"
  10. "perms-system-server/internal/testutil"
  11. "perms-system-server/internal/testutil/ctxhelper"
  12. "perms-system-server/internal/types"
  13. "github.com/stretchr/testify/assert"
  14. "github.com/stretchr/testify/require"
  15. )
  16. func insertTestProduct(t *testing.T, ctx context.Context) *productModel.SysProduct {
  17. t.Helper()
  18. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  19. conn := testutil.GetTestSqlConn()
  20. code := testutil.UniqueId()
  21. now := time.Now().Unix()
  22. result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  23. Code: code,
  24. Name: "待更新产品",
  25. AppKey: "test_key_" + code,
  26. AppSecret: "test_secret_" + code,
  27. Remark: "原始备注",
  28. Status: 1,
  29. CreateTime: now,
  30. UpdateTime: now,
  31. })
  32. require.NoError(t, err)
  33. id, _ := result.LastInsertId()
  34. t.Cleanup(func() {
  35. testutil.CleanTable(ctx, conn, "`sys_product`", id)
  36. })
  37. return &productModel.SysProduct{
  38. Id: id,
  39. Code: code,
  40. Name: "待更新产品",
  41. AppKey: "test_key_" + code,
  42. AppSecret: "test_secret_" + code,
  43. Remark: "原始备注",
  44. Status: 1,
  45. CreateTime: now,
  46. UpdateTime: now,
  47. }
  48. }
  49. // TC-0076: 正常更新
  50. func TestUpdateProduct_Success(t *testing.T) {
  51. ctx := ctxhelper.SuperAdminCtx()
  52. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  53. p := insertTestProduct(t, ctx)
  54. logic := NewUpdateProductLogic(ctx, svcCtx)
  55. err := logic.UpdateProduct(&types.UpdateProductReq{
  56. Id: p.Id,
  57. Name: "已更新名称",
  58. Remark: "已更新备注",
  59. Status: 2,
  60. })
  61. require.NoError(t, err)
  62. updated, err := svcCtx.SysProductModel.FindOne(ctx, p.Id)
  63. require.NoError(t, err)
  64. assert.Equal(t, "已更新名称", updated.Name)
  65. assert.Equal(t, "已更新备注", updated.Remark)
  66. assert.Equal(t, int64(2), updated.Status)
  67. }
  68. // TC-0077: 不存在
  69. func TestUpdateProduct_NotFound(t *testing.T) {
  70. ctx := ctxhelper.SuperAdminCtx()
  71. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  72. logic := NewUpdateProductLogic(ctx, svcCtx)
  73. err := logic.UpdateProduct(&types.UpdateProductReq{
  74. Id: 999999999,
  75. Name: "不存在",
  76. })
  77. require.Error(t, err)
  78. var codeErr *response.CodeError
  79. require.True(t, errors.As(err, &codeErr))
  80. assert.Equal(t, 404, codeErr.Code())
  81. assert.Equal(t, "产品不存在", codeErr.Error())
  82. }
  83. // TC-0078: 不传status
  84. func TestUpdateProduct_StatusZeroUnchanged(t *testing.T) {
  85. ctx := ctxhelper.SuperAdminCtx()
  86. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  87. p := insertTestProduct(t, ctx)
  88. logic := NewUpdateProductLogic(ctx, svcCtx)
  89. err := logic.UpdateProduct(&types.UpdateProductReq{
  90. Id: p.Id,
  91. Name: "新名称",
  92. Remark: "新备注",
  93. Status: 0,
  94. })
  95. require.NoError(t, err)
  96. updated, err := svcCtx.SysProductModel.FindOne(ctx, p.Id)
  97. require.NoError(t, err)
  98. assert.Equal(t, "新名称", updated.Name)
  99. assert.Equal(t, "新备注", updated.Remark)
  100. assert.Equal(t, int64(1), updated.Status, "status should remain unchanged when req.Status is 0")
  101. }
  102. // TC-0536: updateProduct非超管拒绝
  103. func TestUpdateProduct_NonSuperAdminRejected(t *testing.T) {
  104. ctx := ctxhelper.AdminCtx("test_product")
  105. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  106. logic := NewUpdateProductLogic(ctx, svcCtx)
  107. err := logic.UpdateProduct(&types.UpdateProductReq{Id: 1, Name: "test"})
  108. require.Error(t, err)
  109. var ce *response.CodeError
  110. require.True(t, errors.As(err, &ce))
  111. assert.Equal(t, 403, ce.Code())
  112. }
  113. // TC-0090: updateProduct 非法状态值被拒绝(修复验证)
  114. func TestUpdateProduct_InvalidStatusRejected(t *testing.T) {
  115. ctx := ctxhelper.SuperAdminCtx()
  116. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  117. p := insertTestProduct(t, ctx)
  118. logic := NewUpdateProductLogic(ctx, svcCtx)
  119. invalid := []int64{3, 99, -1}
  120. for _, st := range invalid {
  121. err := logic.UpdateProduct(&types.UpdateProductReq{Id: p.Id, Status: st})
  122. require.Error(t, err, "status=%d 应被拒绝", st)
  123. var ce *response.CodeError
  124. require.True(t, errors.As(err, &ce))
  125. assert.Equal(t, 400, ce.Code())
  126. }
  127. after, err := svcCtx.SysProductModel.FindOne(ctx, p.Id)
  128. require.NoError(t, err)
  129. assert.Equal(t, int64(1), after.Status, "非法状态不应落库")
  130. }