67 lines
2.7 KiB
Go
67 lines
2.7 KiB
Go
package payments
|
|
|
|
import (
|
|
"context"
|
|
"net/url"
|
|
"testing"
|
|
"time"
|
|
|
|
db "git.sendico.io/tech/sxchnge/shared/database"
|
|
merrors "git.sendico.io/tech/sxchnge/shared/errors"
|
|
sharedmodel "git.sendico.io/tech/sxchnge/shared/model"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/testcontainers/testcontainers-go/modules/mongodb"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func TestDurableAuthorizationTransactionAndCustomerIsolation(t *testing.T) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
|
|
defer cancel()
|
|
container, err := mongodb.Run(ctx, "mongo:latest", mongodb.WithReplicaSet("rs"))
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { require.NoError(t, container.Terminate(context.Background())) })
|
|
uri, err := container.ConnectionString(ctx)
|
|
require.NoError(t, err)
|
|
u, err := url.Parse(uri)
|
|
require.NoError(t, err)
|
|
q := u.Query()
|
|
q.Set("directConnection", "true")
|
|
u.RawQuery = q.Encode()
|
|
factory, err := db.NewConnection(zap.NewNop(), &db.Config{Driver: db.Mongo, Settings: sharedmodel.SettingsT{"uri": u.String(), "database": "payments"}})
|
|
require.NoError(t, err)
|
|
t.Cleanup(factory.CloseConnection)
|
|
store, err := OpenStore(factory)
|
|
require.NoError(t, err)
|
|
customer := bson.NewObjectID()
|
|
r := &Record{Customer: customer, Namespace: "provider", Subject: "subject"}
|
|
r.SetID(bson.NewObjectID())
|
|
require.NoError(t, store.Create(ctx, r))
|
|
_, err = store.Get(ctx, r.ID, bson.NewObjectID(), r.Namespace)
|
|
require.ErrorIs(t, err, merrors.ErrNoData)
|
|
_, err = factory.TransactionFactory().CreateTransaction().Execute(ctx, func(tx context.Context) (any, error) {
|
|
require.NoError(t, store.Authorize(tx, r, "authorized-key-123"))
|
|
return nil, Uncertain
|
|
})
|
|
require.ErrorIs(t, err, Uncertain)
|
|
stored, err := store.Get(ctx, r.ID, customer, r.Namespace)
|
|
require.NoError(t, err)
|
|
require.Empty(t, stored.Key)
|
|
require.NoError(t, store.Authorize(ctx, r, "authorized-key-123"))
|
|
require.ErrorIs(t, store.Authorize(ctx, r, "other-key-123456"), Uncertain)
|
|
another := &Record{Customer: customer, Namespace: r.Namespace}
|
|
another.SetID(bson.NewObjectID())
|
|
require.NoError(t, store.Create(ctx, another))
|
|
require.ErrorIs(t, store.Authorize(ctx, another, "authorized-key-123"), merrors.ErrDataConflict)
|
|
require.NoError(t, store.Attach(ctx, r, "payment-1"))
|
|
require.NoError(t, store.Attach(ctx, r, "payment-1"))
|
|
require.ErrorIs(t, store.Attach(ctx, r, "different-payment"), Uncertain)
|
|
reopened, err := OpenStore(factory)
|
|
require.NoError(t, err)
|
|
stored, err = reopened.ByKey(ctx, customer, r.Namespace, "authorized-key-123")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "payment-1", stored.Payment)
|
|
_, err = reopened.ByKey(ctx, customer, "other-provider", "authorized-key-123")
|
|
require.ErrorIs(t, err, merrors.ErrNoData)
|
|
}
|