github.com/xmidt-org/webpa-common@v1.11.9/xhttp/fanout/endpoints_test.go (about) 1 package fanout 2 3 import ( 4 "errors" 5 "net/http" 6 "net/http/httptest" 7 "net/url" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/mock" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestEndpointsFunc(t *testing.T) { 16 var ( 17 assert = assert.New(t) 18 19 original = httptest.NewRequest("GET", "/", nil) 20 expectedURLs = []*url.URL{new(url.URL)} 21 expectedError = errors.New("expected") 22 23 ef = EndpointsFunc(func(actual *http.Request) ([]*url.URL, error) { 24 assert.True(original == actual) 25 return expectedURLs, expectedError 26 }) 27 ) 28 29 actualURLs, actualError := ef.FanoutURLs(original) 30 assert.Equal(expectedURLs, actualURLs) 31 assert.Equal(expectedError, actualError) 32 } 33 34 func testMustFanoutURLsPanics(t *testing.T) { 35 var ( 36 assert = assert.New(t) 37 endpoints = new(mockEndpoints) 38 ) 39 40 endpoints.On("FanoutURLs", mock.MatchedBy(func(*http.Request) bool { return true })).Return(nil, errors.New("expected")).Once() 41 assert.Panics(func() { 42 MustFanoutURLs(endpoints, httptest.NewRequest("GET", "/", nil)) 43 }) 44 45 endpoints.AssertExpectations(t) 46 } 47 48 func testMustFanoutURLsSuccess(t *testing.T) { 49 var ( 50 assert = assert.New(t) 51 expectedURLs = []*url.URL{new(url.URL)} 52 endpoints = new(mockEndpoints) 53 ) 54 55 endpoints.On("FanoutURLs", mock.MatchedBy(func(*http.Request) bool { return true })).Return(expectedURLs, error(nil)).Once() 56 assert.NotPanics(func() { 57 assert.Equal(expectedURLs, MustFanoutURLs(endpoints, httptest.NewRequest("GET", "/", nil))) 58 }) 59 60 endpoints.AssertExpectations(t) 61 } 62 63 func TestMustFanoutURLs(t *testing.T) { 64 t.Run("Panics", testMustFanoutURLsPanics) 65 t.Run("Success", testMustFanoutURLsSuccess) 66 } 67 68 func testParseURLsEmpty(t *testing.T) { 69 var ( 70 assert = assert.New(t) 71 require = require.New(t) 72 73 fe, err = ParseURLs() 74 ) 75 76 require.NotNil(fe) 77 assert.Empty(fe) 78 assert.NoError(err) 79 } 80 81 func testParseURLsInvalid(t *testing.T) { 82 var ( 83 assert = assert.New(t) 84 fe, err = ParseURLs("%%") 85 ) 86 87 assert.Empty(fe) 88 assert.Error(err) 89 } 90 91 func testParseURLsValid(t *testing.T, urls []string, originalURL string, expected []string) { 92 var ( 93 assert = assert.New(t) 94 require = require.New(t) 95 96 fe, err = ParseURLs(urls...) 97 ) 98 99 require.NotNil(fe) 100 require.Len(fe, len(urls)) 101 require.NoError(err) 102 103 actual, err := fe.FanoutURLs(httptest.NewRequest("GET", originalURL, nil)) 104 require.Equal(len(expected), len(actual)) 105 require.NoError(err) 106 107 for i := 0; i < len(expected); i++ { 108 assert.Equal(expected[i], actual[i].String()) 109 } 110 } 111 112 func TestParseURLs(t *testing.T) { 113 t.Run("Empty", testParseURLsEmpty) 114 t.Run("Invalid", testParseURLsInvalid) 115 116 t.Run("Valid", func(t *testing.T) { 117 testData := []struct { 118 urls []string 119 originalURL string 120 expected []string 121 }{ 122 { 123 []string{"http://localhost:8080"}, 124 "/api/v2/something?value=1#mark", 125 []string{"http://localhost:8080/api/v2/something?value=1#mark"}, 126 }, 127 { 128 []string{"http://host1.someplace.com", "https://host2.someplace.net:1234"}, 129 "/api/v2/something", 130 []string{"http://host1.someplace.com/api/v2/something", "https://host2.someplace.net:1234/api/v2/something"}, 131 }, 132 } 133 134 for _, record := range testData { 135 testParseURLsValid(t, record.urls, record.originalURL, record.expected) 136 } 137 }) 138 } 139 140 func testMustParseURLsPanics(t *testing.T) { 141 assert := assert.New(t) 142 assert.Panics(func() { 143 MustParseURLs("%%") 144 }) 145 } 146 147 func testMustParseURLsSuccess(t *testing.T) { 148 assert := assert.New(t) 149 assert.NotPanics(func() { 150 fe := MustParseURLs("http://foobar.com") 151 assert.Len(fe, 1) 152 assert.Equal("http://foobar.com", fe[0].String()) 153 }) 154 } 155 156 func TestMustParseURLs(t *testing.T) { 157 t.Run("Panics", testMustParseURLsPanics) 158 t.Run("Success", testMustParseURLsSuccess) 159 } 160 161 func testNewEndpointsInvalidConfiguration(t *testing.T) { 162 var ( 163 assert = assert.New(t) 164 165 e, err = NewEndpoints( 166 Configuration{Endpoints: []string{"%%"}}, 167 func() (Endpoints, error) { 168 assert.Fail("The alternate function should not have been called") 169 return nil, nil 170 }, 171 ) 172 ) 173 174 assert.Nil(e) 175 assert.Error(err) 176 } 177 178 func testNewEndpointsUseAlternate(t *testing.T) { 179 var ( 180 assert = assert.New(t) 181 182 expected = MustParseURLs("http://localhost:1234") 183 actual, err = NewEndpoints( 184 Configuration{}, 185 func() (Endpoints, error) { 186 return expected, nil 187 }, 188 ) 189 ) 190 191 assert.Equal(expected, actual) 192 assert.NoError(err) 193 } 194 195 func testNewEndpointsNoneConfigured(t *testing.T) { 196 var ( 197 assert = assert.New(t) 198 e, err = NewEndpoints(Configuration{}, nil) 199 ) 200 201 assert.Nil(e) 202 assert.Error(err) 203 } 204 205 func TestNewEndpoints(t *testing.T) { 206 t.Run("InvalidConfiguration", testNewEndpointsInvalidConfiguration) 207 t.Run("UseAlternate", testNewEndpointsUseAlternate) 208 t.Run("NoneConfigured", testNewEndpointsNoneConfigured) 209 } 210 211 func testMustNewEndpointsPanics(t *testing.T) { 212 assert := assert.New(t) 213 assert.Panics(func() { 214 MustNewEndpoints(Configuration{}, nil) 215 }) 216 } 217 218 func testMustNewEndpointsSuccess(t *testing.T) { 219 var ( 220 assert = assert.New(t) 221 expected = MustParseURLs("http://foobar.com:1010") 222 ) 223 224 assert.NotPanics(func() { 225 assert.Equal( 226 expected, 227 MustNewEndpoints(Configuration{}, func() (Endpoints, error) { return expected, nil }), 228 ) 229 }) 230 } 231 232 func TestMustNewEndpoints(t *testing.T) { 233 t.Run("Panics", testMustNewEndpointsPanics) 234 t.Run("Success", testMustNewEndpointsSuccess) 235 }