修复 code review 问题:提取重复函数、补全缺失测试用例
- 提取 ResolveTermsFromTx 到 service/package,消除 order 和 auto_purchase 中的重复实现 - 补全 domain 测试:新增 from_activation 覆盖用例,现覆盖两种覆盖值 - 补全激活集成测试:新增 from_purchase 立即激活场景、历史记录兼容回退计数器验证 - 补全自动购包集成测试:新增购买后修改套餐配置不影响已有快照的验证 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -703,21 +703,8 @@ func (h *AutoPurchaseHandler) activateAddonPackage(
|
||||
return tx.Create(usage).Error
|
||||
}
|
||||
|
||||
// resolvePackageTerms 在给定事务内查询分配覆盖并解析计时条款快照。
|
||||
// 必须在事务内调用,确保分配读取与 PackageUsage 写入在同一连接,避免快照与提交值不一致。
|
||||
func (h *AutoPurchaseHandler) resolvePackageTerms(ctx context.Context, tx *gorm.DB, pkg *model.Package, sellerShopID *uint) (packagedomain.TermsSnapshot, error) {
|
||||
var allocation *model.ShopPackageAllocation
|
||||
if sellerShopID != nil && *sellerShopID > 0 {
|
||||
store := postgres.NewShopPackageAllocationStore(tx)
|
||||
found, err := store.GetByShopAndPackageForSystem(ctx, *sellerShopID, pkg.ID)
|
||||
if err != nil && err != gorm.ErrRecordNotFound {
|
||||
return packagedomain.TermsSnapshot{}, pkgerrors.Wrap(pkgerrors.CodeDatabaseError, err, "查询套餐分配失败")
|
||||
}
|
||||
if err == nil {
|
||||
allocation = found
|
||||
}
|
||||
}
|
||||
return packagedomain.ResolveTermsSnapshot(pkg, allocation)
|
||||
return packagepkg.ResolveTermsFromTx(ctx, tx, pkg, sellerShopID)
|
||||
}
|
||||
|
||||
func parseLinkedPackageIDs(raw []byte) ([]uint, error) {
|
||||
|
||||
@@ -136,6 +136,30 @@ func TestAutoPurchaseTransactionRollbackOnInvalidAddonTerms(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestAutoPurchaseConfigChangeDoesNotModifySnapshot 验证自动购包后修改套餐配置不改变已有使用记录的计时快照。
|
||||
func TestAutoPurchaseConfigChangeDoesNotModifySnapshot(t *testing.T) {
|
||||
tx := testutil.NewPostgresTransaction(t)
|
||||
card := createAutoPurchaseCard(t, tx, constants.RealNameStatusVerified)
|
||||
pkg := createAutoPurchasePackage(t, tx, constants.PackageTypeFormal, constants.PackageExpiryBaseFromPurchase, 30)
|
||||
handler := &AutoPurchaseHandler{db: tx, shopPackageAllocationStore: postgres.NewShopPackageAllocationStore(tx), logger: zap.NewNop()}
|
||||
order := newAutoPurchaseOrder(card.ID, nil)
|
||||
if err := handler.activateMainPackage(context.Background(), tx, order, pkg, constants.AssetWalletResourceTypeIotCard, card.ID, time.Now()); err != nil {
|
||||
t.Fatalf("自动购包创建主套餐失败:%v", err)
|
||||
}
|
||||
// 购买后修改套餐的生效条件和时长
|
||||
if err := tx.Model(pkg).Updates(map[string]any{"expiry_base": constants.PackageExpiryBaseFromActivation, "duration_days": 99}).Error; err != nil {
|
||||
t.Fatalf("修改套餐配置失败:%v", err)
|
||||
}
|
||||
var usage model.PackageUsage
|
||||
if err := tx.Where("order_id = ? AND package_id = ?", order.ID, pkg.ID).First(&usage).Error; err != nil {
|
||||
t.Fatalf("查询自动购包记录失败:%v", err)
|
||||
}
|
||||
// 快照应保留购买时的值,不随套餐修改而变化
|
||||
if usage.ExpiryBaseSnapshot != constants.PackageExpiryBaseFromPurchase || usage.DurationDaysSnapshot != 30 {
|
||||
t.Fatalf("套餐配置变更不应影响已购买快照:expiryBase=%s days=%d", usage.ExpiryBaseSnapshot, usage.DurationDaysSnapshot)
|
||||
}
|
||||
}
|
||||
|
||||
func createAutoPurchaseCard(t *testing.T, tx *gorm.DB, realnameStatus int) *model.IotCard {
|
||||
t.Helper()
|
||||
suffix := strconv.FormatInt(time.Now().UnixNano()%100000000000000000, 10)
|
||||
|
||||
Reference in New Issue
Block a user