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  }