mirror of
https://github.com/hanzo-fi/payments.git
synced 2026-10-30 20:31:20 +00:00
784 lines
23 KiB
Go
784 lines
23 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/formancehq/go-libs/v3/bun/bunpaginate"
|
|
"github.com/formancehq/go-libs/v3/logging"
|
|
"github.com/formancehq/go-libs/v3/pointer"
|
|
"github.com/formancehq/go-libs/v3/query"
|
|
"github.com/formancehq/go-libs/v3/time"
|
|
"github.com/formancehq/payments/internal/models"
|
|
"github.com/google/uuid"
|
|
"github.com/pkg/errors"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
var (
|
|
defaultBankAccount = models.BankAccount{
|
|
ID: uuid.New(),
|
|
CreatedAt: now.Add(-60 * time.Minute).UTC().Time,
|
|
Name: "test1",
|
|
AccountNumber: pointer.For("12345678"),
|
|
Country: pointer.For("US"),
|
|
Metadata: map[string]string{
|
|
"foo": "bar",
|
|
},
|
|
}
|
|
|
|
bcID2 = uuid.New()
|
|
defaultBankAccount2 = models.BankAccount{
|
|
ID: bcID2,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
Name: "test2",
|
|
IBAN: pointer.For("DE89370400440532013000"),
|
|
SwiftBicCode: pointer.For("COBADEFFXXX"),
|
|
Country: pointer.For("DE"),
|
|
Metadata: map[string]string{
|
|
"foo2": "bar2",
|
|
},
|
|
RelatedAccounts: []models.BankAccountRelatedAccount{
|
|
{
|
|
AccountID: defaultAccounts()[0].ID,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
},
|
|
},
|
|
}
|
|
|
|
// No metadata
|
|
defaultBankAccount3 = models.BankAccount{
|
|
ID: uuid.New(),
|
|
CreatedAt: now.Add(-55 * time.Minute).UTC().Time,
|
|
Name: "test1",
|
|
AccountNumber: pointer.For("12345678"),
|
|
Country: pointer.For("US"),
|
|
}
|
|
)
|
|
|
|
func upsertBankAccount(t *testing.T, ctx context.Context, storage Storage, bankAccounts models.BankAccount) {
|
|
require.NoError(t, storage.BankAccountsUpsert(ctx, bankAccounts))
|
|
}
|
|
|
|
func TestBankAccountsUpsert(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ctx := logging.TestingContext()
|
|
store := newStore(t)
|
|
defer store.Close()
|
|
|
|
upsertConnector(t, ctx, store, defaultConnector)
|
|
upsertAccounts(t, ctx, store, defaultAccounts())
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount2)
|
|
|
|
t.Run("upsert with same id", func(t *testing.T) {
|
|
ba := models.BankAccount{
|
|
ID: defaultBankAccount.ID,
|
|
CreatedAt: now.UTC().Time,
|
|
Name: "changed",
|
|
AccountNumber: pointer.For("987654321"),
|
|
Country: pointer.For("CA"),
|
|
Metadata: map[string]string{
|
|
"changed": "changed",
|
|
},
|
|
}
|
|
|
|
require.NoError(t, store.BankAccountsUpsert(ctx, ba))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, ba.ID, true)
|
|
require.NoError(t, err)
|
|
// Should not update the bank account
|
|
compareBankAccounts(t, defaultBankAccount, *actual)
|
|
})
|
|
|
|
t.Run("unknown connector id", func(t *testing.T) {
|
|
ba := models.BankAccount{
|
|
ID: uuid.New(),
|
|
CreatedAt: now.UTC().Time,
|
|
Name: "foo",
|
|
AccountNumber: pointer.For("12345678"),
|
|
Country: pointer.For("US"),
|
|
Metadata: map[string]string{
|
|
"foo": "bar",
|
|
},
|
|
RelatedAccounts: []models.BankAccountRelatedAccount{
|
|
{
|
|
AccountID: models.AccountID{
|
|
Reference: "unknown",
|
|
ConnectorID: models.ConnectorID{
|
|
Reference: uuid.New(),
|
|
Provider: "unknown",
|
|
},
|
|
},
|
|
CreatedAt: now.UTC().Time,
|
|
},
|
|
},
|
|
}
|
|
|
|
require.Error(t, store.BankAccountsUpsert(ctx, ba))
|
|
b, err := store.BankAccountsGet(ctx, ba.ID, true)
|
|
require.Error(t, err)
|
|
require.Nil(t, b)
|
|
})
|
|
}
|
|
|
|
func TestBankAccountsUpdateMetadata(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ctx := logging.TestingContext()
|
|
store := newStore(t)
|
|
defer store.Close()
|
|
|
|
upsertConnector(t, ctx, store, defaultConnector)
|
|
upsertAccounts(t, ctx, store, defaultAccounts())
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount2)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount3)
|
|
|
|
t.Run("update metadata", func(t *testing.T) {
|
|
metadata := map[string]string{
|
|
"test1": "test2",
|
|
"test3": "test4",
|
|
}
|
|
|
|
// redeclare it in order to not update the map of global variable
|
|
acc := models.BankAccount{
|
|
ID: defaultBankAccount.ID,
|
|
CreatedAt: now.Add(-60 * time.Minute).UTC().Time,
|
|
Name: "test1",
|
|
AccountNumber: pointer.For("12345678"),
|
|
Country: pointer.For("US"),
|
|
Metadata: map[string]string{
|
|
"foo": "bar",
|
|
},
|
|
}
|
|
for k, v := range metadata {
|
|
acc.Metadata[k] = v
|
|
}
|
|
|
|
require.NoError(t, store.BankAccountsUpdateMetadata(ctx, defaultBankAccount.ID, metadata))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, acc, *actual)
|
|
})
|
|
|
|
t.Run("update same metadata", func(t *testing.T) {
|
|
metadata := map[string]string{
|
|
"foo2": "bar3",
|
|
}
|
|
|
|
acc := models.BankAccount{
|
|
ID: bcID2,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
Name: "test2",
|
|
IBAN: pointer.For("DE89370400440532013000"),
|
|
SwiftBicCode: pointer.For("COBADEFFXXX"),
|
|
Country: pointer.For("DE"),
|
|
Metadata: map[string]string{
|
|
"foo2": "bar2",
|
|
},
|
|
RelatedAccounts: []models.BankAccountRelatedAccount{
|
|
{
|
|
AccountID: defaultAccounts()[0].ID,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
},
|
|
},
|
|
}
|
|
for k, v := range metadata {
|
|
acc.Metadata[k] = v
|
|
}
|
|
|
|
require.NoError(t, store.BankAccountsUpdateMetadata(ctx, defaultBankAccount2.ID, metadata))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount2.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, acc, *actual)
|
|
})
|
|
|
|
t.Run("update metadata of bank accounts with nil map", func(t *testing.T) {
|
|
metadata := map[string]string{
|
|
"test1": "test2",
|
|
"test3": "test4",
|
|
}
|
|
|
|
// redeclare it in order to not update the map of global variable
|
|
acc := models.BankAccount{
|
|
ID: defaultBankAccount3.ID,
|
|
CreatedAt: now.Add(-55 * time.Minute).UTC().Time,
|
|
Name: "test1",
|
|
AccountNumber: pointer.For("12345678"),
|
|
Country: pointer.For("US"),
|
|
}
|
|
acc.Metadata = make(map[string]string)
|
|
for k, v := range metadata {
|
|
acc.Metadata[k] = v
|
|
}
|
|
|
|
require.NoError(t, store.BankAccountsUpdateMetadata(ctx, defaultBankAccount3.ID, metadata))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount3.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, acc, *actual)
|
|
})
|
|
}
|
|
|
|
func TestBankAccountsGet(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ctx := logging.TestingContext()
|
|
store := newStore(t)
|
|
defer store.Close()
|
|
|
|
upsertConnector(t, ctx, store, defaultConnector)
|
|
upsertAccounts(t, ctx, store, defaultAccounts())
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount2)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount3)
|
|
|
|
t.Run("get bank account without related accounts", func(t *testing.T) {
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, defaultBankAccount, *actual)
|
|
})
|
|
|
|
t.Run("get bank account without metadata", func(t *testing.T) {
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount3.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, defaultBankAccount3, *actual)
|
|
})
|
|
|
|
t.Run("get bank account with related accounts", func(t *testing.T) {
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount2.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, defaultBankAccount2, *actual)
|
|
})
|
|
|
|
t.Run("get unknown bank account", func(t *testing.T) {
|
|
actual, err := store.BankAccountsGet(ctx, uuid.New(), true)
|
|
require.Error(t, err)
|
|
require.Nil(t, actual)
|
|
})
|
|
|
|
t.Run("get bank account with expand to false", func(t *testing.T) {
|
|
acc := models.BankAccount{
|
|
ID: defaultBankAccount.ID,
|
|
CreatedAt: now.Add(-60 * time.Minute).UTC().Time,
|
|
Name: "test1",
|
|
Country: pointer.For("US"),
|
|
Metadata: map[string]string{
|
|
"foo": "bar",
|
|
},
|
|
}
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount.ID, false)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, acc, *actual)
|
|
})
|
|
|
|
t.Run("get bank account with expand to false 2", func(t *testing.T) {
|
|
acc := models.BankAccount{
|
|
ID: bcID2,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
Name: "test2",
|
|
Country: pointer.For("DE"),
|
|
Metadata: map[string]string{
|
|
"foo2": "bar2",
|
|
},
|
|
RelatedAccounts: []models.BankAccountRelatedAccount{
|
|
{
|
|
AccountID: defaultAccounts()[0].ID,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
},
|
|
},
|
|
}
|
|
|
|
actual, err := store.BankAccountsGet(ctx, bcID2, false)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, acc, *actual)
|
|
})
|
|
}
|
|
|
|
func TestBankAccountsList(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ctx := logging.TestingContext()
|
|
store := newStore(t)
|
|
defer store.Close()
|
|
|
|
d1 := models.BankAccount{
|
|
ID: defaultBankAccount.ID,
|
|
CreatedAt: defaultBankAccount.CreatedAt,
|
|
Name: defaultBankAccount.Name,
|
|
Country: defaultBankAccount.Country,
|
|
Metadata: defaultBankAccount.Metadata,
|
|
}
|
|
|
|
d2 := models.BankAccount{
|
|
ID: defaultBankAccount2.ID,
|
|
CreatedAt: defaultBankAccount2.CreatedAt,
|
|
Name: defaultBankAccount2.Name,
|
|
Country: defaultBankAccount2.Country,
|
|
Metadata: defaultBankAccount2.Metadata,
|
|
RelatedAccounts: defaultBankAccount2.RelatedAccounts,
|
|
}
|
|
_ = d2
|
|
|
|
d3 := models.BankAccount{
|
|
ID: defaultBankAccount3.ID,
|
|
CreatedAt: defaultBankAccount3.CreatedAt,
|
|
Name: defaultBankAccount3.Name,
|
|
Country: defaultBankAccount3.Country,
|
|
}
|
|
|
|
upsertConnector(t, ctx, store, defaultConnector)
|
|
upsertAccounts(t, ctx, store, defaultAccounts())
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount2)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount3)
|
|
|
|
t.Run("wrong query builder operator when listing by name", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Lt("name", "test1")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.Error(t, err)
|
|
require.Nil(t, cursor)
|
|
assert.True(t, errors.Is(err, ErrValidation))
|
|
assert.Regexp(t, "name", err.Error())
|
|
})
|
|
|
|
t.Run("list bank accounts by name", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("name", "test1")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 2)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d3, cursor.Data[0])
|
|
compareBankAccounts(t, d1, cursor.Data[1])
|
|
})
|
|
|
|
t.Run("list bank accounts by name 2", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("name", "test2")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d2, cursor.Data[0])
|
|
})
|
|
|
|
t.Run("list bank accounts by unknown name", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("name", "unknown")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 0)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
})
|
|
|
|
t.Run("list bank accounts by id", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("id", d3.ID.String())),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d3, cursor.Data[0])
|
|
})
|
|
|
|
t.Run("list bank accounts by unknown id", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("id", uuid.New().String())),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 0)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
})
|
|
|
|
t.Run("list bank accounts by country", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("country", "US")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 2)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d3, cursor.Data[0])
|
|
compareBankAccounts(t, d1, cursor.Data[1])
|
|
})
|
|
|
|
t.Run("list bank accounts by country 2", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("country", "DE")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d2, cursor.Data[0])
|
|
})
|
|
|
|
t.Run("list bank accounts by unknown country", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("country", "unknown")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 0)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
})
|
|
|
|
t.Run("wrong query builder when listing by metadata", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Lt("metadata[foo]", "bar")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.Error(t, err)
|
|
require.Nil(t, cursor)
|
|
})
|
|
|
|
t.Run("list bank accounts by metadata", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("metadata[foo]", "bar")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d1, cursor.Data[0])
|
|
})
|
|
|
|
t.Run("list bank accounts by unknown metadata", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("metadata[unknown]", "bar")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 0)
|
|
require.False(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
})
|
|
|
|
t.Run("unknown query builder key when listing bank accounts", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(15).
|
|
WithQueryBuilder(query.Match("unknown", "bar")),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.Error(t, err)
|
|
require.Nil(t, cursor)
|
|
})
|
|
|
|
t.Run("list bank accounts test cursor", func(t *testing.T) {
|
|
q := NewListBankAccountsQuery(
|
|
bunpaginate.NewPaginatedQueryOptions(BankAccountQuery{}).
|
|
WithPageSize(1),
|
|
)
|
|
|
|
cursor, err := store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.True(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.NotEmpty(t, cursor.Next)
|
|
compareBankAccounts(t, d2, cursor.Data[0])
|
|
|
|
err = bunpaginate.UnmarshalCursor(cursor.Next, &q)
|
|
require.NoError(t, err)
|
|
cursor, err = store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.True(t, cursor.HasMore)
|
|
require.NotEmpty(t, cursor.Previous)
|
|
require.NotEmpty(t, cursor.Next)
|
|
compareBankAccounts(t, d3, cursor.Data[0])
|
|
|
|
err = bunpaginate.UnmarshalCursor(cursor.Next, &q)
|
|
require.NoError(t, err)
|
|
cursor, err = store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.False(t, cursor.HasMore)
|
|
require.NotEmpty(t, cursor.Previous)
|
|
require.Empty(t, cursor.Next)
|
|
compareBankAccounts(t, d1, cursor.Data[0])
|
|
|
|
err = bunpaginate.UnmarshalCursor(cursor.Previous, &q)
|
|
require.NoError(t, err)
|
|
cursor, err = store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.True(t, cursor.HasMore)
|
|
require.NotEmpty(t, cursor.Previous)
|
|
require.NotEmpty(t, cursor.Next)
|
|
compareBankAccounts(t, d3, cursor.Data[0])
|
|
|
|
err = bunpaginate.UnmarshalCursor(cursor.Previous, &q)
|
|
require.NoError(t, err)
|
|
cursor, err = store.BankAccountsList(ctx, q)
|
|
require.NoError(t, err)
|
|
require.Len(t, cursor.Data, 1)
|
|
require.True(t, cursor.HasMore)
|
|
require.Empty(t, cursor.Previous)
|
|
require.NotEmpty(t, cursor.Next)
|
|
compareBankAccounts(t, d2, cursor.Data[0])
|
|
})
|
|
}
|
|
|
|
func TestBankAccountsAddRelatedAccount(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ctx := logging.TestingContext()
|
|
store := newStore(t)
|
|
defer store.Close()
|
|
|
|
upsertConnector(t, ctx, store, defaultConnector)
|
|
upsertAccounts(t, ctx, store, defaultAccounts())
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount2)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount3)
|
|
|
|
t.Run("add related account when empty", func(t *testing.T) {
|
|
acc := models.BankAccountRelatedAccount{
|
|
AccountID: defaultAccounts()[0].ID,
|
|
CreatedAt: now.UTC().Time,
|
|
}
|
|
|
|
ba := defaultBankAccount
|
|
ba.RelatedAccounts = append(ba.RelatedAccounts, acc)
|
|
|
|
require.NoError(t, store.BankAccountsAddRelatedAccount(ctx, ba.ID, acc))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, ba, *actual)
|
|
})
|
|
|
|
t.Run("add related account when not empty", func(t *testing.T) {
|
|
acc := models.BankAccountRelatedAccount{
|
|
AccountID: defaultAccounts()[1].ID,
|
|
CreatedAt: now.UTC().Time,
|
|
}
|
|
|
|
ba := defaultBankAccount2
|
|
ba.RelatedAccounts = append(ba.RelatedAccounts, acc)
|
|
|
|
require.NoError(t, store.BankAccountsAddRelatedAccount(ctx, defaultBankAccount2.ID, acc))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount2.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, ba, *actual)
|
|
})
|
|
|
|
t.Run("add related account with unknown bank account", func(t *testing.T) {
|
|
acc := models.BankAccountRelatedAccount{
|
|
AccountID: defaultAccounts()[1].ID,
|
|
CreatedAt: now.UTC().Time,
|
|
}
|
|
|
|
require.Error(t, store.BankAccountsAddRelatedAccount(ctx, uuid.New(), acc))
|
|
})
|
|
|
|
t.Run("add related account with unknown connector", func(t *testing.T) {
|
|
acc := models.BankAccountRelatedAccount{
|
|
AccountID: models.AccountID{
|
|
Reference: "unknown",
|
|
ConnectorID: models.ConnectorID{
|
|
Reference: uuid.New(),
|
|
Provider: "unknown",
|
|
},
|
|
},
|
|
CreatedAt: now.UTC().Time,
|
|
}
|
|
|
|
require.Error(t, store.BankAccountsAddRelatedAccount(ctx, defaultBankAccount.ID, acc))
|
|
})
|
|
|
|
t.Run("add related account with existing related account", func(t *testing.T) {
|
|
acc := models.BankAccountRelatedAccount{
|
|
AccountID: defaultAccounts()[0].ID,
|
|
CreatedAt: now.Add(-30 * time.Minute).UTC().Time,
|
|
}
|
|
|
|
ba := defaultBankAccount3
|
|
ba.RelatedAccounts = append(ba.RelatedAccounts, acc)
|
|
|
|
require.NoError(t, store.BankAccountsAddRelatedAccount(ctx, defaultBankAccount3.ID, acc))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount3.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, ba, *actual)
|
|
|
|
require.NoError(t, store.BankAccountsAddRelatedAccount(ctx, defaultBankAccount3.ID, acc))
|
|
|
|
actual, err = store.BankAccountsGet(ctx, defaultBankAccount3.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, ba, *actual)
|
|
})
|
|
}
|
|
|
|
func TestBankAccountsDeleteRelatedAccountFromConnectorID(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
ctx := logging.TestingContext()
|
|
store := newStore(t)
|
|
defer store.Close()
|
|
|
|
upsertConnector(t, ctx, store, defaultConnector)
|
|
upsertAccounts(t, ctx, store, defaultAccounts())
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount2)
|
|
upsertBankAccount(t, ctx, store, defaultBankAccount3)
|
|
|
|
t.Run("delete related account with unknown connector", func(t *testing.T) {
|
|
require.NoError(t, store.BankAccountsDeleteRelatedAccountFromConnectorID(ctx, models.ConnectorID{
|
|
Reference: uuid.New(),
|
|
Provider: "unknown",
|
|
}))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount2.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, defaultBankAccount2, *actual)
|
|
})
|
|
|
|
t.Run("delete related account with another connector id", func(t *testing.T) {
|
|
require.NoError(t, store.BankAccountsDeleteRelatedAccountFromConnectorID(ctx, defaultConnector2.ID))
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount2.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, defaultBankAccount2, *actual)
|
|
})
|
|
|
|
t.Run("delete related account", func(t *testing.T) {
|
|
require.NoError(t, store.BankAccountsDeleteRelatedAccountFromConnectorID(ctx, defaultConnector.ID))
|
|
|
|
ba := defaultBankAccount2
|
|
ba.RelatedAccounts = nil
|
|
|
|
actual, err := store.BankAccountsGet(ctx, defaultBankAccount2.ID, true)
|
|
require.NoError(t, err)
|
|
compareBankAccounts(t, ba, *actual)
|
|
})
|
|
}
|
|
|
|
func compareBankAccounts(t *testing.T, expected, actual models.BankAccount) {
|
|
require.Equal(t, expected.ID, actual.ID)
|
|
require.Equal(t, expected.CreatedAt, actual.CreatedAt)
|
|
require.Equal(t, expected.Name, actual.Name)
|
|
|
|
require.Equal(t, len(expected.Metadata), len(actual.Metadata))
|
|
for k, v := range expected.Metadata {
|
|
require.Equal(t, v, actual.Metadata[k])
|
|
}
|
|
for k, v := range actual.Metadata {
|
|
require.Equal(t, v, expected.Metadata[k])
|
|
}
|
|
|
|
switch {
|
|
case expected.AccountNumber != nil && actual.AccountNumber != nil:
|
|
require.Equal(t, *expected.AccountNumber, *actual.AccountNumber)
|
|
case expected.AccountNumber == nil && actual.AccountNumber == nil:
|
|
// Nothing to do
|
|
default:
|
|
require.Fail(t, "AccountNumber mismatch")
|
|
}
|
|
|
|
switch {
|
|
case expected.IBAN != nil && actual.IBAN != nil:
|
|
require.Equal(t, *expected.IBAN, *actual.IBAN)
|
|
case expected.IBAN == nil && actual.IBAN == nil:
|
|
// Nothing to do
|
|
default:
|
|
require.Fail(t, "IBAN mismatch")
|
|
}
|
|
|
|
switch {
|
|
case expected.SwiftBicCode != nil && actual.SwiftBicCode != nil:
|
|
require.Equal(t, *expected.SwiftBicCode, *actual.SwiftBicCode)
|
|
case expected.SwiftBicCode == nil && actual.SwiftBicCode == nil:
|
|
// Nothing to do
|
|
default:
|
|
require.Fail(t, "SwiftBicCode mismatch")
|
|
}
|
|
|
|
switch {
|
|
case expected.Country != nil && actual.Country != nil:
|
|
require.Equal(t, *expected.Country, *actual.Country)
|
|
case expected.Country == nil && actual.Country == nil:
|
|
// Nothing to do
|
|
default:
|
|
require.Fail(t, "Country mismatch")
|
|
}
|
|
|
|
require.Equal(t, len(expected.RelatedAccounts), len(actual.RelatedAccounts))
|
|
for i := range expected.RelatedAccounts {
|
|
require.Equal(t, expected.RelatedAccounts[i], actual.RelatedAccounts[i])
|
|
}
|
|
}
|