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  }