github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/src/net/http/httptest/recorder_test.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package httptest
     6  
     7  import (
     8  	"fmt"
     9  	"net/http"
    10  	"testing"
    11  )
    12  
    13  func TestRecorder(t *testing.T) {
    14  	type checkFunc func(*ResponseRecorder) error
    15  	check := func(fns ...checkFunc) []checkFunc { return fns }
    16  
    17  	hasStatus := func(wantCode int) checkFunc {
    18  		return func(rec *ResponseRecorder) error {
    19  			if rec.Code != wantCode {
    20  				return fmt.Errorf("Status = %d; want %d", rec.Code, wantCode)
    21  			}
    22  			return nil
    23  		}
    24  	}
    25  	hasContents := func(want string) checkFunc {
    26  		return func(rec *ResponseRecorder) error {
    27  			if rec.Body.String() != want {
    28  				return fmt.Errorf("wrote = %q; want %q", rec.Body.String(), want)
    29  			}
    30  			return nil
    31  		}
    32  	}
    33  	hasFlush := func(want bool) checkFunc {
    34  		return func(rec *ResponseRecorder) error {
    35  			if rec.Flushed != want {
    36  				return fmt.Errorf("Flushed = %v; want %v", rec.Flushed, want)
    37  			}
    38  			return nil
    39  		}
    40  	}
    41  
    42  	tests := []struct {
    43  		name   string
    44  		h      func(w http.ResponseWriter, r *http.Request)
    45  		checks []checkFunc
    46  	}{
    47  		{
    48  			"200 default",
    49  			func(w http.ResponseWriter, r *http.Request) {},
    50  			check(hasStatus(200), hasContents("")),
    51  		},
    52  		{
    53  			"first code only",
    54  			func(w http.ResponseWriter, r *http.Request) {
    55  				w.WriteHeader(201)
    56  				w.WriteHeader(202)
    57  				w.Write([]byte("hi"))
    58  			},
    59  			check(hasStatus(201), hasContents("hi")),
    60  		},
    61  		{
    62  			"write sends 200",
    63  			func(w http.ResponseWriter, r *http.Request) {
    64  				w.Write([]byte("hi first"))
    65  				w.WriteHeader(201)
    66  				w.WriteHeader(202)
    67  			},
    68  			check(hasStatus(200), hasContents("hi first"), hasFlush(false)),
    69  		},
    70  		{
    71  			"flush",
    72  			func(w http.ResponseWriter, r *http.Request) {
    73  				w.(http.Flusher).Flush() // also sends a 200
    74  				w.WriteHeader(201)
    75  			},
    76  			check(hasStatus(200), hasFlush(true)),
    77  		},
    78  	}
    79  	r, _ := http.NewRequest("GET", "http://foo.com/", nil)
    80  	for _, tt := range tests {
    81  		h := http.HandlerFunc(tt.h)
    82  		rec := NewRecorder()
    83  		h.ServeHTTP(rec, r)
    84  		for _, check := range tt.checks {
    85  			if err := check(rec); err != nil {
    86  				t.Errorf("%s: %v", tt.name, err)
    87  			}
    88  		}
    89  	}
    90  }