1package http
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "strings"
7 "testing"
8 "time"
9)
10
11func TestHTTPClient_NewHTTPClient(t *testing.T) {
12 client := NewHTTPClient()
13 if client == nil {
14 t.Fatal("expected non-nil client")
15 }
16
17 if client.client == nil {
18 t.Fatal("expected non-nil internal client")
19 }
20}
21
22func TestHTTPClient_NewHTTPClientWithTimeout(t *testing.T) {
23 timeout := 5 * time.Second
24 client := NewHTTPClientWithTimeout(timeout)
25
26 if client == nil {
27 t.Fatal("expected non-nil client")
28 }
29
30 if client.client.Timeout != timeout {
31 t.Errorf("expected timeout %v, got %v", timeout, client.client.Timeout)
32 }
33}
34
35func TestHTTPClient_Get_Success(t *testing.T) {
36 // Create a test server
37 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
38 w.WriteHeader(200)
39 if _, err := w.Write([]byte("test response")); err != nil {
40 t.Fatalf("failed to write response: %v", err)
41 }
42 }))
43 defer server.Close()
44
45 client := NewHTTPClient()
46 resp, err := client.Get(server.URL)
47 defer func() {
48 if err := resp.Close(); err != nil {
49 t.Fatalf("failed to close response: %v", err)
50 }
51 }()
52
53 if err != nil {
54 t.Fatalf("expected no error, got %v", err)
55 }
56
57 if resp.StatusCode() != 200 {
58 t.Errorf("expected status 200, got %d", resp.StatusCode())
59 }
60
61 if string(resp.Body()) != "test response" {
62 t.Errorf("expected 'test response', got %s", string(resp.Body()))
63 }
64}
65
66func TestHTTPClient_Get_StatusCode(t *testing.T) {
67 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
68 w.WriteHeader(404)
69 }))
70 defer server.Close()
71
72 client := NewHTTPClient()
73 resp, err := client.Get(server.URL)
74 defer func() {
75 if err := resp.Close(); err != nil {
76 t.Fatalf("failed to close response: %v", err)
77 }
78 }()
79
80 if err != nil {
81 t.Fatalf("expected no error, got %v", err)
82 }
83
84 if resp.StatusCode() != 404 {
85 t.Errorf("expected status 404, got %d", resp.StatusCode())
86 }
87}
88
89func TestHTTPClient_Get_EmptyBody(t *testing.T) {
90 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
91 w.WriteHeader(204)
92 }))
93 defer server.Close()
94
95 client := NewHTTPClient()
96 resp, err := client.Get(server.URL)
97 defer func() {
98 if err := resp.Close(); err != nil {
99 t.Fatalf("failed to close response: %v", err)
100 }
101 }()
102
103 if err != nil {
104 t.Fatalf("expected no error, got %v", err)
105 }
106
107 if len(resp.Body()) != 0 {
108 t.Errorf("expected empty body, got %s", string(resp.Body()))
109 }
110}
111
112func TestHTTPClient_Get_LargeBody(t *testing.T) {
113 largeBody := strings.Repeat("a", 10000)
114
115 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
116 w.WriteHeader(200)
117 if _, err := w.Write([]byte(largeBody)); err != nil {
118 t.Fatalf("failed to write response: %v", err)
119 }
120 }))
121 defer server.Close()
122
123 client := NewHTTPClient()
124 resp, err := client.Get(server.URL)
125 defer func() {
126 if err := resp.Close(); err != nil {
127 t.Fatalf("failed to close response: %v", err)
128 }
129 }()
130
131 if err != nil {
132 t.Fatalf("expected no error, got %v", err)
133 }
134
135 if string(resp.Body()) != largeBody {
136 t.Error("expected body to match large response")
137 }
138}
139
140func TestHTTPClient_Get_InvalidURL(t *testing.T) {
141 client := NewHTTPClient()
142 _, err := client.Get("http://nonexistent.invalid.domain.example/")
143
144 if err == nil {
145 t.Fatal("expected error for invalid URL")
146 }
147}
148
149func TestHTTPClient_Post_Success(t *testing.T) {
150 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
151 w.WriteHeader(201)
152 if _, err := w.Write([]byte("created")); err != nil {
153 t.Fatalf("failed to write response: %v", err)
154 }
155 }))
156 defer server.Close()
157
158 client := NewHTTPClient()
159 resp, err := client.Post(server.URL, "application/json", []byte(`{"key":"value"}`))
160 defer func() {
161 if err := resp.Close(); err != nil {
162 t.Fatalf("failed to close response: %v", err)
163 }
164 }()
165
166 if err != nil {
167 t.Fatalf("expected no error, got %v", err)
168 }
169
170 if resp.StatusCode() != 201 {
171 t.Errorf("expected status 201, got %d", resp.StatusCode())
172 }
173
174 if string(resp.Body()) != "created" {
175 t.Errorf("expected 'created', got %s", string(resp.Body()))
176 }
177}
178
179func TestHTTPClient_Post_InvalidURL(t *testing.T) {
180 client := NewHTTPClient()
181 _, err := client.Post("http://nonexistent.invalid.domain.example/", "application/json", []byte("test"))
182
183 if err == nil {
184 t.Fatal("expected error for invalid URL")
185 }
186}
187
188func TestHTTPClient_Response_Close(t *testing.T) {
189 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
190 w.WriteHeader(200)
191 if _, err := w.Write([]byte("test")); err != nil {
192 t.Fatalf("failed to write response: %v", err)
193 }
194 }))
195 defer server.Close()
196
197 client := NewHTTPClient()
198 resp, _ := client.Get(server.URL)
199
200 err := resp.Close()
201 if err != nil {
202 t.Errorf("expected no error closing response, got %v", err)
203 }
204}
205
206func TestHTTPClient_Get_Timeout(t *testing.T) {
207 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
208 time.Sleep(2 * time.Second)
209 w.WriteHeader(200)
210 }))
211 defer server.Close()
212
213 client := NewHTTPClientWithTimeout(100 * time.Millisecond)
214 _, err := client.Get(server.URL)
215
216 if err == nil {
217 t.Fatal("expected error due to timeout")
218 }
219}