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
24 applyUser: func(ctx context.Context) context.Context {
25 return ctx
26 },
27 headerAssertions: func(t *testing.T, r *http.Request) {
28
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
37
38
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
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
53
54
55
56
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
106 client := New()
107 _, err = client.Do(req)
108 assert.NoError(t, err)
109 })
110 }
111 }
112
View as plain text