1 package middleware
2
3 import (
4 "bytes"
5 stdcontext "context"
6 "log"
7 "net/http"
8 "net/http/httptest"
9 "testing"
10
11 "github.com/go-openapi/runtime/internal/testing/petstore"
12 "github.com/go-openapi/runtime/logger"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
15 )
16
17 type customLogger struct {
18 logger.StandardLogger
19 lg *log.Logger
20 }
21
22 func (l customLogger) Debugf(format string, args ...interface{}) {
23 l.lg.Printf(format, args...)
24 }
25
26 func TestDebugMode(t *testing.T) {
27 t.Run("with normal mode", func(t *testing.T) {
28 t.Setenv("DEBUG", "")
29
30 logFunc := debugLogfFunc(nil)
31 require.NotNil(t, logFunc)
32 })
33
34 t.Run("with debug mode", func(t *testing.T) {
35 t.Setenv("DEBUG", "true")
36
37 t.Run("debugLogFunc with nil logger yields standard logger", func(t *testing.T) {
38 logFunc := debugLogfFunc(nil)
39 require.NotNil(t, logFunc)
40 })
41 t.Run("debugLogFunc with custom logger", func(t *testing.T) {
42 var capture bytes.Buffer
43 logger := customLogger{lg: log.New(&capture, "test", log.Lshortfile)}
44 logFunc := debugLogfFunc(logger)
45 require.NotNil(t, logFunc)
46
47 logFunc("debug")
48 assert.NotEmpty(t, capture.String())
49 })
50 })
51 }
52
53 func TestDebugRouterOptions(t *testing.T) {
54 t.Run("with normal mode", func(t *testing.T) {
55 t.Setenv("DEBUG", "")
56
57 t.Run("should capture debug from context & router", func(t *testing.T) {
58 var capture bytes.Buffer
59 logger := customLogger{lg: log.New(&capture, "test", log.Lshortfile)}
60
61 t.Run("run some activiy", doCheckWithContext(logger))
62 assert.Empty(t, capture.String())
63 })
64
65 t.Run("should capture debug from standalone DefaultRouter", func(t *testing.T) {
66 var capture bytes.Buffer
67 logger := customLogger{lg: log.New(&capture, "test", log.Lshortfile)}
68
69 t.Run("run some activiy", doCheckWithDefaultRouter(logger))
70 assert.Empty(t, capture.String())
71 })
72 })
73
74 t.Run("with debug mode", func(t *testing.T) {
75 t.Setenv("DEBUG", "1")
76
77 t.Run("should capture debug from context & router", func(t *testing.T) {
78 var capture bytes.Buffer
79 logger := customLogger{lg: log.New(&capture, "test", log.Lshortfile)}
80
81 t.Run("run some activiy", doCheckWithContext(logger))
82 assert.NotEmpty(t, capture.String())
83 })
84
85 t.Run("should capture debug from standalone DefaultRouter", func(t *testing.T) {
86 var capture bytes.Buffer
87 logger := customLogger{lg: log.New(&capture, "test", log.Lshortfile)}
88
89 t.Run("run some activiy", doCheckWithDefaultRouter(logger))
90 assert.NotEmpty(t, capture.String())
91 })
92 })
93 }
94
95 func doCheckWithContext(logger logger.Logger) func(*testing.T) {
96 return func(t *testing.T) {
97 spec, api := petstore.NewAPI(t)
98 context := NewContext(spec, api, nil)
99 context.SetLogger(logger)
100 mw := NewRouter(context, http.HandlerFunc(terminator))
101
102 recorder := httptest.NewRecorder()
103 request, err := http.NewRequestWithContext(stdcontext.Background(), http.MethodGet, "/api/pets", nil)
104 require.NoError(t, err)
105 mw.ServeHTTP(recorder, request)
106 assert.Equal(t, http.StatusOK, recorder.Code)
107 }
108 }
109
110 func doCheckWithDefaultRouter(lg logger.Logger) func(*testing.T) {
111 return func(t *testing.T) {
112 spec, api := petstore.NewAPI(t)
113 context := NewContext(spec, api, nil)
114 context.SetLogger(lg)
115 router := DefaultRouter(
116 spec,
117 newRoutableUntypedAPI(spec, api, new(Context)),
118 WithDefaultRouterLogger(lg))
119
120 _ = router.OtherMethods("post", "/api/pets/{id}")
121 }
122 }
123
View as plain text