实现套餐生效条件覆盖与购买快照

This commit is contained in:
2026-07-22 20:51:12 +09:00
parent c7f8b4c702
commit 9818537239
30 changed files with 1092 additions and 149 deletions

View File

@@ -0,0 +1,54 @@
package postgres
import (
"testing"
"time"
"github.com/break/junhong_cmp_fiber/internal/model"
"github.com/break/junhong_cmp_fiber/internal/testutil"
"github.com/break/junhong_cmp_fiber/pkg/constants"
)
// TestPackageUsageRejectsNewEmptyTermsSnapshot 验证迁移约束拒绝上线后新增空计时快照。
func TestPackageUsageRejectsNewEmptyTermsSnapshot(t *testing.T) {
tx := testutil.NewPostgresTransaction(t)
usage := newTermsSnapshotTestUsage()
if err := tx.Create(usage).Error; err == nil {
t.Fatal("新增套餐使用记录缺少计时快照时必须被数据库拒绝")
}
}
// TestPackageUsageAcceptsCompleteTermsSnapshot 验证完整计时快照可与使用记录一次性落库。
func TestPackageUsageAcceptsCompleteTermsSnapshot(t *testing.T) {
tx := testutil.NewPostgresTransaction(t)
usage := newTermsSnapshotTestUsage()
usage.ExpiryBaseSnapshot = constants.PackageExpiryBaseFromPurchase
usage.CalendarTypeSnapshot = constants.PackageCalendarTypeByDay
usage.DurationDaysSnapshot = 30
if err := tx.Create(usage).Error; err != nil {
t.Fatalf("完整计时快照应可落库:%v", err)
}
}
// TestHistoricalPackageUsageWithoutTermsSnapshotCanUpdateStatus 验证历史空快照可继续状态流转。
func TestHistoricalPackageUsageWithoutTermsSnapshotCanUpdateStatus(t *testing.T) {
tx := testutil.NewPostgresTransaction(t)
var usage model.PackageUsage
if err := tx.Where("expiry_base_snapshot = '' AND calendar_type_snapshot = '' AND duration_months_snapshot = 0 AND duration_days_snapshot = 0").
First(&usage).Error; err != nil {
t.Skip("当前开发库没有历史空快照记录")
}
if err := tx.Model(&usage).Update("status", usage.Status).Error; err != nil {
t.Fatalf("历史空快照记录应可继续更新状态:%v", err)
}
}
func newTermsSnapshotTestUsage() *model.PackageUsage {
unique := uint(time.Now().UnixNano() & 0x7fffffff)
return &model.PackageUsage{
OrderID: unique, OrderNo: "UR55-SNAPSHOT-TEST", PackageID: unique,
UsageType: constants.AssetWalletResourceTypeIotCard, IotCardID: unique,
DataLimitMB: 1, Status: constants.PackageUsageStatusPending,
Priority: 1, PackageName: "UR55测试套餐", Generation: 1,
}
}