package order import ( "testing" "hfb_sys/backend/internal/model" "gorm.io/datatypes" ) func TestCalculateInsuranceFeeCent(t *testing.T) { tests := []struct { name string ownerCent int64 bps int want int64 }{ {name: "普通赔付不收费", ownerCent: 10000, bps: 0, want: 0}, {name: "普通保险百分之八", ownerCent: 10000, bps: 800, want: 800}, {name: "极品保险百分之四", ownerCent: 10000, bps: 400, want: 400}, {name: "四舍五入到分", ownerCent: 12345, bps: 800, want: 988}, {name: "服务费不超过到手租金", ownerCent: 100, bps: 10000, want: 100}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := calculateInsuranceFeeCent(tt.ownerCent, tt.bps); got != tt.want { t.Fatalf("calculateInsuranceFeeCent() = %d, want %d", got, tt.want) } }) } } func TestCalculateCheckoutSettlementDeductsPremiumInsuranceFee(t *testing.T) { order := model.RentalOrder{ RentAmountCent: 38300, OwnerRentAmountCent: 35300, DepositAmountCent: 15000, InsuranceFeeBps: 400, AccountSnapshot: datatypes.JSON([]byte(`{ "haf_coin_amount": 100000000, "asset_summary": { "price_breakdown": { "buyer_coin_base_price": 263, "seller_coin_base_price": 233, "consumable_price": 120 } } }`)), } settlement := calculateCheckoutSettlement(order, 12000, 100, 0) if settlement.InsuranceFeeBps != 400 || settlement.InsuranceFeeCent != 932 { t.Fatalf("保险费用快照不正确: bps=%d fee=%d", settlement.InsuranceFeeBps, settlement.InsuranceFeeCent) } if settlement.OwnerRentIncomeCent != 34368 { t.Fatalf("号主净租金 = %d, want 34368", settlement.OwnerRentIncomeCent) } if settlement.PlatformFeeCent != 3932 { t.Fatalf("平台收入 = %d, want 3932", settlement.PlatformFeeCent) } } func TestCalculateCheckoutSettlementUsesActualPureCoinAsInsuranceBase(t *testing.T) { order := model.RentalOrder{ RentAmountCent: 25000, OwnerRentAmountCent: 25000, DepositAmountCent: 15000, InsuranceFeeBps: 800, AccountSnapshot: datatypes.JSON([]byte(`{ "haf_coin_amount": 100000000, "asset_summary": { "price_breakdown": { "buyer_ratio": 40, "seller_ratio": 40, "buyer_coin_base_price": 250, "seller_coin_base_price": 250, "consumable_price": 0 } } }`)), } settlement := calculateCheckoutSettlement(order, 5000, 50, 0) if settlement.PureCoinAmountCent != 12500 { t.Fatalf("实际纯币原价 = %d, want 12500", settlement.PureCoinAmountCent) } if settlement.InsuranceFeeCent != 1000 { t.Fatalf("保险费用 = %d, want 1000", settlement.InsuranceFeeCent) } if settlement.ExtraItemAmountCent != 5000 { t.Fatalf("额外物品 = %d, want 5000", settlement.ExtraItemAmountCent) } if settlement.OwnerRentIncomeCent != 16500 { t.Fatalf("号主净租金 = %d, want 16500", settlement.OwnerRentIncomeCent) } }