1package request
2
3import (
4	"bytes"
5	"io"
6	"net/http"
7	"strings"
8	"testing"
9
10	"github.com/aws/aws-sdk-go/aws"
11)
12
13func TestResetBody_WithBodyContents(t *testing.T) {
14	r := Request{
15		HTTPRequest: &http.Request{},
16	}
17
18	reader := strings.NewReader("abc")
19	r.Body = reader
20
21	r.ResetBody()
22
23	if v, ok := r.HTTPRequest.Body.(*offsetReader); !ok || v == nil {
24		t.Errorf("expected request body to be set to reader, got %#v",
25			r.HTTPRequest.Body)
26	}
27}
28
29type mockReader struct{}
30
31func (mockReader) Read([]byte) (int, error) {
32	return 0, io.EOF
33}
34
35func TestResetBody_ExcludeEmptyUnseekableBodyByMethod(t *testing.T) {
36	cases := []struct {
37		Method   string
38		Body     io.ReadSeeker
39		IsNoBody bool
40	}{
41		{
42			Method:   "GET",
43			IsNoBody: true,
44			Body:     aws.ReadSeekCloser(mockReader{}),
45		},
46		{
47			Method:   "HEAD",
48			IsNoBody: true,
49			Body:     aws.ReadSeekCloser(mockReader{}),
50		},
51		{
52			Method:   "DELETE",
53			IsNoBody: true,
54			Body:     aws.ReadSeekCloser(mockReader{}),
55		},
56		{
57			Method:   "PUT",
58			IsNoBody: false,
59			Body:     aws.ReadSeekCloser(mockReader{}),
60		},
61		{
62			Method:   "PATCH",
63			IsNoBody: false,
64			Body:     aws.ReadSeekCloser(mockReader{}),
65		},
66		{
67			Method:   "POST",
68			IsNoBody: false,
69			Body:     aws.ReadSeekCloser(mockReader{}),
70		},
71		{
72			Method:   "GET",
73			IsNoBody: false,
74			Body:     aws.ReadSeekCloser(bytes.NewBuffer([]byte("abc"))),
75		},
76		{
77			Method:   "GET",
78			IsNoBody: true,
79			Body:     aws.ReadSeekCloser(bytes.NewBuffer(nil)),
80		},
81		{
82			Method:   "POST",
83			IsNoBody: false,
84			Body:     aws.ReadSeekCloser(bytes.NewBuffer([]byte("abc"))),
85		},
86		{
87			Method:   "POST",
88			IsNoBody: true,
89			Body:     aws.ReadSeekCloser(bytes.NewBuffer(nil)),
90		},
91	}
92
93	for i, c := range cases {
94		r := Request{
95			HTTPRequest: &http.Request{},
96			Operation: &Operation{
97				HTTPMethod: c.Method,
98			},
99		}
100		r.SetReaderBody(c.Body)
101
102		if a, e := r.HTTPRequest.Body == NoBody, c.IsNoBody; a != e {
103			t.Errorf("%d, expect body to be set to noBody(%t), but was %t", i, e, a)
104		}
105	}
106
107}
108