|
1 | 1 | package httpx |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "context" |
4 | 5 | "encoding/json" |
5 | 6 | "errors" |
6 | 7 | "net/http" |
7 | 8 | "net/http/httptest" |
| 9 | + "os" |
8 | 10 | "testing" |
9 | 11 |
|
10 | 12 | "github.com/imroc/req/v3" |
@@ -203,3 +205,131 @@ func TestQueryOddPanics(t *testing.T) { |
203 | 205 | req := req.C().R() |
204 | 206 | Query("q")(req) |
205 | 207 | } |
| 208 | + |
| 209 | +func TestDefaultReqRaw(t *testing.T) { |
| 210 | + c1 := Default() |
| 211 | + c2 := Default() |
| 212 | + if c1 == nil || c2 == nil || c1 != c2 { |
| 213 | + t.Fatalf("expected default client singleton") |
| 214 | + } |
| 215 | + if c1.Req() == nil { |
| 216 | + t.Fatalf("expected req client") |
| 217 | + } |
| 218 | + if c1.Raw() == nil { |
| 219 | + t.Fatalf("expected raw client") |
| 220 | + } |
| 221 | +} |
| 222 | + |
| 223 | +func TestRequestMethods(t *testing.T) { |
| 224 | + var gotMethod string |
| 225 | + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 226 | + gotMethod = r.Method |
| 227 | + _, _ = w.Write([]byte(`{"name":"ok"}`)) |
| 228 | + })) |
| 229 | + t.Cleanup(server.Close) |
| 230 | + |
| 231 | + client := New() |
| 232 | + res := Put[createUser, user](client, server.URL, createUser{Name: "ok"}) |
| 233 | + if res.Err != nil { |
| 234 | + t.Fatalf("put error: %v", res.Err) |
| 235 | + } |
| 236 | + if gotMethod != http.MethodPut { |
| 237 | + t.Fatalf("method = %q", gotMethod) |
| 238 | + } |
| 239 | + |
| 240 | + res = Patch[createUser, user](client, server.URL, createUser{Name: "ok"}) |
| 241 | + if res.Err != nil { |
| 242 | + t.Fatalf("patch error: %v", res.Err) |
| 243 | + } |
| 244 | + if gotMethod != http.MethodPatch { |
| 245 | + t.Fatalf("method = %q", gotMethod) |
| 246 | + } |
| 247 | + |
| 248 | + resDel := Delete[user](client, server.URL) |
| 249 | + if resDel.Err != nil { |
| 250 | + t.Fatalf("delete error: %v", resDel.Err) |
| 251 | + } |
| 252 | + if gotMethod != http.MethodDelete { |
| 253 | + t.Fatalf("method = %q", gotMethod) |
| 254 | + } |
| 255 | +} |
| 256 | + |
| 257 | +func TestContextMethods(t *testing.T) { |
| 258 | + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 259 | + _, _ = w.Write([]byte(`{"name":"ctx"}`)) |
| 260 | + })) |
| 261 | + t.Cleanup(server.Close) |
| 262 | + |
| 263 | + client := New() |
| 264 | + ctx := context.Background() |
| 265 | + |
| 266 | + if res := GetCtx[user](client, ctx, server.URL); res.Err != nil { |
| 267 | + t.Fatalf("getctx error: %v", res.Err) |
| 268 | + } |
| 269 | + if res := PostCtx[createUser, user](client, ctx, server.URL, createUser{Name: "ctx"}); res.Err != nil { |
| 270 | + t.Fatalf("postctx error: %v", res.Err) |
| 271 | + } |
| 272 | + if res := PutCtx[createUser, user](client, ctx, server.URL, createUser{Name: "ctx"}); res.Err != nil { |
| 273 | + t.Fatalf("putctx error: %v", res.Err) |
| 274 | + } |
| 275 | + if res := PatchCtx[createUser, user](client, ctx, server.URL, createUser{Name: "ctx"}); res.Err != nil { |
| 276 | + t.Fatalf("patchctx error: %v", res.Err) |
| 277 | + } |
| 278 | + if res := DeleteCtx[user](client, ctx, server.URL); res.Err != nil { |
| 279 | + t.Fatalf("deletectx error: %v", res.Err) |
| 280 | + } |
| 281 | +} |
| 282 | + |
| 283 | +func TestSendUnknownMethod(t *testing.T) { |
| 284 | + _, err := send(req.C().R(), "TRACE-UNKNOWN", "http://example.com") |
| 285 | + if err == nil { |
| 286 | + t.Fatalf("expected error for unsupported method") |
| 287 | + } |
| 288 | +} |
| 289 | + |
| 290 | +func TestNewWithHTTPTrace(t *testing.T) { |
| 291 | + if err := os.Setenv("HTTP_TRACE", "1"); err != nil { |
| 292 | + t.Fatalf("set env: %v", err) |
| 293 | + } |
| 294 | + defer os.Unsetenv("HTTP_TRACE") |
| 295 | + _ = New() |
| 296 | +} |
| 297 | + |
| 298 | +func TestDumpExample(t *testing.T) { |
| 299 | + dumpExample("ok") |
| 300 | +} |
| 301 | + |
| 302 | +func TestDoIgnoresAfterResponseErrorOnEmptyBody(t *testing.T) { |
| 303 | + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 304 | + w.WriteHeader(http.StatusOK) |
| 305 | + })) |
| 306 | + t.Cleanup(server.Close) |
| 307 | + |
| 308 | + client := New() |
| 309 | + res := Get[user](client, server.URL, Before(func(r *req.Request) { |
| 310 | + r.OnAfterResponse(func(_ *req.Client, _ *req.Response) error { |
| 311 | + return errors.New("after response error") |
| 312 | + }) |
| 313 | + })) |
| 314 | + if res.Err != nil { |
| 315 | + t.Fatalf("expected error to be ignored, got %v", res.Err) |
| 316 | + } |
| 317 | + if res.Response == nil { |
| 318 | + t.Fatalf("expected response") |
| 319 | + } |
| 320 | +} |
| 321 | + |
| 322 | +func TestNilClientDefaults(t *testing.T) { |
| 323 | + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 324 | + _ = json.NewEncoder(w).Encode(user{Name: "default"}) |
| 325 | + })) |
| 326 | + t.Cleanup(server.Close) |
| 327 | + |
| 328 | + res := Get[user](nil, server.URL) |
| 329 | + if res.Err != nil { |
| 330 | + t.Fatalf("unexpected error: %v", res.Err) |
| 331 | + } |
| 332 | + if res.Body.Name != "default" { |
| 333 | + t.Fatalf("unexpected response: %s", res.Body.Name) |
| 334 | + } |
| 335 | +} |
0 commit comments