productDetailLogic_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. // TC-0058: 正常查询
  17. func TestProductDetail_Success(t *testing.T) {
  18. ctx := context.Background()
  19. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  20. conn := testutil.GetTestSqlConn()
  21. code := testutil.UniqueId()
  22. now := time.Now().Unix()
  23. result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  24. Code: code,
  25. Name: "详情测试产品",
  26. AppKey: "dk_" + code,
  27. AppSecret: "ds_" + code,
  28. Remark: "详情备注",
  29. Status: 1,
  30. CreateTime: now,
  31. UpdateTime: now,
  32. })
  33. require.NoError(t, err)
  34. id, _ := result.LastInsertId()
  35. t.Cleanup(func() {
  36. testutil.CleanTable(ctx, conn, "`sys_product`", id)
  37. })
  38. logic := NewProductDetailLogic(ctx, svcCtx)
  39. item, err := logic.ProductDetail(&types.ProductDetailReq{Id: id})
  40. require.NoError(t, err)
  41. require.NotNil(t, item)
  42. assert.Equal(t, id, item.Id)
  43. assert.Equal(t, code, item.Code)
  44. assert.Equal(t, "详情测试产品", item.Name)
  45. assert.Equal(t, "", item.AppKey, "AppKey should be hidden for non-superadmin")
  46. assert.Equal(t, "详情备注", item.Remark)
  47. assert.Equal(t, int64(1), item.Status)
  48. assert.Equal(t, now, item.CreateTime)
  49. }
  50. // TC-0059: 不存在
  51. func TestProductDetail_NotFound(t *testing.T) {
  52. ctx := context.Background()
  53. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  54. logic := NewProductDetailLogic(ctx, svcCtx)
  55. _, err := logic.ProductDetail(&types.ProductDetailReq{Id: 999999999})
  56. require.Error(t, err)
  57. var codeErr *response.CodeError
  58. require.True(t, errors.As(err, &codeErr))
  59. assert.Equal(t, 404, codeErr.Code())
  60. assert.Equal(t, "产品不存在", codeErr.Error())
  61. }
  62. // TC-0528: 非超管AppKey隐藏
  63. func TestProductDetail_NonSuperAdminAppKeyHidden(t *testing.T) {
  64. ctx := ctxhelper.MemberCtx("test_product")
  65. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  66. conn := testutil.GetTestSqlConn()
  67. code := testutil.UniqueId()
  68. now := time.Now().Unix()
  69. result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  70. Code: code, Name: "detail_appkey", AppKey: "secret_dk_" + code, AppSecret: "ds_" + code,
  71. Status: 1, CreateTime: now, UpdateTime: now,
  72. })
  73. require.NoError(t, err)
  74. id, _ := result.LastInsertId()
  75. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product`", id) })
  76. logic := NewProductDetailLogic(ctx, svcCtx)
  77. item, err := logic.ProductDetail(&types.ProductDetailReq{Id: id})
  78. require.NoError(t, err)
  79. assert.Empty(t, item.AppKey, "非超管不应看到AppKey")
  80. }
  81. // TC-0529: 超管可见AppKey
  82. func TestProductDetail_SuperAdminAppKeyVisible(t *testing.T) {
  83. ctx := ctxhelper.SuperAdminCtx()
  84. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  85. conn := testutil.GetTestSqlConn()
  86. code := testutil.UniqueId()
  87. now := time.Now().Unix()
  88. result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  89. Code: code, Name: "detail_appkey_sa", AppKey: "visible_dk_" + code, AppSecret: "ds_" + code,
  90. Status: 1, CreateTime: now, UpdateTime: now,
  91. })
  92. require.NoError(t, err)
  93. id, _ := result.LastInsertId()
  94. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product`", id) })
  95. logic := NewProductDetailLogic(ctx, svcCtx)
  96. item, err := logic.ProductDetail(&types.ProductDetailReq{Id: id})
  97. require.NoError(t, err)
  98. assert.Equal(t, "visible_dk_"+code, item.AppKey, "超管应能看到AppKey")
  99. }