66 "encoding/json"
77 "errors"
88 "fmt"
9+ "log/slog"
910 "net/http"
1011 "net/http/httptest"
1112 "testing"
@@ -25,6 +26,7 @@ func TestMountAndServe(t *testing.T) {
2526 ctx := context .Background ()
2627
2728 type testBundle struct {
29+ logger * slog.Logger
2830 recorder * httptest.ResponseRecorder
2931 }
3032
@@ -41,6 +43,7 @@ func TestMountAndServe(t *testing.T) {
4143 Mount (mux , & postEndpoint {}, opts )
4244
4345 return mux , & testBundle {
46+ logger : logger ,
4447 recorder : httptest .NewRecorder (),
4548 }
4649 }
@@ -68,6 +71,28 @@ func TestMountAndServe(t *testing.T) {
6871 requireStatusAndJSONResponse (t , http .StatusOK , & postResponse {Message : "Hello." }, bundle .recorder )
6972 })
7073
74+ t .Run ("MaxBodyBytes" , func (t * testing.T ) {
75+ t .Parallel ()
76+
77+ _ , bundle := setup (t )
78+
79+ payload := mustMarshalJSON (t , & postRequest {Message : "Hello." })
80+
81+ mux := http .NewServeMux ()
82+ endpoint := & postEndpoint {MaxBodyBytes : int64 (len (payload ))}
83+ Mount (mux , endpoint , & MountOpts {Logger : bundle .logger })
84+
85+ req := httptest .NewRequest (http .MethodPost , "/api/post-endpoint" , bytes .NewBuffer (payload ))
86+ mux .ServeHTTP (bundle .recorder , req )
87+ requireStatusAndResponse (t , http .StatusCreated , `{"message":"Hello."}` , bundle .recorder )
88+
89+ bundle .recorder = httptest .NewRecorder ()
90+ payload = mustMarshalJSON (t , & postRequest {Message : "Hello!!" }) // one longer than previous payload
91+ req = httptest .NewRequest (http .MethodPost , "/api/post-endpoint" , bytes .NewBuffer (payload ))
92+ mux .ServeHTTP (bundle .recorder , req )
93+ requireStatusAndJSONResponse (t , http .StatusRequestEntityTooLarge , & apierror.APIError {Message : "Request entity too large" }, bundle .recorder )
94+ })
95+
7196 t .Run ("MethodNotAllowed" , func (t * testing.T ) {
7297 t .Parallel ()
7398
@@ -275,12 +300,14 @@ func (a *getEndpoint) Execute(_ context.Context, req *getRequest) (*getResponse,
275300
276301type postEndpoint struct {
277302 Endpoint [postRequest , postResponse ]
303+ MaxBodyBytes int64
278304}
279305
280- func (* postEndpoint ) Meta () * EndpointMeta {
306+ func (a * postEndpoint ) Meta () * EndpointMeta {
281307 return & EndpointMeta {
282- Pattern : "POST /api/post-endpoint" ,
283- StatusCode : http .StatusCreated ,
308+ MaxBodyBytes : a .MaxBodyBytes ,
309+ Pattern : "POST /api/post-endpoint" ,
310+ StatusCode : http .StatusCreated ,
284311 }
285312}
286313
0 commit comments