package product import ( "context" "errors" "testing" "time" productModel "perms-system-server/internal/model/product" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/testutil" "perms-system-server/internal/testutil/ctxhelper" "perms-system-server/internal/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TC-0073: 正常查询 func TestProductDetail_Success(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() code := testutil.UniqueId() now := time.Now().Unix() result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: code, Name: "详情测试产品", AppKey: "dk_" + code, AppSecret: "ds_" + code, Remark: "详情备注", Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) id, _ := result.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product`", id) }) logic := NewProductDetailLogic(ctx, svcCtx) item, err := logic.ProductDetail(&types.ProductDetailReq{Id: id}) require.NoError(t, err) require.NotNil(t, item) assert.Equal(t, id, item.Id) assert.Equal(t, code, item.Code) assert.Equal(t, "详情测试产品", item.Name) assert.Equal(t, "", item.AppKey, "AppKey should be hidden for non-superadmin") assert.Equal(t, "详情备注", item.Remark) assert.Equal(t, int64(1), item.Status) assert.Equal(t, now, item.CreateTime) } // TC-0074: 不存在 func TestProductDetail_NotFound(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewProductDetailLogic(ctx, svcCtx) _, err := logic.ProductDetail(&types.ProductDetailReq{Id: 999999999}) require.Error(t, err) var codeErr *response.CodeError require.True(t, errors.As(err, &codeErr)) assert.Equal(t, 404, codeErr.Code()) assert.Equal(t, "产品不存在", codeErr.Error()) } // TC-0077: 非超管AppKey隐藏 func TestProductDetail_NonSuperAdminAppKeyHidden(t *testing.T) { ctx := ctxhelper.MemberCtx("test_product") svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() code := testutil.UniqueId() now := time.Now().Unix() result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: code, Name: "detail_appkey", AppKey: "secret_dk_" + code, AppSecret: "ds_" + code, Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) id, _ := result.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product`", id) }) logic := NewProductDetailLogic(ctx, svcCtx) item, err := logic.ProductDetail(&types.ProductDetailReq{Id: id}) require.NoError(t, err) assert.Empty(t, item.AppKey, "非超管不应看到AppKey") } // TC-0078: 超管可见AppKey func TestProductDetail_SuperAdminAppKeyVisible(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() code := testutil.UniqueId() now := time.Now().Unix() result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: code, Name: "detail_appkey_sa", AppKey: "visible_dk_" + code, AppSecret: "ds_" + code, Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) id, _ := result.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product`", id) }) logic := NewProductDetailLogic(ctx, svcCtx) item, err := logic.ProductDetail(&types.ProductDetailReq{Id: id}) require.NoError(t, err) assert.Equal(t, "visible_dk_"+code, item.AppKey, "超管应能看到AppKey") }