...

Source file src/edge-infra.dev/pkg/sds/emergencyaccess/client/transport_test.go

Documentation: edge-infra.dev/pkg/sds/emergencyaccess/client

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"edge-infra.dev/pkg/sds/emergencyaccess/eaconst"
    12  	"edge-infra.dev/pkg/sds/emergencyaccess/types"
    13  )
    14  
    15  func TestHTransport(t *testing.T) {
    16  	t.Parallel()
    17  
    18  	tests := map[string]struct {
    19  		applyUser        func(context.Context) context.Context
    20  		headerAssertions func(*testing.T, *http.Request)
    21  	}{
    22  		"No User": {
    23  			// No user in context should not set the header at all
    24  			applyUser: func(ctx context.Context) context.Context {
    25  				return ctx
    26  			},
    27  			headerAssertions: func(t *testing.T, r *http.Request) {
    28  				// Nil indicates the header has not been set
    29  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyUsername))
    30  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyEmail))
    31  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyRoles))
    32  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyBanners))
    33  			},
    34  		},
    35  		"Empty User": {
    36  			// If empty user in context, user and email headers will be present,
    37  			// and set to an empty string
    38  			// The banners and roles headers will not be present
    39  			applyUser: func(ctx context.Context) context.Context {
    40  				ctx = types.UserIntoContext(ctx, types.User{})
    41  				return ctx
    42  			},
    43  			headerAssertions: func(t *testing.T, r *http.Request) {
    44  				// The header has been set to an empty value
    45  				assert.Equal(t, []string{""}, r.Header.Values(eaconst.HeaderAuthKeyUsername))
    46  				assert.Equal(t, []string{""}, r.Header.Values(eaconst.HeaderAuthKeyEmail))
    47  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyRoles))
    48  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyBanners))
    49  			},
    50  		},
    51  		"Mixed empty and not empty fields": {
    52  			// If the user struct has a mixture of empty and not empty fields,
    53  			// the transport does a best effort of setting all headers it can
    54  			// Note though, that unlike [Empty User], this time the email header
    55  			// has been set to an empty value, but the banner header is nil as
    56  			// expected
    57  			applyUser: func(ctx context.Context) context.Context {
    58  				ctx = types.UserIntoContext(ctx, types.User{
    59  					Username: "user",
    60  					Roles:    []string{"role1"},
    61  				})
    62  				return ctx
    63  			},
    64  			headerAssertions: func(t *testing.T, r *http.Request) {
    65  				assert.Equal(t, []string{"user"}, r.Header.Values(eaconst.HeaderAuthKeyUsername))
    66  				assert.Equal(t, []string{""}, r.Header.Values(eaconst.HeaderAuthKeyEmail))
    67  				assert.Equal(t, []string{"role1"}, r.Header.Values(eaconst.HeaderAuthKeyRoles))
    68  				assert.Nil(t, r.Header.Values(eaconst.HeaderAuthKeyBanners))
    69  			},
    70  		},
    71  		"User": {
    72  			applyUser: func(ctx context.Context) context.Context {
    73  				ctx = types.UserIntoContext(ctx, types.User{
    74  					Username: "abcd",
    75  					Email:    "abcd@efgh.xyz",
    76  					Roles:    []string{"role1", "role2"},
    77  					Banners:  []string{"banner1", "banner2"},
    78  				})
    79  				return ctx
    80  			},
    81  			headerAssertions: func(t *testing.T, r *http.Request) {
    82  				assert.Equal(t, []string{"abcd"}, r.Header.Values(eaconst.HeaderAuthKeyUsername))
    83  				assert.Equal(t, []string{"abcd@efgh.xyz"}, r.Header.Values(eaconst.HeaderAuthKeyEmail))
    84  				assert.Equal(t, []string{"role1", "role2"}, r.Header.Values(eaconst.HeaderAuthKeyRoles))
    85  				assert.Equal(t, []string{"banner1", "banner2"}, r.Header.Values(eaconst.HeaderAuthKeyBanners))
    86  			},
    87  		},
    88  	}
    89  
    90  	for name, tc := range tests {
    91  		tc := tc
    92  		t.Run(name, func(t *testing.T) {
    93  			t.Parallel()
    94  
    95  			server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    96  				tc.headerAssertions(t, r)
    97  
    98  				w.WriteHeader(200)
    99  			}))
   100  
   101  			ctx := tc.applyUser(context.Background())
   102  			req, err := http.NewRequestWithContext(ctx, http.MethodGet, server.URL, nil)
   103  			assert.NoError(t, err)
   104  
   105  			// Create a new client which uses HTransport
   106  			client := New()
   107  			_, err = client.Do(req)
   108  			assert.NoError(t, err)
   109  		})
   110  	}
   111  }
   112  

View as plain text