Skip to content

Commit ccbe09f

Browse files
Add unit tests for httpgrpcutil package (#7352)
1 parent b4f5cfc commit ccbe09f

2 files changed

Lines changed: 156 additions & 0 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package httpgrpcutil
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
"github.com/weaveworks/common/httpgrpc"
10+
)
11+
12+
func TestHttpgrpcHeadersCarrier_Set(t *testing.T) {
13+
carrier := &HttpgrpcHeadersCarrier{}
14+
15+
carrier.Set("X-Trace-ID", "abc123")
16+
carrier.Set("X-Span-ID", "def456")
17+
18+
require.Len(t, carrier.Headers, 2)
19+
assert.Equal(t, "X-Trace-ID", carrier.Headers[0].Key)
20+
assert.Equal(t, []string{"abc123"}, carrier.Headers[0].Values)
21+
assert.Equal(t, "X-Span-ID", carrier.Headers[1].Key)
22+
assert.Equal(t, []string{"def456"}, carrier.Headers[1].Values)
23+
}
24+
25+
func TestHttpgrpcHeadersCarrier_ForeachKey(t *testing.T) {
26+
carrier := &HttpgrpcHeadersCarrier{
27+
Headers: []*httpgrpc.Header{
28+
{Key: "key1", Values: []string{"val1a", "val1b"}},
29+
{Key: "key2", Values: []string{"val2"}},
30+
},
31+
}
32+
33+
var collected []string
34+
err := carrier.ForeachKey(func(key, val string) error {
35+
collected = append(collected, key+"="+val)
36+
return nil
37+
})
38+
39+
require.NoError(t, err)
40+
assert.Equal(t, []string{"key1=val1a", "key1=val1b", "key2=val2"}, collected)
41+
}
42+
43+
func TestHttpgrpcHeadersCarrier_ForeachKey_returnsHandlerError(t *testing.T) {
44+
carrier := &HttpgrpcHeadersCarrier{
45+
Headers: []*httpgrpc.Header{
46+
{Key: "key1", Values: []string{"val1"}},
47+
},
48+
}
49+
50+
handlerErr := errors.New("handler failed")
51+
err := carrier.ForeachKey(func(key, val string) error {
52+
return handlerErr
53+
})
54+
55+
assert.Equal(t, handlerErr, err)
56+
}
57+
58+
func TestHttpgrpcHeadersCarrier_ForeachKey_emptyHeaders(t *testing.T) {
59+
carrier := &HttpgrpcHeadersCarrier{}
60+
61+
err := carrier.ForeachKey(func(key, val string) error {
62+
t.Fatal("handler should not be called for empty headers")
63+
return nil
64+
})
65+
66+
assert.NoError(t, err)
67+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package httpgrpcutil
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/weaveworks/common/httpgrpc"
8+
)
9+
10+
func TestGetHeader(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
headers []*httpgrpc.Header
14+
key string
15+
expected string
16+
}{
17+
{
18+
name: "returns empty string for missing key",
19+
headers: nil,
20+
key: "X-Missing",
21+
expected: "",
22+
},
23+
{
24+
name: "returns first value for existing key",
25+
headers: []*httpgrpc.Header{
26+
{Key: "Content-Type", Values: []string{"application/json", "text/plain"}},
27+
},
28+
key: "Content-Type",
29+
expected: "application/json",
30+
},
31+
{
32+
name: "does not match different key",
33+
headers: []*httpgrpc.Header{
34+
{Key: "Accept", Values: []string{"text/html"}},
35+
},
36+
key: "Content-Type",
37+
expected: "",
38+
},
39+
}
40+
41+
for _, tt := range tests {
42+
t.Run(tt.name, func(t *testing.T) {
43+
req := httpgrpc.HTTPRequest{Headers: tt.headers}
44+
result := GetHeader(req, tt.key)
45+
assert.Equal(t, tt.expected, result)
46+
})
47+
}
48+
}
49+
50+
func TestGetHeaderValues(t *testing.T) {
51+
tests := []struct {
52+
name string
53+
headers []*httpgrpc.Header
54+
key string
55+
expected []string
56+
}{
57+
{
58+
name: "returns empty slice for missing key",
59+
headers: nil,
60+
key: "X-Missing",
61+
expected: []string{},
62+
},
63+
{
64+
name: "returns all values for existing key",
65+
headers: []*httpgrpc.Header{
66+
{Key: "Accept", Values: []string{"text/html", "application/json"}},
67+
},
68+
key: "Accept",
69+
expected: []string{"text/html", "application/json"},
70+
},
71+
{
72+
name: "returns values from first matching header only",
73+
headers: []*httpgrpc.Header{
74+
{Key: "X-Custom", Values: []string{"first"}},
75+
{Key: "X-Custom", Values: []string{"second"}},
76+
},
77+
key: "X-Custom",
78+
expected: []string{"first"},
79+
},
80+
}
81+
82+
for _, tt := range tests {
83+
t.Run(tt.name, func(t *testing.T) {
84+
req := httpgrpc.HTTPRequest{Headers: tt.headers}
85+
result := GetHeaderValues(req, tt.key)
86+
assert.Equal(t, tt.expected, result)
87+
})
88+
}
89+
}

0 commit comments

Comments
 (0)