移除所有测试代码和测试要求
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
**变更说明**: - 删除所有 *_test.go 文件(单元测试、集成测试、验收测试、流程测试) - 删除整个 tests/ 目录 - 更新 CLAUDE.md:用"测试禁令"章节替换所有测试要求 - 删除测试生成 Skill (openspec-generate-acceptance-tests) - 删除测试生成命令 (opsx:gen-tests) - 更新 tasks.md:删除所有测试相关任务 **新规范**: - ❌ 禁止编写任何形式的自动化测试 - ❌ 禁止创建 *_test.go 文件 - ❌ 禁止在任务中包含测试相关工作 - ✅ 仅当用户明确要求时才编写测试 **原因**: 业务系统的正确性通过人工验证和生产环境监控保证,测试代码维护成本高于价值。 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,91 +0,0 @@
|
||||
package wechat
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// MockOfficialAccountService Mock 微信公众号服务(实现 OfficialAccountServiceInterface)
|
||||
type MockOfficialAccountService struct {
|
||||
GetUserInfoFn func(ctx context.Context, code string) (openID, unionID string, err error)
|
||||
GetUserInfoDetailedFn func(ctx context.Context, code string) (*UserInfo, error)
|
||||
GetUserInfoByTokenFn func(ctx context.Context, accessToken, openID string) (*UserInfo, error)
|
||||
}
|
||||
|
||||
// GetUserInfo Mock 实现
|
||||
func (m *MockOfficialAccountService) GetUserInfo(ctx context.Context, code string) (openID, unionID string, err error) {
|
||||
if m.GetUserInfoFn != nil {
|
||||
return m.GetUserInfoFn(ctx, code)
|
||||
}
|
||||
return "", "", nil
|
||||
}
|
||||
|
||||
// GetUserInfoDetailed Mock 实现
|
||||
func (m *MockOfficialAccountService) GetUserInfoDetailed(ctx context.Context, code string) (*UserInfo, error) {
|
||||
if m.GetUserInfoDetailedFn != nil {
|
||||
return m.GetUserInfoDetailedFn(ctx, code)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// GetUserInfoByToken Mock 实现
|
||||
func (m *MockOfficialAccountService) GetUserInfoByToken(ctx context.Context, accessToken, openID string) (*UserInfo, error) {
|
||||
if m.GetUserInfoByTokenFn != nil {
|
||||
return m.GetUserInfoByTokenFn(ctx, accessToken, openID)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// MockPaymentService Mock 微信支付服务(实现 PaymentServiceInterface)
|
||||
type MockPaymentService struct {
|
||||
CreateJSAPIOrderFn func(ctx context.Context, orderNo, description, openID string, amount int) (*JSAPIPayResult, error)
|
||||
CreateH5OrderFn func(ctx context.Context, orderNo, description string, amount int, sceneInfo *H5SceneInfo) (*H5PayResult, error)
|
||||
QueryOrderFn func(ctx context.Context, orderNo string) (*OrderInfo, error)
|
||||
CloseOrderFn func(ctx context.Context, orderNo string) error
|
||||
HandlePaymentNotifyFn func(r *http.Request, callback PaymentNotifyCallback) (*http.Response, error)
|
||||
}
|
||||
|
||||
// CreateJSAPIOrder Mock 实现
|
||||
func (m *MockPaymentService) CreateJSAPIOrder(ctx context.Context, orderNo, description, openID string, amount int) (*JSAPIPayResult, error) {
|
||||
if m.CreateJSAPIOrderFn != nil {
|
||||
return m.CreateJSAPIOrderFn(ctx, orderNo, description, openID, amount)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// CreateH5Order Mock 实现
|
||||
func (m *MockPaymentService) CreateH5Order(ctx context.Context, orderNo, description string, amount int, sceneInfo *H5SceneInfo) (*H5PayResult, error) {
|
||||
if m.CreateH5OrderFn != nil {
|
||||
return m.CreateH5OrderFn(ctx, orderNo, description, amount, sceneInfo)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// QueryOrder Mock 实现
|
||||
func (m *MockPaymentService) QueryOrder(ctx context.Context, orderNo string) (*OrderInfo, error) {
|
||||
if m.QueryOrderFn != nil {
|
||||
return m.QueryOrderFn(ctx, orderNo)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// CloseOrder Mock 实现
|
||||
func (m *MockPaymentService) CloseOrder(ctx context.Context, orderNo string) error {
|
||||
if m.CloseOrderFn != nil {
|
||||
return m.CloseOrderFn(ctx, orderNo)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// HandlePaymentNotify Mock 实现(简化版)
|
||||
func (m *MockPaymentService) HandlePaymentNotify(r *http.Request, callback PaymentNotifyCallback) (*http.Response, error) {
|
||||
if m.HandlePaymentNotifyFn != nil {
|
||||
return m.HandlePaymentNotifyFn(r, callback)
|
||||
}
|
||||
return &http.Response{StatusCode: 200}, nil
|
||||
}
|
||||
|
||||
var (
|
||||
_ OfficialAccountServiceInterface = (*MockOfficialAccountService)(nil)
|
||||
_ PaymentServiceInterface = (*MockPaymentService)(nil)
|
||||
)
|
||||
@@ -1,76 +0,0 @@
|
||||
package wechat
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func TestOfficialAccountService_ParameterValidation(t *testing.T) {
|
||||
logger := zap.NewNop()
|
||||
mockSvc := &MockOfficialAccountService{}
|
||||
|
||||
t.Run("GetUserInfo_空授权码", func(t *testing.T) {
|
||||
mockSvc.GetUserInfoFn = func(ctx context.Context, code string) (string, string, error) {
|
||||
if code == "" {
|
||||
return "", "", errors.New(errors.CodeInvalidParam, "授权码不能为空")
|
||||
}
|
||||
return "openid_123", "unionid_123", nil
|
||||
}
|
||||
|
||||
openID, unionID, err := mockSvc.GetUserInfo(context.Background(), "")
|
||||
require.Error(t, err)
|
||||
appErr, ok := err.(*errors.AppError)
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, errors.CodeInvalidParam, appErr.Code)
|
||||
assert.Empty(t, openID)
|
||||
assert.Empty(t, unionID)
|
||||
})
|
||||
|
||||
t.Run("GetUserInfo_成功", func(t *testing.T) {
|
||||
mockSvc.GetUserInfoFn = func(ctx context.Context, code string) (string, string, error) {
|
||||
return "openid_123", "unionid_123", nil
|
||||
}
|
||||
|
||||
openID, unionID, err := mockSvc.GetUserInfo(context.Background(), "valid_code")
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "openid_123", openID)
|
||||
assert.Equal(t, "unionid_123", unionID)
|
||||
})
|
||||
|
||||
t.Run("GetUserInfoDetailed_空授权码", func(t *testing.T) {
|
||||
mockSvc.GetUserInfoDetailedFn = func(ctx context.Context, code string) (*UserInfo, error) {
|
||||
if code == "" {
|
||||
return nil, errors.New(errors.CodeInvalidParam, "授权码不能为空")
|
||||
}
|
||||
return &UserInfo{OpenID: "openid_123"}, nil
|
||||
}
|
||||
|
||||
userInfo, err := mockSvc.GetUserInfoDetailed(context.Background(), "")
|
||||
require.Error(t, err)
|
||||
assert.Nil(t, userInfo)
|
||||
})
|
||||
|
||||
t.Run("GetUserInfoByToken_空参数", func(t *testing.T) {
|
||||
mockSvc.GetUserInfoByTokenFn = func(ctx context.Context, accessToken, openID string) (*UserInfo, error) {
|
||||
if accessToken == "" || openID == "" {
|
||||
return nil, errors.New(errors.CodeInvalidParam, "AccessToken 和 OpenID 不能为空")
|
||||
}
|
||||
return &UserInfo{OpenID: openID}, nil
|
||||
}
|
||||
|
||||
userInfo, err := mockSvc.GetUserInfoByToken(context.Background(), "", "openid_123")
|
||||
require.Error(t, err)
|
||||
assert.Nil(t, userInfo)
|
||||
|
||||
userInfo, err = mockSvc.GetUserInfoByToken(context.Background(), "token_123", "")
|
||||
require.Error(t, err)
|
||||
assert.Nil(t, userInfo)
|
||||
})
|
||||
|
||||
_ = logger
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
package wechat
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func TestPaymentService_ParameterValidation(t *testing.T) {
|
||||
logger := zap.NewNop()
|
||||
mockSvc := &MockPaymentService{}
|
||||
|
||||
t.Run("CreateJSAPIOrder_参数验证", func(t *testing.T) {
|
||||
mockSvc.CreateJSAPIOrderFn = func(ctx context.Context, orderNo, description, openID string, amount int) (*JSAPIPayResult, error) {
|
||||
if orderNo == "" || openID == "" || amount <= 0 {
|
||||
return nil, errors.New(errors.CodeInvalidParam, "订单号、OpenID 和金额不能为空")
|
||||
}
|
||||
return &JSAPIPayResult{PrepayID: "prepay_id_123"}, nil
|
||||
}
|
||||
|
||||
_, err := mockSvc.CreateJSAPIOrder(context.Background(), "", "desc", "openid", 100)
|
||||
require.Error(t, err)
|
||||
|
||||
_, err = mockSvc.CreateJSAPIOrder(context.Background(), "order_123", "desc", "", 100)
|
||||
require.Error(t, err)
|
||||
|
||||
_, err = mockSvc.CreateJSAPIOrder(context.Background(), "order_123", "desc", "openid", 0)
|
||||
require.Error(t, err)
|
||||
|
||||
result, err := mockSvc.CreateJSAPIOrder(context.Background(), "order_123", "desc", "openid", 100)
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, result)
|
||||
assert.Equal(t, "prepay_id_123", result.PrepayID)
|
||||
})
|
||||
|
||||
t.Run("CreateH5Order_参数验证", func(t *testing.T) {
|
||||
mockSvc.CreateH5OrderFn = func(ctx context.Context, orderNo, description string, amount int, sceneInfo *H5SceneInfo) (*H5PayResult, error) {
|
||||
if orderNo == "" || amount <= 0 {
|
||||
return nil, errors.New(errors.CodeInvalidParam, "订单号和金额不能为空")
|
||||
}
|
||||
return &H5PayResult{H5URL: "https://wx.tenpay.com/..."}, nil
|
||||
}
|
||||
|
||||
_, err := mockSvc.CreateH5Order(context.Background(), "", "desc", 100, nil)
|
||||
require.Error(t, err)
|
||||
|
||||
_, err = mockSvc.CreateH5Order(context.Background(), "order_123", "desc", 0, nil)
|
||||
require.Error(t, err)
|
||||
|
||||
result, err := mockSvc.CreateH5Order(context.Background(), "order_123", "desc", 100, nil)
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, result)
|
||||
assert.NotEmpty(t, result.H5URL)
|
||||
})
|
||||
|
||||
t.Run("QueryOrder_参数验证", func(t *testing.T) {
|
||||
mockSvc.QueryOrderFn = func(ctx context.Context, orderNo string) (*OrderInfo, error) {
|
||||
if orderNo == "" {
|
||||
return nil, errors.New(errors.CodeInvalidParam, "订单号不能为空")
|
||||
}
|
||||
return &OrderInfo{OutTradeNo: orderNo}, nil
|
||||
}
|
||||
|
||||
_, err := mockSvc.QueryOrder(context.Background(), "")
|
||||
require.Error(t, err)
|
||||
|
||||
result, err := mockSvc.QueryOrder(context.Background(), "order_123")
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, result)
|
||||
assert.Equal(t, "order_123", result.OutTradeNo)
|
||||
})
|
||||
|
||||
t.Run("CloseOrder_参数验证", func(t *testing.T) {
|
||||
mockSvc.CloseOrderFn = func(ctx context.Context, orderNo string) error {
|
||||
if orderNo == "" {
|
||||
return errors.New(errors.CodeInvalidParam, "订单号不能为空")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
err := mockSvc.CloseOrder(context.Background(), "")
|
||||
require.Error(t, err)
|
||||
|
||||
err = mockSvc.CloseOrder(context.Background(), "order_123")
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
_ = logger
|
||||
}
|
||||
Reference in New Issue
Block a user