@@ -18,9 +18,14 @@ import (
18
18
"bytes"
19
19
"encoding/json"
20
20
"encoding/xml"
21
+ "errors"
22
+ "io"
21
23
"io/ioutil"
22
24
"mime"
23
25
"mime/multipart"
26
+ "net/http"
27
+ "net/http/httptest"
28
+ "net/url"
24
29
"os"
25
30
"path/filepath"
26
31
"strings"
@@ -29,6 +34,7 @@ import (
29
34
"github.com/go-openapi/runtime"
30
35
"github.com/go-openapi/strfmt"
31
36
"github.com/stretchr/testify/assert"
37
+ "github.com/stretchr/testify/require"
32
38
)
33
39
34
40
var testProducers = map [string ]runtime.Producer {
@@ -509,3 +515,81 @@ func TestBuildRequest_BuildHTTP_EscapedPath(t *testing.T) {
509
515
assert .Equal (t , runtime .JSONMime , req .Header .Get (runtime .HeaderContentType ))
510
516
}
511
517
}
518
+
519
+ type testReqFn func (* testing.T , * http.Request )
520
+
521
+ type testRoundTripper struct {
522
+ tr http.RoundTripper
523
+ testFn testReqFn
524
+ testHarness * testing.T
525
+ }
526
+
527
+ func (t * testRoundTripper ) RoundTrip (req * http.Request ) (resp * http.Response , err error ) {
528
+ t .testFn (t .testHarness , req )
529
+ return t .tr .RoundTrip (req )
530
+ }
531
+
532
+ func TestGetBodyCallsBeforeRoundTrip (t * testing.T ) {
533
+
534
+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
535
+ rw .WriteHeader (http .StatusCreated )
536
+ _ , err := rw .Write ([]byte ("test result" ))
537
+ require .NoError (t , err )
538
+ }))
539
+ defer server .Close ()
540
+ hu , _ := url .Parse (server .URL )
541
+
542
+ client := http .DefaultClient
543
+ transport := http .DefaultTransport
544
+
545
+ client .Transport = & testRoundTripper {
546
+ tr : transport ,
547
+ testHarness : t ,
548
+ testFn : func (t * testing.T , req * http.Request ) {
549
+ // Read the body once before sending the request
550
+ body , err := req .GetBody ()
551
+ require .NoError (t , err )
552
+ bodyContent , err := ioutil .ReadAll (io .Reader (body ))
553
+ require .EqualValues (t , req .ContentLength , len (bodyContent ))
554
+ require .NoError (t , err )
555
+ require .EqualValues (t , "\" test body\" \n " , string (bodyContent ))
556
+
557
+ // Read the body a second time before sending the request
558
+ body , err = req .GetBody ()
559
+ require .NoError (t , err )
560
+ bodyContent , err = ioutil .ReadAll (io .Reader (body ))
561
+ require .NoError (t , err )
562
+ require .EqualValues (t , req .ContentLength , len (bodyContent ))
563
+ require .EqualValues (t , "\" test body\" \n " , string (bodyContent ))
564
+ },
565
+ }
566
+
567
+ rwrtr := runtime .ClientRequestWriterFunc (func (req runtime.ClientRequest , _ strfmt.Registry ) error {
568
+ return req .SetBodyParam ("test body" )
569
+ })
570
+
571
+ operation := & runtime.ClientOperation {
572
+ ID : "getSites" ,
573
+ Method : "POST" ,
574
+ PathPattern : "/" ,
575
+ Params : rwrtr ,
576
+ Client : client ,
577
+ Reader : runtime .ClientResponseReaderFunc (func (response runtime.ClientResponse , consumer runtime.Consumer ) (interface {}, error ) {
578
+ if response .Code () == http .StatusCreated {
579
+ var result string
580
+ if err := consumer .Consume (response .Body (), & result ); err != nil {
581
+ return nil , err
582
+ }
583
+ return result , nil
584
+ }
585
+ return nil , errors .New ("Unexpected error code" )
586
+ }),
587
+ }
588
+
589
+ openAPIClient := New (hu .Host , "/" , []string {"http" })
590
+ res , err := openAPIClient .Submit (operation )
591
+
592
+ require .NoError (t , err )
593
+ actual := res .(string )
594
+ require .EqualValues (t , "test result" , actual )
595
+ }
0 commit comments