@@ -5,13 +5,15 @@ package herodot
55
66import (
77 "bytes"
8+ "context"
89 "encoding/json"
910 stderr "errors"
1011 "fmt"
1112 "io"
1213 "net/http"
1314 "net/http/httptest"
1415 "testing"
16+ "time"
1517
1618 "github.com/pkg/errors"
1719 "github.com/stretchr/testify/assert"
@@ -260,3 +262,30 @@ func TestWriteCodeJSONUnescapedHTML(t *testing.T) {
260262 assert .Equal (t , fmt .Sprintf ("\" %s\" \n " , foo ), string (result ))
261263 assert .Equal (t , http .StatusOK , resp .StatusCode )
262264}
265+
266+ func TestCanceledJSON (t * testing.T ) {
267+ h := NewJSONWriter (nil )
268+ rec := httptest .NewRecorder ()
269+ done := make (chan struct {})
270+ ts := httptest .NewServer (http .HandlerFunc (func (_ http.ResponseWriter , r * http.Request ) {
271+ defer close (done )
272+ <- r .Context ().Done ()
273+ h .WriteError (rec , r , errors .New ("some unrelated error" ))
274+ }))
275+ defer ts .Close ()
276+
277+ ctx , cancel := context .WithTimeout (context .Background (), 200 * time .Millisecond )
278+ defer cancel ()
279+ req , err := http .NewRequestWithContext (ctx , "GET" , ts .URL , nil )
280+ require .NoError (t , err )
281+
282+ _ , err = ts .Client ().Do (req )
283+ require .ErrorIs (t , err , context .DeadlineExceeded )
284+
285+ <- done
286+ resp := rec .Result ()
287+ body , err := io .ReadAll (resp .Body )
288+ require .NoError (t , err )
289+ assert .Contains (t , string (body ), "some unrelated error" )
290+ assert .Equal (t , 499 , resp .StatusCode )
291+ }
0 commit comments