github.com/m-lab/locate@v0.17.6/proxy/proxy_test.go (about) 1 // Package proxy issues requests to the legacy mlab-ns service and parses responses. 2 package proxy 3 4 import ( 5 "net/http" 6 "net/http/httptest" 7 "testing" 8 ) 9 10 type fakeNS struct { 11 content []byte 12 status int 13 breakReader bool 14 } 15 16 func (f *fakeNS) defaultHandler(rw http.ResponseWriter, req *http.Request) { 17 if f.breakReader { 18 // Speicyfing a content length larger than the actual response generates 19 // a read error in the client. 20 rw.Header().Set("Content-Length", "8000") 21 } 22 rw.WriteHeader(f.status) 23 rw.Write([]byte(f.content)) 24 } 25 26 func Test_UnmarshalResponse(t *testing.T) { 27 type fakeObject struct { 28 Message string 29 } 30 tests := []struct { 31 name string 32 url string 33 result interface{} 34 content string 35 status int 36 breakReader bool 37 wantErr bool 38 }{ 39 { 40 name: "success", 41 result: &fakeObject{}, 42 content: `{"Message":"success"}`, 43 status: http.StatusOK, 44 }, 45 { 46 name: "error-response", 47 url: "http://fake/this-does-not-exist", 48 wantErr: true, 49 }, 50 { 51 name: "error-no-content", 52 content: "", 53 status: http.StatusNoContent, 54 wantErr: true, 55 }, 56 { 57 name: "error-reader", 58 status: http.StatusOK, 59 breakReader: true, 60 wantErr: true, 61 }, 62 } 63 for _, tt := range tests { 64 t.Run(tt.name, func(t *testing.T) { 65 f := &fakeNS{ 66 content: []byte(tt.content), 67 status: tt.status, 68 breakReader: tt.breakReader, 69 } 70 srv := httptest.NewServer(http.HandlerFunc(f.defaultHandler)) 71 url := srv.URL 72 if tt.url != "" { 73 // Override url with test url. 74 url = tt.url 75 } 76 77 req, err := http.NewRequest(http.MethodGet, url, nil) 78 if err != nil { 79 t.Errorf("failed to create request") 80 } 81 resp, err := UnmarshalResponse(req, tt.result) 82 if (err != nil) != tt.wantErr { 83 t.Errorf("getRequest() error = %v, wantErr %v", err, tt.wantErr) 84 } 85 if tt.wantErr { 86 return 87 } 88 if resp.StatusCode != tt.status { 89 t.Errorf("UnmarshalResponse() got %d, want %d", resp.StatusCode, tt.status) 90 } 91 obj := tt.result.(*fakeObject) 92 if obj.Message != "success" { 93 t.Errorf("Result did not decode message: got %q, want 'success'", obj.Message) 94 } 95 }) 96 } 97 }