@@ -3,21 +3,22 @@ package httpmw
3
3
import (
4
4
"context"
5
5
"net/http"
6
+ "net/http/httptest"
6
7
"testing"
7
8
"time"
8
9
9
10
"cdr.dev/slog"
10
11
"cdr.dev/slog/sloggers/slogtest"
12
+ "github.com/coder/coder/v2/coderd/tracing"
11
13
)
12
14
13
15
func TestRequestLoggerContext_WriteLog (t * testing.T ) {
14
16
t .Parallel ()
15
17
ctx := context .Background ()
16
18
17
19
testLogger := slogtest .Make (t ,nil )
18
- startTime := time .Now ()
19
20
20
- logCtx := NewRequestLoggerContext (testLogger ,"GET" ,startTime )
21
+ logCtx := NewRequestLoggerContext (testLogger ,"GET" ,time . Now () )
21
22
22
23
// Add custom fields
23
24
logCtx .WithFields (
@@ -35,3 +36,37 @@ func TestRequestLoggerContext_WriteLog(t *testing.T) {
35
36
// slogtest will fail the test.
36
37
logCtx .WriteLog (ctx ,http .StatusInternalServerError )
37
38
}
39
+
40
+ func TestLoggerMiddleware (t * testing.T ) {
41
+ t .Parallel ()
42
+
43
+ // Create a test logger
44
+ testLogger := slogtest .Make (t ,nil )
45
+
46
+ // Create a test handler to simulate an HTTP request
47
+ testHandler := http .HandlerFunc (func (rw http.ResponseWriter ,r * http.Request ) {
48
+ rw .WriteHeader (http .StatusOK )
49
+ _ ,_ = rw .Write ([]byte ("OK" ))
50
+ })
51
+
52
+ // Wrap the test handler with the Logger middleware
53
+ loggerMiddleware := Logger (testLogger )
54
+ wrappedHandler := loggerMiddleware (testHandler )
55
+
56
+ // Create a test HTTP request
57
+ req ,err := http .NewRequestWithContext (context .Background (),http .MethodGet ,"/test-path" ,nil )
58
+ if err != nil {
59
+ t .Fatalf ("failed to create request: %v" ,err )
60
+ }
61
+
62
+ sw := & tracing.StatusWriter {ResponseWriter :httptest .NewRecorder ()}
63
+
64
+ // Serve the request
65
+ wrappedHandler .ServeHTTP (sw ,req )
66
+
67
+ logCtx := RequestLoggerFromContext (context .Background ())
68
+ // Verify that the log was written
69
+ if logCtx != nil && ! logCtx .written {
70
+ t .Error ("expected log to be written exactly once" )
71
+ }
72
+ }