package middleware
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRedocMiddleware(t *testing.T) {
t.Run("with defaults", func(t *testing.T) {
redoc := Redoc(RedocOpts{}, nil)
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "/docs", nil)
require.NoError(t, err)
recorder := httptest.NewRecorder()
redoc.ServeHTTP(recorder, req)
assert.Equal(t, http.StatusOK, recorder.Code)
assert.Equal(t, "text/html; charset=utf-8", recorder.Header().Get(contentTypeHeader))
var o RedocOpts
o.EnsureDefaults()
assert.Contains(t, recorder.Body.String(), fmt.Sprintf("
%s", o.Title))
assert.Contains(t, recorder.Body.String(), fmt.Sprintf("", o.SpecURL))
assert.Contains(t, recorder.Body.String(), redocLatest)
})
t.Run("with alternate path and spec URL", func(t *testing.T) {
redoc := Redoc(RedocOpts{
BasePath: "/base",
Path: "ui",
SpecURL: "/ui/swagger.json",
}, nil)
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "/base/ui", nil)
require.NoError(t, err)
recorder := httptest.NewRecorder()
redoc.ServeHTTP(recorder, req)
assert.Equal(t, http.StatusOK, recorder.Code)
assert.Contains(t, recorder.Body.String(), "")
})
t.Run("with custom template", func(t *testing.T) {
redoc := Redoc(RedocOpts{
Template: `
{{ .Title }}
`,
}, nil)
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "/docs", nil)
require.NoError(t, err)
recorder := httptest.NewRecorder()
redoc.ServeHTTP(recorder, req)
assert.Equal(t, http.StatusOK, recorder.Code)
assert.Contains(t, recorder.Body.String(), "required-props-first=true")
})
t.Run("edge cases", func(t *testing.T) {
t.Run("with invalid custom template", func(t *testing.T) {
assert.Panics(t, func() {
Redoc(RedocOpts{
Template: `
spec-url='{{ .Spec
`,
}, nil)
})
})
t.Run("with custom template that fails to execute", func(t *testing.T) {
assert.Panics(t, func() {
Redoc(RedocOpts{
Template: `
spec-url='{{ .Unknown }}'
`,
}, nil)
})
})
})
}