github.com/xmidt-org/webpa-common@v1.11.9/service/servicehttp/decoders_test.go (about) 1 package servicehttp 2 3 import ( 4 "context" 5 "errors" 6 "net/http/httptest" 7 "testing" 8 9 "github.com/gorilla/mux" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 "github.com/xmidt-org/webpa-common/service" 13 ) 14 15 func testKeyFromHeaderBlankHeader(t *testing.T) { 16 assert := assert.New(t) 17 assert.Panics(func() { 18 KeyFromHeader("", func(string) (service.Key, error) { return nil, nil }) 19 }) 20 } 21 22 func testKeyFromHeaderNilParser(t *testing.T) { 23 assert := assert.New(t) 24 assert.Panics(func() { 25 KeyFromHeader("X-Something", nil) 26 }) 27 } 28 29 func testKeyFromHeaderMissingHeader(t *testing.T) { 30 var ( 31 assert = assert.New(t) 32 require = require.New(t) 33 httpRequest = httptest.NewRequest("GET", "/", nil) 34 ) 35 36 decoder := KeyFromHeader("X-Something", func(string) (service.Key, error) { 37 assert.Fail("The parser should not have been called") 38 return nil, nil 39 }) 40 41 require.NotNil(decoder) 42 43 key, err := decoder(context.Background(), httpRequest) 44 assert.Error(err) 45 assert.Nil(key) 46 } 47 48 func testKeyFromHeaderSuccess(t *testing.T) { 49 var ( 50 assert = assert.New(t) 51 require = require.New(t) 52 httpRequest = httptest.NewRequest("GET", "/", nil) 53 54 expectedHeaderValue = "expected header value" 55 expectedKey = service.StringKey("expected key") 56 ) 57 58 decoder := KeyFromHeader("X-Something", func(v string) (service.Key, error) { 59 assert.Equal(expectedHeaderValue, v) 60 return expectedKey, nil 61 }) 62 63 require.NotNil(decoder) 64 httpRequest.Header.Set("X-Something", expectedHeaderValue) 65 actualKey, err := decoder(context.Background(), httpRequest) 66 assert.NoError(err) 67 assert.Equal(expectedKey, actualKey) 68 } 69 70 func testKeyFromHeaderParserError(t *testing.T) { 71 var ( 72 assert = assert.New(t) 73 require = require.New(t) 74 httpRequest = httptest.NewRequest("GET", "/", nil) 75 76 expectedHeaderValue = "expected header value" 77 expectedError = errors.New("expected parser error") 78 ) 79 80 decoder := KeyFromHeader("X-Something", func(v string) (service.Key, error) { 81 assert.Equal(expectedHeaderValue, v) 82 return nil, expectedError 83 }) 84 85 require.NotNil(decoder) 86 httpRequest.Header.Set("X-Something", expectedHeaderValue) 87 key, actualError := decoder(context.Background(), httpRequest) 88 assert.Equal(expectedError, actualError) 89 assert.Nil(key) 90 } 91 92 func TestKeyFromHeader(t *testing.T) { 93 t.Run("BlankHeader", testKeyFromHeaderBlankHeader) 94 t.Run("NilParser", testKeyFromHeaderNilParser) 95 t.Run("MissingHeader", testKeyFromHeaderMissingHeader) 96 t.Run("Success", testKeyFromHeaderSuccess) 97 t.Run("ParserError", testKeyFromHeaderParserError) 98 } 99 100 func testKeyFromPathBlankVariable(t *testing.T) { 101 assert := assert.New(t) 102 assert.Panics(func() { 103 KeyFromPath("", func(string) (service.Key, error) { return nil, nil }) 104 }) 105 } 106 107 func testKeyFromPathNilParser(t *testing.T) { 108 assert := assert.New(t) 109 assert.Panics(func() { 110 KeyFromPath("id", nil) 111 }) 112 } 113 114 func testKeyFromPathSuccess(t *testing.T) { 115 var ( 116 assert = assert.New(t) 117 require = require.New(t) 118 119 expectedPathValue = "expected path value" 120 expectedKey = service.StringKey("expected key") 121 httpRequest = mux.SetURLVars( 122 httptest.NewRequest("GET", "/", nil), 123 map[string]string{"id": expectedPathValue}, 124 ) 125 ) 126 127 decoder := KeyFromPath("id", func(v string) (service.Key, error) { 128 assert.Equal(expectedPathValue, v) 129 return expectedKey, nil 130 }) 131 132 require.NotNil(decoder) 133 actualKey, err := decoder(context.Background(), httpRequest) 134 assert.NoError(err) 135 assert.Equal(expectedKey, actualKey) 136 } 137 138 func testKeyFromPathParserError(t *testing.T) { 139 var ( 140 assert = assert.New(t) 141 require = require.New(t) 142 143 expectedPathValue = "expected path value" 144 expectedError = errors.New("expected parser error") 145 httpRequest = mux.SetURLVars( 146 httptest.NewRequest("GET", "/", nil), 147 map[string]string{"id": expectedPathValue}, 148 ) 149 ) 150 151 decoder := KeyFromPath("id", func(v string) (service.Key, error) { 152 assert.Equal(expectedPathValue, v) 153 return nil, expectedError 154 }) 155 156 require.NotNil(decoder) 157 key, actualError := decoder(context.Background(), httpRequest) 158 assert.Equal(expectedError, actualError) 159 assert.Nil(key) 160 } 161 162 func testKeyFromPathMissingVars(t *testing.T) { 163 var ( 164 assert = assert.New(t) 165 require = require.New(t) 166 167 httpRequest = httptest.NewRequest("GET", "/", nil) 168 ) 169 170 decoder := KeyFromPath("id", func(v string) (service.Key, error) { 171 assert.Fail("The parser should not have been called") 172 return nil, nil 173 }) 174 175 require.NotNil(decoder) 176 key, err := decoder(context.Background(), httpRequest) 177 assert.Error(err) 178 assert.Nil(key) 179 } 180 181 func testKeyFromPathMissingVariable(t *testing.T) { 182 var ( 183 assert = assert.New(t) 184 require = require.New(t) 185 186 httpRequest = mux.SetURLVars( 187 httptest.NewRequest("GET", "/", nil), 188 map[string]string{"foo": "bar"}, 189 ) 190 ) 191 192 decoder := KeyFromPath("id", func(v string) (service.Key, error) { 193 assert.Fail("The parser should not have been called") 194 return nil, nil 195 }) 196 197 require.NotNil(decoder) 198 key, err := decoder(context.Background(), httpRequest) 199 assert.Error(err) 200 assert.Nil(key) 201 } 202 203 func TestKeyFromPath(t *testing.T) { 204 t.Run("BlankHeader", testKeyFromPathBlankVariable) 205 t.Run("NilParser", testKeyFromPathNilParser) 206 t.Run("Success", testKeyFromPathSuccess) 207 t.Run("ParserError", testKeyFromPathParserError) 208 t.Run("MissingVars", testKeyFromPathMissingVars) 209 t.Run("MissingVariable", testKeyFromPathMissingVariable) 210 }