| 22 | } |
| 23 | |
| 24 | func TestHTTPClient(t *testing.T) { |
| 25 | var ( |
| 26 | testbody = "testbody" |
| 27 | encode = func(context.Context, *http.Request, interface{}) error { return nil } |
| 28 | decode = func(_ context.Context, r *http.Response) (interface{}, error) { |
| 29 | buffer := make([]byte, len(testbody)) |
| 30 | r.Body.Read(buffer) |
| 31 | return TestResponse{r.Body, string(buffer)}, nil |
| 32 | } |
| 33 | headers = make(chan string, 1) |
| 34 | headerKey = "X-Foo" |
| 35 | headerVal = "abcde" |
| 36 | afterHeaderKey = "X-The-Dude" |
| 37 | afterHeaderVal = "Abides" |
| 38 | afterVal = "" |
| 39 | afterFunc = func(ctx context.Context, r *http.Response) context.Context { |
| 40 | afterVal = r.Header.Get(afterHeaderKey) |
| 41 | return ctx |
| 42 | } |
| 43 | ) |
| 44 | |
| 45 | server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 46 | headers <- r.Header.Get(headerKey) |
| 47 | w.Header().Set(afterHeaderKey, afterHeaderVal) |
| 48 | w.WriteHeader(http.StatusOK) |
| 49 | w.Write([]byte(testbody)) |
| 50 | })) |
| 51 | |
| 52 | client := httptransport.NewClient( |
| 53 | "GET", |
| 54 | mustParse(server.URL), |
| 55 | encode, |
| 56 | decode, |
| 57 | httptransport.ClientBefore(httptransport.SetRequestHeader(headerKey, headerVal)), |
| 58 | httptransport.ClientAfter(afterFunc), |
| 59 | ) |
| 60 | |
| 61 | res, err := client.Endpoint()(context.Background(), struct{}{}) |
| 62 | if err != nil { |
| 63 | t.Fatal(err) |
| 64 | } |
| 65 | |
| 66 | var have string |
| 67 | select { |
| 68 | case have = <-headers: |
| 69 | case <-time.After(time.Millisecond): |
| 70 | t.Fatalf("timeout waiting for %s", headerKey) |
| 71 | } |
| 72 | // Check that Request Header was successfully received |
| 73 | if want := headerVal; want != have { |
| 74 | t.Errorf("want %q, have %q", want, have) |
| 75 | } |
| 76 | |
| 77 | // Check that Response header set from server was received in SetClientAfter |
| 78 | if want, have := afterVal, afterHeaderVal; want != have { |
| 79 | t.Errorf("want %q, have %q", want, have) |
| 80 | } |
| 81 | |