移除所有测试代码和测试要求
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:
2026-02-11 17:13:42 +08:00
parent 804145332b
commit 353621d923
218 changed files with 11787 additions and 41983 deletions

View File

@@ -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)
)

View File

@@ -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
}

View File

@@ -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
}