package product import ( "context" "testing" "time" productModel "perms-system-server/internal/model/product" "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-0053: 正常分页 func TestProductList_Normal(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() now := time.Now().Unix() var ids []int64 for i := 0; i < 3; i++ { code := testutil.UniqueId() result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: code, Name: "列表测试产品", AppKey: "k_" + code, AppSecret: "s_" + code, Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) id, _ := result.LastInsertId() ids = append(ids, id) } t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product`", ids...) }) logic := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: 1, PageSize: 10}) require.NoError(t, err) require.NotNil(t, resp) assert.True(t, resp.Total >= 3) items, ok := resp.List.([]types.ProductItem) require.True(t, ok) assert.True(t, len(items) >= 3) } // TC-0054: 默认分页 func TestProductList_DefaultPagination(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: 0, PageSize: 0}) require.NoError(t, err) require.NotNil(t, resp) items, ok := resp.List.([]types.ProductItem) require.True(t, ok) assert.True(t, len(items) <= 20, "default pageSize should be 20") } // TC-0055: pageSize超过上限 func TestProductList_PageSizeExceedsLimit(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: 1, PageSize: 500}) require.NoError(t, err) require.NotNil(t, resp) items, ok := resp.List.([]types.ProductItem) require.True(t, ok) assert.True(t, len(items) <= 100, "pageSize should be capped at 100") } // TC-0056: pageSize=0 func TestProductList_PageSizeZero_DefaultsTo20(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: 1, PageSize: 0}) require.NoError(t, err) require.NotNil(t, resp) items, ok := resp.List.([]types.ProductItem) require.True(t, ok) assert.True(t, len(items) <= 20, "default pageSize should be 20") } // TC-0057: page负值 func TestProductList_NegativePage_DefaultsTo1(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: -1, PageSize: 10}) require.NoError(t, err) require.NotNil(t, resp) } // TC-0526: 非超管AppKey隐藏 func TestProductList_NonSuperAdminAppKeyHidden(t *testing.T) { ctx := ctxhelper.MemberCtx("test_product") svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() now := time.Now().Unix() code := testutil.UniqueId() result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: code, Name: "appkey_test", AppKey: "secret_key_" + code, AppSecret: "s_" + 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 := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: 1, PageSize: 100}) require.NoError(t, err) items, ok := resp.List.([]types.ProductItem) require.True(t, ok) for _, item := range items { if item.Id == id { assert.Empty(t, item.AppKey, "非超管不应看到AppKey") return } } t.Fatal("未找到插入的测试产品") } // TC-0527: 超管可见AppKey func TestProductList_SuperAdminAppKeyVisible(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() now := time.Now().Unix() code := testutil.UniqueId() result, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: code, Name: "appkey_test_sa", AppKey: "visible_key_" + code, AppSecret: "s_" + 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 := NewProductListLogic(ctx, svcCtx) resp, err := logic.ProductList(&types.ProductListReq{Page: 1, PageSize: 100}) require.NoError(t, err) items, ok := resp.List.([]types.ProductItem) require.True(t, ok) for _, item := range items { if item.Id == id { assert.Equal(t, "visible_key_"+code, item.AppKey, "超管应能看到AppKey") return } } t.Fatal("未找到插入的测试产品") }