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) }