// Copyright 2020 the Pinniped contributors. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package httperr

import (
	"errors"
	"fmt"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestHTTPErrs(t *testing.T) {
	t.Run("new", func(t *testing.T) {
		err := New(http.StatusBadRequest, "bad request error")
		require.EqualError(t, err, "bad request error")
	})

	t.Run("newf", func(t *testing.T) {
		err := Newf(http.StatusMethodNotAllowed, "expected method %s", "POST")
		require.EqualError(t, err, "expected method POST")
	})

	t.Run("wrap", func(t *testing.T) {
		wrappedErr := fmt.Errorf("some internal error")
		err := Wrap(http.StatusInternalServerError, "unexpected error", wrappedErr)
		require.EqualError(t, err, "unexpected error: some internal error")
		require.True(t, errors.Is(err, wrappedErr), "expected error to be wrapped")
	})

	t.Run("respond", func(t *testing.T) {
		err := Wrap(http.StatusForbidden, "boring public bits", fmt.Errorf("some secret internal bits"))
		require.Implements(t, (*Responder)(nil), err)
		rec := httptest.NewRecorder()
		err.(Responder).Respond(rec)
		require.Equal(t, http.StatusForbidden, rec.Code)
		require.Equal(t, "Forbidden: boring public bits\n", rec.Body.String())
		require.Equal(t, http.Header{
			"Content-Type":           []string{"text/plain; charset=utf-8"},
			"X-Content-Type-Options": []string{"nosniff"},
		}, rec.Header())
	})
}

func TestHandlerFunc(t *testing.T) {
	t.Run("success", func(t *testing.T) {

	})
}