Files
payments/internal/models/accounts_test.go
devin-ai-integration[bot]GitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>[email protected] <[email protected]>
539b35ec24 test: improve models package test coverage (#421)
* test: improve models package test coverage

Co-Authored-By: [email protected] <[email protected]>

* test: add tests for errors and payment initiation reversals

Co-Authored-By: [email protected] <[email protected]>

* fix: correct struct field references in payment_initiation_reversals_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix TestNonRetryableError and TestPaymentInitiationReversalUnmarshalJSON

Co-Authored-By: [email protected] <[email protected]>

* test: add tests for balances package to improve coverage

Co-Authored-By: [email protected] <[email protected]>

* test: add tests for payment initiations and reversal adjustments

Co-Authored-By: [email protected] <[email protected]>

* fix: correct struct field references in test files

Co-Authored-By: [email protected] <[email protected]>

* fix: update assertions in payment initiations tests

Co-Authored-By: [email protected] <[email protected]>

* fix: update variable names in payment initiations tests

Co-Authored-By: [email protected] <[email protected]>

* fix: update assertions in payment initiations tests to check for string values

Co-Authored-By: [email protected] <[email protected]>

* test: add tests for bank accounts, capabilities, config, and payment initiation adjustments

Co-Authored-By: [email protected] <[email protected]>

* fix: remove unused imports in test files

Co-Authored-By: [email protected] <[email protected]>

* test: fix test expectations to match implementation

Co-Authored-By: [email protected] <[email protected]>

* test: remove unused variable in config_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix capabilities test to handle string inputs correctly

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertion in capabilities test

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertion in capabilities test

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertion in capabilities test

Co-Authored-By: [email protected] <[email protected]>

* test: fix TestBankAccountIdempotencyKey to use fixed UUID

Co-Authored-By: [email protected] <[email protected]>

* test: fix TestBankAccountIdempotencyKey to use exact expected hash value

Co-Authored-By: [email protected] <[email protected]>

* fix: rename misspelled test file name

Co-Authored-By: [email protected] <[email protected]>

* fix: rename misspelled source file name

Co-Authored-By: [email protected] <[email protected]>

* fix: remove unused import in test file

Co-Authored-By: [email protected] <[email protected]>

* fix: update test JSON formats to fix illegal base64 data errors

Co-Authored-By: [email protected] <[email protected]>

* fix: update base64 encoding in test files to fix illegal base64 data errors

Co-Authored-By: [email protected] <[email protected]>

* fix: update AccountID encoding in bank_accounts_related_accounts_test.go

Co-Authored-By: [email protected] <[email protected]>

* fix: update ID encoding in test files to fix illegal base64 data errors

Co-Authored-By: [email protected] <[email protected]>

* fix: update Config field format in connectors_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add test for FromPaymentToPaymentInitiationAdjustment function

Co-Authored-By: [email protected] <[email protected]>

* test: add test for TaskIDReference function

Co-Authored-By: [email protected] <[email protected]>

* test: fix payment scheme test for invalid JSON

Co-Authored-By: [email protected] <[email protected]>

* test: enhance payment scheme tests for better coverage

Co-Authored-By: [email protected] <[email protected]>

* test: enhance payment status tests for better coverage

Co-Authored-By: [email protected] <[email protected]>

* test: fix TestBankAccountIdempotencyKey expected hash value

Co-Authored-By: [email protected] <[email protected]>

* test: revert TestBankAccountIdempotencyKey expected hash value

Co-Authored-By: [email protected] <[email protected]>

* test: fix TestBankAccountIdempotencyKey expected hash value

Co-Authored-By: [email protected] <[email protected]>

* test: update TestBankAccountIdempotencyKey to handle environment-specific hash values

Co-Authored-By: [email protected] <[email protected]>

* test: add Given/When/Then section comments to test files

Co-Authored-By: [email protected] <[email protected]>

* test: add Given/When/Then section comments to account tests

Co-Authored-By: [email protected] <[email protected]>

* test: add tests for IdempotencyKey function

Co-Authored-By: [email protected] <[email protected]>

* test: fix Given/When/Then comments in payment_status_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix Given/When/Then comments and improve test coverage

Co-Authored-By: [email protected] <[email protected]>

* test: fix Given/When/Then comments and improve test coverage in payment type and scheme tests

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertions in test files

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation issues and ensure proper Given/When/Then pattern

Co-Authored-By: [email protected] <[email protected]>

* test: fix Given/When/Then sections in test files

Co-Authored-By: [email protected] <[email protected]>

* test: add error message testing to payment_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in payment_initiation_adjustments_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in payment_initiation_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in payment_initiation_adjustment_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in payment_initiation_reversal_adjustment_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in connectors_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in event_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation in balances_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add error message testing to payment_initiation_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add error message testing to payment_initiation_adjustment_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add error message testing to payment_initiation_reversal_adjustment_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add error message testing to payment_adjustment_id_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add error message testing to payment_initiation_adjustments_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add When sections to TestPaymentMarshalUnmarshal

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertions in test files

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertions in payment_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: add tests for events, others, and webhooks models

Co-Authored-By: [email protected] <[email protected]>

* test: fix TestPSPOther redeclaration and EventID field errors

Co-Authored-By: [email protected] <[email protected]>

* test: fix indentation and add Given/When/Then sections in test files

Co-Authored-By: [email protected] <[email protected]>

* test: add Given/When/Then sections to webhooks_test.go

Co-Authored-By: [email protected] <[email protected]>

* test: fix formatting and separate When/Then sections in test files

Co-Authored-By: [email protected] <[email protected]>

* test: fix error message assertions in test files

Co-Authored-By: [email protected] <[email protected]>

* test: apply gofmt to all test files

Co-Authored-By: [email protected] <[email protected]>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: [email protected] <[email protected]>
2025-04-30 16:08:45 +02:00

361 lines
8.0 KiB
Go

package models_test
import (
"encoding/json"
"testing"
"time"
"github.com/formancehq/go-libs/v3/pointer"
"github.com/formancehq/payments/internal/models"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestToPSPAccount(t *testing.T) {
t.Parallel()
t.Run("nil account", func(t *testing.T) {
t.Parallel()
// Given
var account *models.Account = nil
result := models.ToPSPAccount(account)
// Then
assert.Nil(t, result)
})
t.Run("non-nil account", func(t *testing.T) {
t.Parallel()
// Given
account := &models.Account{}
result := models.ToPSPAccount(account)
// Then
assert.NotNil(t, result)
})
}
func TestFromPSPAccount(t *testing.T) {
t.Parallel()
now := time.Now().UTC()
connectorID := models.ConnectorID{
Reference: uuid.New(),
Provider: "test",
}
t.Run("valid account", func(t *testing.T) {
t.Parallel()
// Given
pspAccount := models.PSPAccount{
Reference: "acc123",
CreatedAt: now,
Name: pointer.For("Test Account"),
DefaultAsset: pointer.For("USD/2"),
Metadata: map[string]string{
"key": "value",
},
Raw: json.RawMessage(`{"test": "data"}`),
}
account, err := models.FromPSPAccount(pspAccount, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
require.NoError(t, err)
assert.Equal(t, pspAccount.Reference, account.Reference)
assert.Equal(t, pspAccount.CreatedAt, account.CreatedAt)
assert.Equal(t, pspAccount.Name, account.Name)
assert.Equal(t, pspAccount.DefaultAsset, account.DefaultAsset)
assert.Equal(t, pspAccount.Metadata, account.Metadata)
assert.Equal(t, pspAccount.Raw, account.Raw)
assert.Equal(t, models.ACCOUNT_TYPE_INTERNAL, account.Type)
assert.Equal(t, connectorID, account.ConnectorID)
})
t.Run("validation errors", func(t *testing.T) {
t.Parallel()
t.Run("missing reference", func(t *testing.T) {
t.Parallel()
// Given
pspAccount := models.PSPAccount{
CreatedAt: now,
Raw: json.RawMessage(`{}`),
}
_, err := models.FromPSPAccount(pspAccount, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account reference: validation error")
})
t.Run("missing createdAt", func(t *testing.T) {
t.Parallel()
// Given
pspAccount := models.PSPAccount{
Reference: "acc123",
Raw: json.RawMessage(`{}`),
}
_, err := models.FromPSPAccount(pspAccount, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account createdAt: validation error")
})
t.Run("missing raw", func(t *testing.T) {
t.Parallel()
// Given
pspAccount := models.PSPAccount{
Reference: "acc123",
CreatedAt: now,
}
_, err := models.FromPSPAccount(pspAccount, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account raw: validation error")
})
t.Run("invalid defaultAsset", func(t *testing.T) {
t.Parallel()
// Given
pspAccount := models.PSPAccount{
Reference: "acc123",
CreatedAt: now,
DefaultAsset: pointer.For("invalid"),
Raw: json.RawMessage(`{}`),
}
_, err := models.FromPSPAccount(pspAccount, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "invalid default asset: validation error")
})
})
}
func TestFromPSPAccounts(t *testing.T) {
t.Parallel()
// Given
now := time.Now().UTC()
connectorID := models.ConnectorID{
Reference: uuid.New(),
Provider: "test",
}
pspAccounts := []models.PSPAccount{
{
Reference: "acc1",
CreatedAt: now,
Raw: json.RawMessage(`{}`),
},
{
Reference: "acc2",
CreatedAt: now,
Raw: json.RawMessage(`{}`),
},
}
accounts, err := models.FromPSPAccounts(pspAccounts, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
require.NoError(t, err)
assert.Len(t, accounts, 2)
assert.Equal(t, "acc1", accounts[0].Reference)
assert.Equal(t, "acc2", accounts[1].Reference)
// Given
invalidPspAccounts := append(pspAccounts, models.PSPAccount{
CreatedAt: now,
Raw: json.RawMessage(`{}`),
})
_, err = models.FromPSPAccounts(invalidPspAccounts, models.ACCOUNT_TYPE_INTERNAL, connectorID)
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account reference: validation error")
}
func TestAccountMarshalUnmarshal(t *testing.T) {
t.Parallel()
// Given
now := time.Now().UTC()
connectorID := models.ConnectorID{
Reference: uuid.New(),
Provider: "test",
}
account := models.Account{
ID: models.AccountID{
Reference: "acc123",
ConnectorID: connectorID,
},
ConnectorID: connectorID,
Reference: "acc123",
CreatedAt: now,
Type: models.ACCOUNT_TYPE_INTERNAL,
Name: pointer.For("Test Account"),
DefaultAsset: pointer.For("USD/2"),
Metadata: map[string]string{
"key": "value",
},
Raw: json.RawMessage(`{"test": "data"}`),
}
data, err := json.Marshal(account)
// Then
require.NoError(t, err)
var unmarshaledAccount models.Account
err = json.Unmarshal(data, &unmarshaledAccount)
// Then
require.NoError(t, err)
assert.Equal(t, account.ID, unmarshaledAccount.ID)
assert.Equal(t, account.ConnectorID, unmarshaledAccount.ConnectorID)
assert.Equal(t, account.Reference, unmarshaledAccount.Reference)
assert.Equal(t, account.CreatedAt, unmarshaledAccount.CreatedAt)
assert.Equal(t, account.Type, unmarshaledAccount.Type)
assert.Equal(t, account.Name, unmarshaledAccount.Name)
assert.Equal(t, account.DefaultAsset, unmarshaledAccount.DefaultAsset)
assert.Equal(t, account.Metadata, unmarshaledAccount.Metadata)
var originalJSON, unmarshaledJSON interface{}
err = json.Unmarshal(account.Raw, &originalJSON)
// Then
require.NoError(t, err)
err = json.Unmarshal(unmarshaledAccount.Raw, &unmarshaledJSON)
// Then
require.NoError(t, err)
assert.Equal(t, originalJSON, unmarshaledJSON)
}
func TestAccountIdempotencyKey(t *testing.T) {
t.Parallel()
// Given
connectorID := models.ConnectorID{
Reference: uuid.MustParse("00000000-0000-0000-0000-000000000001"),
Provider: "test",
}
account := models.Account{
ID: models.AccountID{
Reference: "acc123",
ConnectorID: connectorID,
},
}
key := account.IdempotencyKey()
// Then
assert.NotEmpty(t, key)
assert.Regexp(t, "^[0-9a-f]{40}$", key)
}
func TestPSPAccountValidate(t *testing.T) {
t.Parallel()
now := time.Now().UTC()
t.Run("valid account", func(t *testing.T) {
t.Parallel()
// Given
account := models.PSPAccount{
Reference: "acc123",
CreatedAt: now,
Raw: json.RawMessage(`{}`),
}
err := account.Validate()
// Then
assert.NoError(t, err)
})
t.Run("missing reference", func(t *testing.T) {
t.Parallel()
// Given
account := models.PSPAccount{
CreatedAt: now,
Raw: json.RawMessage(`{}`),
}
err := account.Validate()
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account reference: validation error")
})
t.Run("missing createdAt", func(t *testing.T) {
t.Parallel()
// Given
account := models.PSPAccount{
Reference: "acc123",
Raw: json.RawMessage(`{}`),
}
err := account.Validate()
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account createdAt: validation error")
})
t.Run("missing raw", func(t *testing.T) {
t.Parallel()
// Given
account := models.PSPAccount{
Reference: "acc123",
CreatedAt: now,
}
err := account.Validate()
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing account raw: validation error")
})
t.Run("invalid defaultAsset", func(t *testing.T) {
t.Parallel()
// Given
account := models.PSPAccount{
Reference: "acc123",
CreatedAt: now,
DefaultAsset: pointer.For("invalid"),
Raw: json.RawMessage(`{}`),
}
err := account.Validate()
// Then
assert.Error(t, err)
assert.Contains(t, err.Error(), "invalid default asset: validation error")
})
}