WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 47fee0e

Browse files
committed
test: add comprehensive tests for HTTP header parsing and transport
- Add tests for parsing header strings into http.Header, covering normal input, invalid format, duplicate keys, and empty/nil input - Add tests for DefaultHeaderTransport to verify attaching custom headers, handling empty app info, propagating errors, and supporting multiple header values Signed-off-by: appleboy <[email protected]>
1 parent c4d6669 commit 47fee0e

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

core/transport/headers_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package transport
2+
3+
import (
4+
"net/http"
5+
"reflect"
6+
"testing"
7+
)
8+
9+
func TestNewHeaders_NormalInput(t *testing.T) {
10+
input := []string{"Content-Type=application/json", "Accept=*/*"}
11+
want := http.Header{
12+
"Content-Type": {"application/json"},
13+
"Accept": {"*/*"},
14+
}
15+
got := NewHeaders(input)
16+
if !reflect.DeepEqual(got, want) {
17+
t.Errorf("NewHeaders() = %v, want %v", got, want)
18+
}
19+
}
20+
21+
func TestNewHeaders_InvalidFormat(t *testing.T) {
22+
input := []string{"invalid-header", "AnotherOne"}
23+
want := http.Header{}
24+
got := NewHeaders(input)
25+
if !reflect.DeepEqual(got, want) {
26+
t.Errorf("NewHeaders() = %v, want %v", got, want)
27+
}
28+
}
29+
30+
func TestNewHeaders_DuplicateKeys(t *testing.T) {
31+
input := []string{"X-Test=1", "X-Test=2"}
32+
want := http.Header{
33+
"X-Test": {"1", "2"},
34+
}
35+
got := NewHeaders(input)
36+
if !reflect.DeepEqual(got, want) {
37+
t.Errorf("NewHeaders() = %v, want %v", got, want)
38+
}
39+
}
40+
41+
func TestNewHeaders_EmptyOrNilInput(t *testing.T) {
42+
var inputNil []string
43+
inputEmpty := []string{}
44+
want := http.Header{}
45+
46+
gotNil := NewHeaders(inputNil)
47+
if !reflect.DeepEqual(gotNil, want) {
48+
t.Errorf("NewHeaders(nil) = %v, want %v", gotNil, want)
49+
}
50+
51+
gotEmpty := NewHeaders(inputEmpty)
52+
if !reflect.DeepEqual(gotEmpty, want) {
53+
t.Errorf("NewHeaders(empty) = %v, want %v", gotEmpty, want)
54+
}
55+
}

core/transport/transport_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package transport
2+
3+
import (
4+
"errors"
5+
"net/http"
6+
"reflect"
7+
"testing"
8+
)
9+
10+
// mockRoundTripper is used to intercept requests and record headers
11+
type mockRoundTripper struct {
12+
lastReq *http.Request
13+
resp *http.Response
14+
err error
15+
}
16+
17+
func (m *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
18+
m.lastReq = req
19+
if m.resp != nil || m.err != nil {
20+
return m.resp, m.err
21+
}
22+
return &http.Response{StatusCode: 200, Body: http.NoBody, Request: req}, nil
23+
}
24+
25+
func TestDefaultHeaderTransport_CustomHeaders(t *testing.T) {
26+
mock := &mockRoundTripper{}
27+
tr := &DefaultHeaderTransport{
28+
Origin: mock,
29+
Header: http.Header{
30+
"X-Test": {"abc"},
31+
"Foo": {"bar"},
32+
},
33+
AppName: "myapp",
34+
AppVersion: "1.2.3",
35+
}
36+
req, _ := http.NewRequest("GET", "http://example.com", nil)
37+
tr.RoundTrip(req)
38+
39+
want := http.Header{
40+
"X-Test": {"abc"},
41+
"Foo": {"bar"},
42+
"X-App-Name": {"myapp"},
43+
"X-App-Version": {"1.2.3"},
44+
}
45+
for k, v := range want {
46+
got := req.Header.Values(k)
47+
if !reflect.DeepEqual(got, v) {
48+
t.Errorf("Header %q = %v, want %v", k, got, v)
49+
}
50+
}
51+
}
52+
53+
func TestDefaultHeaderTransport_EmptyHeadersAndAppInfo(t *testing.T) {
54+
mock := &mockRoundTripper{}
55+
tr := &DefaultHeaderTransport{
56+
Origin: mock,
57+
Header: http.Header{},
58+
AppName: "",
59+
AppVersion: "",
60+
}
61+
req, _ := http.NewRequest("GET", "http://example.com", nil)
62+
tr.RoundTrip(req)
63+
64+
// x-app-name/version should not be present
65+
if req.Header.Get("x-app-name") != "" {
66+
t.Errorf("x-app-name should be empty")
67+
}
68+
if req.Header.Get("x-app-version") != "" {
69+
t.Errorf("x-app-version should be empty")
70+
}
71+
}
72+
73+
func TestDefaultHeaderTransport_OriginErrorPropagation(t *testing.T) {
74+
mock := &mockRoundTripper{err: errors.New("mock error")}
75+
tr := &DefaultHeaderTransport{
76+
Origin: mock,
77+
Header: http.Header{},
78+
AppName: "",
79+
AppVersion: "",
80+
}
81+
req, _ := http.NewRequest("GET", "http://example.com", nil)
82+
_, err := tr.RoundTrip(req)
83+
if err == nil || err.Error() != "mock error" {
84+
t.Errorf("Expected error 'mock error', got %v", err)
85+
}
86+
}
87+
88+
func TestDefaultHeaderTransport_MultipleHeaderValues(t *testing.T) {
89+
mock := &mockRoundTripper{}
90+
tr := &DefaultHeaderTransport{
91+
Origin: mock,
92+
Header: http.Header{
93+
"X-Multi": {"a", "b"},
94+
},
95+
AppName: "app",
96+
AppVersion: "v",
97+
}
98+
req, _ := http.NewRequest("GET", "http://example.com", nil)
99+
tr.RoundTrip(req)
100+
101+
got := req.Header.Values("X-Multi")
102+
want := []string{"a", "b"}
103+
if !reflect.DeepEqual(got, want) {
104+
t.Errorf("X-Multi header = %v, want %v", got, want)
105+
}
106+
}

0 commit comments

Comments
 (0)