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  }