1package query
2
3import (
4	"bytes"
5	"context"
6	"testing"
7
8	"github.com/aws/smithy-go/middleware"
9	smithyhttp "github.com/aws/smithy-go/transport/http"
10)
11
12func TestAsGetRequestMiddleware(t *testing.T) {
13	cases := map[string]struct {
14		Request *smithyhttp.Request
15		Expect  *smithyhttp.Request
16	}{
17		"post": {
18			Request: func() *smithyhttp.Request {
19				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
20				req.Method = "POST"
21				req, _ = req.SetStream(bytes.NewReader([]byte("some=field")))
22
23				return req
24			}(),
25			Expect: func() *smithyhttp.Request {
26				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
27				req.Method = "GET"
28				req.URL.RawQuery = "some=field"
29
30				return req
31			}(),
32		},
33		"get": {
34			Request: func() *smithyhttp.Request {
35				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
36				req.Method = "GET"
37				req.URL.RawQuery = "existing=query"
38
39				return req
40			}(),
41			Expect: func() *smithyhttp.Request {
42				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
43				req.Method = "GET"
44				req.URL.RawQuery = "existing=query"
45
46				return req
47			}(),
48		},
49
50		"get with stream": {
51			Request: func() *smithyhttp.Request {
52				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
53				req.Method = "GET"
54				req.URL.RawQuery = "existing=query"
55				req, _ = req.SetStream(bytes.NewReader([]byte("some=field")))
56
57				return req
58			}(),
59			Expect: func() *smithyhttp.Request {
60				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
61				req.Method = "GET"
62				req.URL.RawQuery = "existing=query&some=field"
63
64				return req
65			}(),
66		},
67
68		"with query": {
69			Request: func() *smithyhttp.Request {
70				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
71				req.Method = "POST"
72				req.URL.RawQuery = "existing=query"
73				req, _ = req.SetStream(bytes.NewReader([]byte("some=field")))
74
75				return req
76			}(),
77			Expect: func() *smithyhttp.Request {
78				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
79				req.Method = "GET"
80				req.URL.RawQuery = "existing=query&some=field"
81
82				return req
83			}(),
84		},
85
86		"no body": {
87			Request: func() *smithyhttp.Request {
88				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
89				req.Method = "POST"
90
91				return req
92			}(),
93			Expect: func() *smithyhttp.Request {
94				req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
95				req.Method = "GET"
96
97				return req
98			}(),
99		},
100	}
101
102	for name, c := range cases {
103		t.Run(name, func(t *testing.T) {
104			m := &asGetRequest{}
105
106			_, _, err := m.HandleSerialize(context.Background(), middleware.SerializeInput{
107				Parameters: struct{}{},
108				Request:    c.Request,
109			}, middleware.SerializeHandlerFunc(func(
110				ctx context.Context, input middleware.SerializeInput,
111			) (
112				out middleware.SerializeOutput, metadata middleware.Metadata, err error,
113			) {
114				req, ok := input.Request.(*smithyhttp.Request)
115				if !ok {
116					t.Fatalf("expect smithy HTTP request, got %T", input.Request)
117				}
118
119				if e, a := c.Expect.URL.RawQuery, req.URL.RawQuery; e != a {
120					t.Errorf("expect %s query, got %s", e, a)
121				}
122
123				if v := req.GetStream(); v != nil {
124					t.Errorf("expect no request body, got %v", v)
125				}
126
127				return out, metadata, err
128			}))
129			if err != nil {
130				t.Fatalf("expect no error, got %v", err)
131			}
132		})
133	}
134}
135