package middleware

import (
	"context"
	"github.com/UpmeshLTD/urus-aio/infrastructure/logging/mocks"
	"github.com/UpmeshLTD/urus-aio/infrastructure/server/endpoint"
	"github.com/UpmeshLTD/urus-aio/infrastructure/testing"

	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
	"github.com/stretchr/testify/mock"
)

var _ = Describe("panic", func() {
	Describe("PanicRecovery", func() {
		It("should recover from panic", func() {
			logged := false
			logger := &mocks.Logger{}

			ep := LoggerInjection(logger)(
				PanicRecovery()(
					endpoint.EndpointFunc(func(ctx context.Context, request interface{}) (response interface{}, err error) {
						panic("deliberate")
					}),
				),
			)

			logger.On("Errorw", testing.MockAnythingSlice(3)...).Run(func(args mock.Arguments) {
				logged = true
			})

			_, _ = ep.Invoke(context.TODO(), nil)

			Expect(logged).Should(BeTrue())
		})
	})
})
