Files

88 lines
2.9 KiB
Go

package activities_test
import (
"fmt"
"time"
"github.com/hanzo-fi/go-libs/v5/pkg/observe/log"
"github.com/hanzo-fi/payments/internal/connectors"
"github.com/hanzo-fi/payments/internal/connectors/engine/activities"
pluginsError "github.com/hanzo-fi/payments/internal/connectors/plugins"
"github.com/hanzo-fi/payments/internal/events"
"github.com/hanzo-fi/payments/pkg/domain/models"
"github.com/hanzo-fi/payments/internal/storage"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"go.temporal.io/sdk/temporal"
gomock "go.uber.org/mock/gomock"
)
var _ = Describe("Plugin Create Transfer", func() {
var (
act activities.Activities
p *connectors.MockManager
s *storage.MockStorage
evts *events.Events
sampleResponse models.CreateTransferResponse
)
BeforeEach(func() {
evts = &events.Events{}
sampleResponse = models.CreateTransferResponse{
Payment: &models.PSPPayment{Reference: "ref"},
}
})
Context("plugin create transfer", func() {
var (
plugin *models.MockPlugin
req activities.CreateTransferRequest
logger = logging.NewDefaultLogger(GinkgoWriter, true, false, false)
delay = 50 * time.Millisecond
)
BeforeEach(func() {
ctrl := gomock.NewController(GinkgoT())
p = connectors.NewMockManager(ctrl)
s = storage.NewMockStorage(ctrl)
plugin = models.NewMockPlugin(ctrl)
act = activities.New(logger, nil, s, evts, p, delay, 0)
req = activities.CreateTransferRequest{
ConnectorID: models.ConnectorID{
Provider: "some_provider",
},
}
})
It("calls underlying plugin", func(ctx SpecContext) {
p.EXPECT().Get(req.ConnectorID).Return(plugin, nil)
plugin.EXPECT().CreateTransfer(ctx, req.Req).Return(sampleResponse, nil)
res, err := act.PluginCreateTransfer(ctx, req)
Expect(err).To(BeNil())
Expect(res.Payment.Reference).To(Equal(sampleResponse.Payment.Reference))
})
It("returns a retryable temporal error", func(ctx SpecContext) {
p.EXPECT().Get(req.ConnectorID).Return(plugin, nil)
plugin.EXPECT().CreateTransfer(ctx, req.Req).Return(sampleResponse, fmt.Errorf("some string"))
_, err := act.PluginCreateTransfer(ctx, req)
Expect(err).ToNot(BeNil())
temporalErr, ok := err.(*temporal.ApplicationError)
Expect(ok).To(BeTrue())
Expect(temporalErr.NonRetryable()).To(BeFalse())
Expect(temporalErr.Type()).To(Equal(activities.ErrTypeDefault))
})
It("returns a non-retryable temporal error", func(ctx SpecContext) {
p.EXPECT().Get(req.ConnectorID).Return(plugin, nil)
plugin.EXPECT().CreateTransfer(ctx, req.Req).Return(sampleResponse, fmt.Errorf("invalid: %w", pluginsError.ErrNotImplemented))
_, err := act.PluginCreateTransfer(ctx, req)
Expect(err).ToNot(BeNil())
temporalErr, ok := err.(*temporal.ApplicationError)
Expect(ok).To(BeTrue())
Expect(temporalErr.NonRetryable()).To(BeTrue())
Expect(temporalErr.Type()).To(Equal(activities.ErrTypeUnimplemented))
})
})
})