Files
zeekay 7d727874d5 chore: rebrand Formance Payments -> Hanzo Payments (hanzo-fi)
- go.mod module path + all self-imports: github.com/formancehq/payments -> github.com/hanzo-fi/payments
  (1590 .go files / 3152 refs; 20 modules: root, pkg/client, pkg/domain, 18 ce/plugins).
  External dep kept: formancehq/go-libs.
- plugins: each ce/plugins/* consumed a *published* pkg/domain; added local
  'replace .../pkg/domain => ../../../pkg/domain' (consistent with root) so every
  standalone plugin module builds in-monorepo. compile-plugin.sh MOD var rebranded too.
- branding: README, LICENSE (dual MIT+EE; upstream copyright retained + Hanzo added),
  goreleaser (release images -> registry.hanzo.ai/hanzo-fi, OCI labels, homepage),
  proto go_package, renovate, speakeasy gen.yaml, connector-template *.gotpl.
- CI: removed Numary/Formance workflows + composite action; added canonical hanzo.yml +
  cicd.yml (hanzoai/ci, gated HANZO_CI_ENABLED) + secretless ci.yml (go build/vet).
- kept as data/compat keys: wire capability enums ALLOW_FORMANCE_*, generated SDK type
  client.Formance, domain field FormanceRedirectURL, OTEL_SERVICE_NAME, upstream base image.
- verified: go build ./... (default + -tags ee) + all 20 nested modules green.
2026-07-05 13:08:55 -07:00

250 lines
6.9 KiB
Go

package bankingbridge_test
import (
"testing"
"github.com/hanzo-fi/payments/ee/plugins/bankingbridge"
"github.com/hanzo-fi/payments/pkg/domain/models"
"github.com/stretchr/testify/assert"
)
func TestPaymentSchemeAndType(t *testing.T) {
t.Parallel()
tests := []struct {
name string
code string
expectedScheme models.PaymentScheme
expectedType models.PaymentType
}{
{
name: "Unknown code",
code: "UNKNOWN.SCHEME",
expectedScheme: models.PAYMENT_SCHEME_UNKNOWN,
expectedType: models.PAYMENT_TYPE_UNKNOWN,
},
{
name: "Not in PMNT domain",
code: "ACMT.MCOP.INTR",
expectedScheme: models.PAYMENT_SCHEME_OTHER,
expectedType: models.PAYMENT_TYPE_OTHER,
},
{
name: "Customer card transaction with cash deposit",
code: "PMNT.CCRD.CDPT",
expectedScheme: models.PAYMENT_SCHEME_OTHER,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Merchant card transaction with POS payment",
code: "PMNT.MCRD.POSC",
expectedScheme: models.PAYMENT_SCHEME_OTHER,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Issued cheques",
code: "PMNT.ICHQ.CCHQ",
expectedScheme: models.PAYMENT_SCHEME_A2A,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Received cheques",
code: "PMNT.RCHQ.CCHQ",
expectedScheme: models.PAYMENT_SCHEME_A2A,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Received cheques unpaid",
code: "PMNT.RCHQ.UPCQ",
expectedScheme: models.PAYMENT_SCHEME_A2A,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Drafts",
code: "PMNT.DRFT.STAM",
expectedScheme: models.PAYMENT_SCHEME_A2A,
expectedType: models.PAYMENT_TYPE_TRANSFER,
},
{
name: "Issued b2b direct debit",
code: "PMNT.IDDT.BBDD",
expectedScheme: models.PAYMENT_SCHEME_SEPA_DEBIT,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Issued core direct debit",
code: "PMNT.IDDT.ESDD",
expectedScheme: models.PAYMENT_SCHEME_SEPA_DEBIT,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Issued direct debits reversal",
code: "PMNT.IDDT.PRDD",
expectedScheme: models.PAYMENT_SCHEME_SEPA_DEBIT,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Received b2b direct debit",
code: "PMNT.RDDT.BBDD",
expectedScheme: models.PAYMENT_SCHEME_SEPA_DEBIT,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Received core direct debit",
code: "PMNT.RDDT.ESDD",
expectedScheme: models.PAYMENT_SCHEME_SEPA_DEBIT,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Received direct debits unpaid",
code: "PMNT.RDDT.UPDD",
expectedScheme: models.PAYMENT_SCHEME_SEPA_DEBIT,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Issued credit transfers SEPA",
code: "PMNT.ICDT.ESCT",
expectedScheme: models.PAYMENT_SCHEME_SEPA_CREDIT,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Received credit transfers SEPA",
code: "PMNT.RCDT.ESCT",
expectedScheme: models.PAYMENT_SCHEME_SEPA_CREDIT,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Received credit transfers reversal",
code: "PMNT.RCDT.RRTN",
expectedScheme: models.PAYMENT_SCHEME_A2A,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
{
name: "Zero balancing treasury management",
code: "CAMT.ACCB.ZABA",
expectedScheme: models.PAYMENT_SCHEME_A2A,
expectedType: models.PAYMENT_TYPE_TRANSFER,
},
{
name: "Miscellaneous credit",
code: "PMNT.MCOP.OTHR",
expectedScheme: models.PAYMENT_SCHEME_OTHER,
expectedType: models.PAYMENT_TYPE_PAYIN,
},
{
name: "Miscellaneous debit",
code: "PMNT.MDOP.IADD",
expectedScheme: models.PAYMENT_SCHEME_OTHER,
expectedType: models.PAYMENT_TYPE_PAYOUT,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
scheme, paymentType := bankingbridge.PaymentSchemeAndType(tt.code)
assert.Equal(t, tt.expectedScheme, scheme)
assert.Equal(t, tt.expectedType, paymentType)
})
}
}
func TestPaymentStatus(t *testing.T) {
t.Parallel()
tests := []struct {
name string
code string
isReversal bool
expectedStatus models.PaymentStatus
}{
{
name: "invalid code format",
code: "PMNT.RCDT",
expectedStatus: models.PAYMENT_STATUS_SUCCEEDED,
},
{
name: "invalid code format reversal",
code: "",
isReversal: true,
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "non-PMNT domain",
code: "ACMT.MCOP.INTR",
expectedStatus: models.PAYMENT_STATUS_OTHER,
},
{
name: "reversal return",
code: "PMNT.RCDT.RRTN",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "crossborder return",
code: "PMNT.RCDT.XRTN",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "direct debit reversal",
code: "PMNT.IDDT.PRDD",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "direct debit unpaid",
code: "PMNT.IDDT.UPDD",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "reversal payment cancellation",
code: "PMNT.ICDT.RPCR",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "reimbursement",
code: "PMNT.CCRD.RIMB",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "unpaid dishonored draft",
code: "PMNT.DRFT.UDFT",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "unpaid cheque",
code: "PMNT.RCHQ.UPCQ",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "unpaid card transaction",
code: "PMNT.CCRD.UPCT",
expectedStatus: models.PAYMENT_STATUS_REFUNDED,
},
{
name: "debit adjustment",
code: "PMNT.MDOP.DAJT",
expectedStatus: models.PAYMENT_STATUS_AMOUNT_ADJUSTMENT,
},
{
name: "normal SEPA credit transfer",
code: "PMNT.RCDT.ESCT",
expectedStatus: models.PAYMENT_STATUS_SUCCEEDED,
},
{
name: "normal direct debit",
code: "PMNT.IDDT.BBDD",
expectedStatus: models.PAYMENT_STATUS_SUCCEEDED,
},
{
name: "Zero balancing treasury management",
code: "CAMT.ACCB.ZABA",
expectedStatus: models.PAYMENT_STATUS_SUCCEEDED,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
status := bankingbridge.PaymentStatus(tt.code, tt.isReversal)
assert.Equal(t, tt.expectedStatus, status)
})
}
}