@@ -13,6 +13,7 @@ import (
1313 "sync"
1414 "sync/atomic"
1515 "testing"
16+ "time"
1617
1718 "github.com/goptics/vizb/cmd/cli"
1819 internalcharts "github.com/goptics/vizb/internal/charts"
@@ -84,13 +85,20 @@ func (s *ServeSuite) TestRoutesRegisterOnlyTheThreePOSTOperations() {
8485 s .True (called [test .name ])
8586 }
8687
87- for _ , request := range []* http.Request {
88- httptest .NewRequest (http .MethodGet , "/" , nil ),
89- httptest .NewRequest (http .MethodPost , "/unknown" , nil ),
88+ for _ , test := range []struct {
89+ request * http.Request
90+ status int
91+ allow string
92+ }{
93+ {request : httptest .NewRequest (http .MethodGet , "/" , nil ), status : http .StatusMethodNotAllowed , allow : http .MethodPost },
94+ {request : httptest .NewRequest (http .MethodPost , "/unknown" , nil ), status : http .StatusNotFound },
9095 } {
9196 recorder := httptest .NewRecorder ()
92- routes .ServeHTTP (recorder , request )
93- s .Contains ([]int {http .StatusMethodNotAllowed , http .StatusNotFound }, recorder .Code )
97+ routes .ServeHTTP (recorder , test .request )
98+ s .Equal (test .status , recorder .Code )
99+ s .Equal (test .allow , recorder .Header ().Get ("Allow" ))
100+ s .Contains (recorder .Header ().Get ("Content-Type" ), "application/problem+json" )
101+ s .Equal (float64 (test .status ), s .problemStatus (recorder ))
94102 }
95103}
96104
@@ -153,9 +161,9 @@ func (s *ServeSuite) TestCancellationShutsDownInMemoryListener() {
153161 listen : func (string , string ) (net.Listener , error ) { return listener , nil },
154162 })
155163 }()
156- <- listener .acceptStarted
164+ receiveWithin ( s . T (), listener .acceptStarted )
157165 cancel ()
158- s .Require ().NoError (<- result )
166+ s .Require ().NoError (receiveWithin ( s . T (), result ) )
159167}
160168
161169func (s * ServeSuite ) TestCancellationTriggersGracefulShutdown () {
@@ -175,9 +183,9 @@ func (s *ServeSuite) TestCancellationTriggersGracefulShutdown() {
175183 })
176184 }()
177185
178- <- listener .acceptStarted
186+ receiveWithin ( s . T (), listener .acceptStarted )
179187 cancel ()
180- s .Require ().NoError (<- result )
188+ s .Require ().NoError (receiveWithin ( s . T (), result ) )
181189 s .True (shutdownCalled .Load ())
182190}
183191
@@ -192,15 +200,14 @@ func (s *ServeSuite) TestShutdownFailureIsReturned() {
192200 newHandler : http .NotFoundHandler ,
193201 listen : func (string , string ) (net.Listener , error ) { return listener , nil },
194202 shutdown : func (server * http.Server , _ context.Context ) error {
195- _ = server .Close ()
196203 return errors .New ("drain failed" )
197204 },
198205 })
199206 }()
200207
201- <- listener .acceptStarted
208+ receiveWithin ( s . T (), listener .acceptStarted )
202209 cancel ()
203- s .EqualError (<- result , "shutdown HTTP server: drain failed" )
210+ s .EqualError (receiveWithin ( s . T (), result ) , "shutdown HTTP server: drain failed" )
204211}
205212
206213func (s * ServeSuite ) TestServeFailureDuringShutdownIsReturned () {
@@ -219,9 +226,9 @@ func (s *ServeSuite) TestServeFailureDuringShutdownIsReturned() {
219226 })
220227 }()
221228
222- <- listener .acceptStarted
229+ receiveWithin ( s . T (), listener .acceptStarted )
223230 cancel ()
224- s .EqualError (<- result , "serve HTTP: accept failed during shutdown" )
231+ s .EqualError (receiveWithin ( s . T (), result ) , "serve HTTP: accept failed during shutdown" )
225232}
226233
227234func (s * ServeSuite ) TestServeAddress () {
@@ -946,6 +953,18 @@ func (s *ServeSuite) inlineInput(raw string) []byte {
946953 return input
947954}
948955
956+ func receiveWithin [T any ](t * testing.T , channel <- chan T ) T {
957+ t .Helper ()
958+ select {
959+ case value := <- channel :
960+ return value
961+ case <- time .After (time .Second ):
962+ t .Fatal ("timed out waiting for asynchronous operation" )
963+ var zero T
964+ return zero
965+ }
966+ }
967+
949968type testAddr string
950969
951970func (a testAddr ) Network () string { return "tcp" }
0 commit comments