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  }