Add a full payment and subscription system supporting EasyPay (Alipay/WeChat), Stripe, and direct Alipay/WeChat Pay providers with multi-instance load balancing.
112 lines
2.3 KiB
Go
112 lines
2.3 KiB
Go
package payment
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestCalculatePayAmount(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
amount float64
|
|
feeRate float64
|
|
expected string
|
|
}{
|
|
{
|
|
name: "zero fee rate returns same amount",
|
|
amount: 100.00,
|
|
feeRate: 0,
|
|
expected: "100.00",
|
|
},
|
|
{
|
|
name: "negative fee rate returns same amount",
|
|
amount: 50.00,
|
|
feeRate: -5,
|
|
expected: "50.00",
|
|
},
|
|
{
|
|
name: "1 percent fee rate",
|
|
amount: 100.00,
|
|
feeRate: 1,
|
|
expected: "101.00",
|
|
},
|
|
{
|
|
name: "5 percent fee on 200",
|
|
amount: 200.00,
|
|
feeRate: 5,
|
|
expected: "210.00",
|
|
},
|
|
{
|
|
name: "fee rounds UP to 2 decimal places",
|
|
amount: 100.00,
|
|
feeRate: 3,
|
|
expected: "103.00",
|
|
},
|
|
{
|
|
name: "fee rounds UP small remainder",
|
|
amount: 10.00,
|
|
feeRate: 3.33,
|
|
expected: "10.34", // 10 * 3.33 / 100 = 0.333 -> round up -> 0.34
|
|
},
|
|
{
|
|
name: "very small amount",
|
|
amount: 0.01,
|
|
feeRate: 1,
|
|
expected: "0.02", // 0.01 * 1/100 = 0.0001 -> round up -> 0.01 -> total 0.02
|
|
},
|
|
{
|
|
name: "large amount",
|
|
amount: 99999.99,
|
|
feeRate: 10,
|
|
expected: "109999.99", // 99999.99 * 10/100 = 9999.999 -> round up -> 10000.00 -> total 109999.99
|
|
},
|
|
{
|
|
name: "100 percent fee rate doubles amount",
|
|
amount: 50.00,
|
|
feeRate: 100,
|
|
expected: "100.00",
|
|
},
|
|
{
|
|
name: "precision 0.01 fee difference",
|
|
amount: 100.00,
|
|
feeRate: 1.01,
|
|
expected: "101.01", // 100 * 1.01/100 = 1.01
|
|
},
|
|
{
|
|
name: "precision 0.02 fee",
|
|
amount: 100.00,
|
|
feeRate: 1.02,
|
|
expected: "101.02",
|
|
},
|
|
{
|
|
name: "zero amount with positive fee",
|
|
amount: 0,
|
|
feeRate: 5,
|
|
expected: "0.00",
|
|
},
|
|
{
|
|
name: "fractional amount no fee",
|
|
amount: 19.99,
|
|
feeRate: 0,
|
|
expected: "19.99",
|
|
},
|
|
{
|
|
name: "fractional fee that causes rounding up",
|
|
amount: 33.33,
|
|
feeRate: 7.77,
|
|
expected: "35.92", // 33.33 * 7.77 / 100 = 2.589741 -> round up -> 2.59 -> total 35.92
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
got := CalculatePayAmount(tt.amount, tt.feeRate)
|
|
if got != tt.expected {
|
|
t.Fatalf("CalculatePayAmount(%v, %v) = %q, want %q", tt.amount, tt.feeRate, got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|