package endpoint

import (
	"context"

	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

var _ = Describe("endpoint", func() {
	Describe("NewEndpoint", func() {
		It("should return new endpoint", func() {
			ep := NewEndpoint(func(ctx context.Context, request interface{}) (response interface{}, err error) {
				return nil, nil
			}, WithMetadata(&Metadata{Name: "some-name"}))

			Expect(ep).ShouldNot(BeNil())
			Expect(ep.Metadata()).Should(Equal(&Metadata{Name: "some-name"}))
		})
	})

	Describe("UseMiddleware", func() {
		It("should apply middleware from left to right", func() {
			ep := NewEndpoint(func(ctx context.Context, request interface{}) (response interface{}, err error) {
				return "foo", nil
			}, WithMetadata(&Metadata{Name: "some-name"}))

			var applied []string
			middlewares := []Middleware{
				func(next Endpoint) Endpoint {
					return EndpointFunc(func(ctx context.Context, request interface{}) (response interface{}, err error) {
						applied = append(applied, "aaa")
						return next.Invoke(ctx, request)
					})
				},
				func(next Endpoint) Endpoint {
					return EndpointFunc(func(ctx context.Context, request interface{}) (response interface{}, err error) {
						applied = append(applied, "bbb")
						return next.Invoke(ctx, request)
					})
				},
			}

			ep = UseMiddleware(ep, middlewares...)

			resp, err := ep.Invoke(context.TODO(), nil)
			Expect(resp).Should(Equal("foo"))
			Expect(err).Should(BeNil())
			Expect(applied).Should(Equal([]string{"aaa", "bbb"}))
		})
	})
})
