github.com/xmidt-org/webpa-common@v1.11.9/bookkeeping/requestResponse_test.go (about) 1 package bookkeeping 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 "reflect" 8 "strconv" 9 "strings" 10 "testing" 11 12 "github.com/davecgh/go-spew/spew" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func testHeaders(t *testing.T, originalHeader http.Header, headersToCopy []string, expectedKeyValues []interface{}) { 18 var ( 19 assert = assert.New(t) 20 require = require.New(t) 21 22 request = &http.Request{ 23 Header: originalHeader, 24 } 25 26 rf = RequestHeaders(headersToCopy...) 27 ) 28 29 require.NotNil(rf) 30 returnedKeyValuePair := rf(request) 31 assert.Equal(expectedKeyValues, returnedKeyValuePair) 32 } 33 34 func TestBookkeepingHeaders(t *testing.T) { 35 testData := []struct { 36 originalHeader http.Header 37 headersToCopy []string 38 expectedResponse []interface{} 39 }{ 40 { 41 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 42 nil, 43 []interface{}{}, 44 }, 45 { 46 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 47 []string{"X-Does-Not-Exist"}, 48 []interface{}{}, 49 }, 50 { 51 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 52 []string{"X-Does-Not-Exist", "X-Test-1"}, 53 []interface{}{"X-Test-1", []string{"foo"}}, 54 }, 55 { 56 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 57 []string{"X-Does-Not-Exist", "x-test-1"}, 58 []interface{}{"X-Test-1", []string{"foo"}}, 59 }, 60 { 61 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 62 []string{"X-Test-1"}, 63 []interface{}{"X-Test-1", []string{"foo"}}, 64 }, 65 { 66 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 67 []string{"X-Test-3", "X-Test-1"}, 68 []interface{}{"X-Test-1", []string{"foo"}}, 69 }, 70 { 71 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 72 []string{"x-TeST-3", "X-tESt-1"}, 73 []interface{}{"X-Test-1", []string{"foo"}}, 74 }, 75 { 76 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 77 []string{"X-Test-3", "X-Test-1", "X-Test-2"}, 78 []interface{}{"X-Test-1", []string{"foo"}, "X-Test-2", []string{"foo", "bar"}}, 79 }, 80 { 81 http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}, 82 []string{"X-TEST-3", "x-TEsT-1", "x-TesT-2"}, 83 []interface{}{"X-Test-1", []string{"foo"}, "X-Test-2", []string{"foo", "bar"}}, 84 }, 85 } 86 87 for i, record := range testData { 88 t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { 89 t.Logf("%#v", record) 90 testHeaders(t, record.originalHeader, record.headersToCopy, record.expectedResponse) 91 }) 92 } 93 } 94 95 func testReturnHeadersWithPrefix(t *testing.T, request *http.Request, headerPrefixToCopy []string, expectedKV []interface{}) { 96 var ( 97 require = require.New(t) 98 rf = RequestHeadersWithPrefix(headerPrefixToCopy...) 99 ) 100 101 require.NotNil(rf) 102 kv := rf(request) 103 104 f := func(i []interface{}, c chan<- map[string]interface{}) { 105 m := make(map[string]interface{}) 106 for _, v := range i { 107 m["test"] = v 108 } 109 110 c <- m 111 } 112 113 c1, c2 := make(chan map[string]interface{}), make(chan map[string]interface{}) 114 go f(kv, c1) 115 go f(expectedKV, c2) 116 117 kvMap, expectedkvMap := <-c1, <-c2 118 119 if ok := reflect.DeepEqual(expectedKV, kv); !ok { 120 t.Errorf("\nExpecting: %v\n but got: %v\n", spew.Sdump(expectedkvMap), spew.Sdump(kvMap)) 121 } 122 } 123 124 func TestReturnHeadersWithPrefix(t *testing.T) { 125 testData := []struct { 126 request *http.Request 127 prefixs []string 128 expectedKV []interface{} 129 }{ 130 { 131 nil, 132 nil, 133 []interface{}{}, 134 }, 135 { 136 &http.Request{}, 137 nil, 138 []interface{}{}, 139 }, 140 { 141 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}}}, 142 nil, 143 []interface{}{}, 144 }, 145 { 146 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 147 []string{"X-Does-Not-Exist"}, 148 []interface{}{}, 149 }, 150 { 151 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 152 []string{"X-Does-Not-Exist", "X-Test-1"}, 153 []interface{}{"X-Test-1", []string{"foo"}}, 154 }, 155 { 156 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 157 []string{"X-Does-Not-Exist", "x-TeSt-1"}, 158 []interface{}{"X-Test-1", []string{"foo"}}, 159 }, 160 { 161 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 162 []string{"X-Test-3", "X-Test-1"}, 163 []interface{}{"X-Test-1", []string{"foo"}}, 164 }, 165 { 166 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 167 []string{"x-TeST-3", "X-tESt-1"}, 168 []interface{}{"X-Test-1", []string{"foo"}}, 169 }, 170 { 171 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 172 []string{"X-Test-3", "X-Test-1", "X-Test-2"}, 173 []interface{}{"X-Test-1", []string{"foo"}, "X-Test-2", []string{"foo", "bar"}}, 174 }, 175 { 176 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 177 []string{"X-TEST-3", "x-TEsT-1", "x-TesT-2"}, 178 []interface{}{"X-Test-1", []string{"foo"}, "X-Test-2", []string{"foo", "bar"}}, 179 }, 180 { 181 &http.Request{Header: http.Header{"X-Test-1": []string{"foo"}, "X-Test-2": []string{"foo", "bar"}, "X-Test-3": []string{}}}, 182 []string{"X-TEST"}, 183 []interface{}{"X-Test-1", []string{"foo"}, "X-Test-2", []string{"foo", "bar"}}, 184 }, 185 } 186 187 for i, record := range testData { 188 t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { 189 t.Logf("%#v", record) 190 testReturnHeadersWithPrefix(t, record.request, record.prefixs, record.expectedKV) 191 }) 192 } 193 } 194 195 func testRequestBody(t *testing.T, request *http.Request, expectedKV []interface{}) { 196 assert := assert.New(t) 197 198 var kv []interface{} 199 assert.NotPanics(func() { 200 kv = RequestBody(request) 201 }) 202 assert.Equal(expectedKV, kv) 203 } 204 205 func TestRequestBody(t *testing.T) { 206 testData := []struct { 207 request *http.Request 208 expected []interface{} 209 }{ 210 {httptest.NewRequest("POST", "http://foobar.com:8080", nil), []interface{}{"req-body", "empty body"}}, 211 {httptest.NewRequest("POST", "http://foobar.com:8080", strings.NewReader("payload")), []interface{}{"req-body", "payload"}}, 212 } 213 for i, record := range testData { 214 t.Run(strconv.Itoa(i), func(t *testing.T) { 215 t.Logf("%#v", record) 216 testRequestBody(t, record.request, record.expected) 217 }) 218 } 219 } 220 221 func testResponseBody(t *testing.T, response CapturedResponse, expectedKV []interface{}) { 222 assert := assert.New(t) 223 224 var kv []interface{} 225 assert.NotPanics(func() { 226 kv = ResponseBody(response) 227 }) 228 assert.Equal(expectedKV, kv) 229 } 230 231 func TestResponseBody(t *testing.T) { 232 testData := []struct { 233 response CapturedResponse 234 expected []interface{} 235 }{ 236 {CapturedResponse{}, []interface{}{"res-body", "empty body"}}, 237 {CapturedResponse{Payload: []byte("payload")}, []interface{}{"res-body", "payload"}}, 238 } 239 for i, record := range testData { 240 t.Run(strconv.Itoa(i), func(t *testing.T) { 241 t.Logf("%#v", record) 242 testResponseBody(t, record.response, record.expected) 243 }) 244 } 245 }