package application import ( "fmt" "strings" "testing" ) func TestPaymentConfigDisabledDoesNotRequireCredentials(t *testing.T) { c, err := paymentConfig(func(string) string { return "" }, nil) if err != nil || c.Enabled { t.Fatalf("config=%+v err=%v", c, err) } } func TestPaymentConfigLoadsOnlyServerCredentialsAndValidatesLimits(t *testing.T) { values := map[string]string{ "WECHAT_PAY_ENABLED": "true", "WECHAT_PAY_MCH_ID": "merchant", "WECHAT_PAY_APP_ID": "wxapp", "WECHAT_PAY_NOTIFY_URL": "https://pay.example.test/api/payments/wechat/notify", "WECHAT_PAY_MERCHANT_SERIAL": "serial", "WECHAT_PAY_API_V3_KEY": strings.Repeat("a", 32), "WECHAT_PAY_PUBLIC_KEY_ID": "PUB_KEY_ID_test", "WECHAT_PAY_PRIVATE_KEY_FILE": "/private/key.pem", "WECHAT_PAY_PUBLIC_KEY_PEM": "PUBLIC\\nKEY", "WECHAT_PAY_MIN_AMOUNT_FEN": "1", "WECHAT_PAY_PRESET_AMOUNTS_FEN": "1,10000,50000", } read := func(path string) ([]byte, error) { if path != "/private/key.pem" { return nil, fmt.Errorf("unexpected file") } return []byte("PRIVATE"), nil } c, err := paymentConfig(func(key string) string { return values[key] }, read) if err != nil || c.MinAmountFen != 1 || c.PrivateKeyPEM != "PRIVATE" || c.WechatPublicKeyPEM != "PUBLIC\nKEY" || len(c.PresetAmountsFen) != 3 { t.Fatalf("config load err=%v", err) } for _, test := range []struct{ key, value string }{ {"WECHAT_PAY_NOTIFY_URL", "http://pay.example.test/api/payments/wechat/notify"}, {"WECHAT_PAY_NOTIFY_URL", "https://user:secret@pay.example.test/api/payments/wechat/notify"}, {"WECHAT_PAY_API_V3_KEY", "secret"}, {"WECHAT_PAY_MAX_AMOUNT_FEN", "1000001"}, {"WECHAT_PAY_PRESET_AMOUNTS_FEN", "100,100"}, {"WECHAT_PAY_PRESET_AMOUNTS_FEN", "1.50"}, } { old := values[test.key] values[test.key] = test.value _, err := paymentConfig(func(key string) string { return values[key] }, read) values[test.key] = old if err == nil || strings.Contains(err.Error(), "user:secret") { t.Fatalf("key=%s err=%v", test.key, err) } } }