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" ) func insertTestProduct(t *testing.T, ctx context.Context) *productModel.SysProduct { t.Helper() 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: "test_key_" + code, AppSecret: "test_secret_" + 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) }) return &productModel.SysProduct{ Id: id, Code: code, Name: "待更新产品", AppKey: "test_key_" + code, AppSecret: "test_secret_" + code, Remark: "原始备注", Status: 1, CreateTime: now, UpdateTime: now, } } // TC-0076: 正常更新 func TestUpdateProduct_Success(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) p := insertTestProduct(t, ctx) logic := NewUpdateProductLogic(ctx, svcCtx) err := logic.UpdateProduct(&types.UpdateProductReq{ Id: p.Id, Name: "已更新名称", Remark: "已更新备注", Status: 2, }) require.NoError(t, err) updated, err := svcCtx.SysProductModel.FindOne(ctx, p.Id) require.NoError(t, err) assert.Equal(t, "已更新名称", updated.Name) assert.Equal(t, "已更新备注", updated.Remark) assert.Equal(t, int64(2), updated.Status) } // TC-0077: 不存在 func TestUpdateProduct_NotFound(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewUpdateProductLogic(ctx, svcCtx) err := logic.UpdateProduct(&types.UpdateProductReq{ Id: 999999999, Name: "不存在", }) 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-0078: 不传status func TestUpdateProduct_StatusZeroUnchanged(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) p := insertTestProduct(t, ctx) logic := NewUpdateProductLogic(ctx, svcCtx) err := logic.UpdateProduct(&types.UpdateProductReq{ Id: p.Id, Name: "新名称", Remark: "新备注", Status: 0, }) require.NoError(t, err) updated, err := svcCtx.SysProductModel.FindOne(ctx, p.Id) require.NoError(t, err) assert.Equal(t, "新名称", updated.Name) assert.Equal(t, "新备注", updated.Remark) assert.Equal(t, int64(1), updated.Status, "status should remain unchanged when req.Status is 0") } // TC-0536: updateProduct非超管拒绝 func TestUpdateProduct_NonSuperAdminRejected(t *testing.T) { ctx := ctxhelper.AdminCtx("test_product") svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewUpdateProductLogic(ctx, svcCtx) err := logic.UpdateProduct(&types.UpdateProductReq{Id: 1, Name: "test"}) require.Error(t, err) var ce *response.CodeError require.True(t, errors.As(err, &ce)) assert.Equal(t, 403, ce.Code()) } // TC-0090: updateProduct 非法状态值被拒绝(H-4修复验证) func TestUpdateProduct_InvalidStatusRejected(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) p := insertTestProduct(t, ctx) logic := NewUpdateProductLogic(ctx, svcCtx) invalid := []int64{3, 99, -1} for _, st := range invalid { err := logic.UpdateProduct(&types.UpdateProductReq{Id: p.Id, Status: st}) require.Error(t, err, "status=%d 应被拒绝", st) var ce *response.CodeError require.True(t, errors.As(err, &ce)) assert.Equal(t, 400, ce.Code()) } after, err := svcCtx.SysProductModel.FindOne(ctx, p.Id) require.NoError(t, err) assert.Equal(t, int64(1), after.Status, "非法状态不应落库") }