1 package httpbinding
2
3 import (
4 "net/http"
5 "net/url"
6 "reflect"
7 "testing"
8 )
9
10 func TestEncoder(t *testing.T) {
11 actual := &http.Request{
12 Header: http.Header{
13 "custom-user-header": {"someValue"},
14 },
15 URL: &url.URL{
16 Path: "/some/{pathKeyOne}/{pathKeyTwo}",
17 RawQuery: "someExistingKeys=foobar",
18 },
19 }
20
21 expected := &http.Request{
22 Header: map[string][]string{
23 "custom-user-header": {"someValue"},
24 "x-amzn-header-foo": {"someValue"},
25 "x-amzn-meta-foo": {"someValue"},
26 },
27 URL: &url.URL{
28 Path: "/some/someValue/path",
29 RawPath: "/some/someValue/path",
30 RawQuery: "someExistingKeys=foobar&someKey=someValue&someKey=otherValue",
31 },
32 }
33
34 encoder, err := NewEncoder(actual.URL.Path, actual.URL.RawQuery, actual.Header)
35 if err != nil {
36 t.Fatalf("expected no error, got %v", err)
37 }
38
39
40 encoder.AddHeader("x-amzn-header-foo").String("someValue")
41 encoder.Headers("x-amzn-meta-").AddHeader("foo").String("someValue")
42
43
44 encoder.SetQuery("someKey").String("someValue")
45 encoder.AddQuery("someKey").String("otherValue")
46
47
48 if err := encoder.SetURI("pathKeyOne").String("someValue"); err != nil {
49 t.Errorf("expected no err, but got %v", err)
50 }
51
52
53 if err := encoder.SetURI("pathKeyTwo").String("path"); err != nil {
54 t.Errorf("expected no err, but got %v", err)
55 }
56
57 if actual, err = encoder.Encode(actual); err != nil {
58 t.Errorf("expected no err, but got %v", err)
59 }
60
61 if !reflect.DeepEqual(expected, actual) {
62 t.Errorf("expected %v, but got %v", expected, actual)
63 }
64 }
65
66 func TestEncoderHasHeader(t *testing.T) {
67 encoder, err := NewEncoder("/", "", http.Header{})
68 if err != nil {
69 t.Fatalf("expected no error, got %v", err)
70 }
71
72 if h := "i-dont-exist"; encoder.HasHeader(h) {
73 t.Errorf("expect %v not to be set", h)
74 }
75
76 encoder.AddHeader("I-do-exist").String("some value")
77
78 if h := "I-do-exist"; !encoder.HasHeader(h) {
79 t.Errorf("expect %v to be set", h)
80 }
81
82 }
83
84 func TestEncoderHasQuery(t *testing.T) {
85 encoder, err := NewEncoder("/", "", http.Header{})
86 if err != nil {
87 t.Fatalf("expected no error, got %v", err)
88 }
89
90 if q := "i-dont-exist"; encoder.HasQuery(q) {
91 t.Errorf("expect %v not to be set", q)
92 }
93
94 encoder.AddQuery("I-do-exist").String("some value")
95
96 if q := "I-do-exist"; !encoder.HasQuery(q) {
97 t.Errorf("expect %v to be set", q)
98 }
99
100 }
101
102 func TestEncodeContentLength(t *testing.T) {
103 cases := map[string]struct {
104 headerValue string
105 expected int64
106 wantErr bool
107 }{
108 "valid number": {
109 headerValue: "1024",
110 expected: 1024,
111 },
112 "invalid number": {
113 headerValue: "1024.5",
114 wantErr: true,
115 },
116 "not a number": {
117 headerValue: "NaN",
118 wantErr: true,
119 },
120 }
121
122 for name, tt := range cases {
123 t.Run(name, func(t *testing.T) {
124 encoder, err := NewEncoder("/", "", http.Header{})
125 if err != nil {
126 t.Fatalf("expect no error, got %v", err)
127 }
128
129 encoder.SetHeader("Content-Length").String(tt.headerValue)
130
131 req := &http.Request{URL: &url.URL{}}
132 req, err = encoder.Encode(req)
133 if (err != nil) != tt.wantErr {
134 t.Fatalf("unexpected error value wantErr=%v", tt.wantErr)
135 } else if tt.wantErr {
136 return
137 }
138 if e, a := tt.expected, req.ContentLength; e != a {
139 t.Errorf("expect %v, got %v", e, a)
140 }
141 if v := req.Header.Get("Content-Length"); len(v) > 0 {
142 t.Errorf("expect header not to be set")
143 }
144 })
145 }
146 }
147
View as plain text