package api

import (
	"context"
	"fmt"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/AlchemyTelcoSolutions/utils/service/domain"
	"github.com/AlchemyTelcoSolutions/xutils-go/xlogger"
	"github.com/stretchr/testify/assert"
)

func TestErrorApi(t *testing.T) {

	tests := []struct {
		name         string
		err          error
		expectedCode int
		withLogger   bool
	}{
		{
			name:         "error lower than 500",
			err:          domain.NewBadRequestError("fail"),
			expectedCode: http.StatusBadRequest,
		},
		{
			name:         "internal server Error",
			err:          fmt.Errorf("fail"),
			expectedCode: http.StatusInternalServerError,
		},
		{
			name:         "error with logger",
			err:          domain.NewForbiddenError("fail"),
			withLogger:   true,
			expectedCode: http.StatusForbidden,
		},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			rr := httptest.NewRecorder()
			req := httptest.NewRequest("GET", "/", nil)
			if test.withLogger {
				ctx := context.WithValue(req.Context(), "tracing-logger", &xlogger.NoOpLogger{})
				req = req.WithContext(ctx)
			}
			RespWithErr(req, rr, test.err)
			assert.Equal(t, test.expectedCode, rr.Code)
		})
	}

}
