| package godoc |
| |
| import ( |
| "errors" |
| "expvar" |
| "net/http" |
| "net/http/httptest" |
| "testing" |
| "text/template" |
| ) |
| |
| var ( |
| // NOTE: with no plain-text in the template, template.Execute will not |
| // return an error when http.ResponseWriter.Write does return an error. |
| tmpl = template.Must(template.New("test").Parse("{{.Foo}}")) |
| ) |
| |
| type withFoo struct { |
| Foo int |
| } |
| |
| type withoutFoo struct { |
| } |
| |
| type errResponseWriter struct { |
| } |
| |
| func (*errResponseWriter) Header() http.Header { |
| return http.Header{} |
| } |
| |
| func (*errResponseWriter) WriteHeader(int) { |
| } |
| |
| func (*errResponseWriter) Write(p []byte) (int, error) { |
| return 0, errors.New("error") |
| } |
| |
| func TestApplyTemplateToResponseWriter(t *testing.T) { |
| for _, tc := range []struct { |
| desc string |
| rw http.ResponseWriter |
| data interface{} |
| expVars int |
| }{ |
| { |
| desc: "no error", |
| rw: &httptest.ResponseRecorder{}, |
| data: &withFoo{}, |
| expVars: 0, |
| }, |
| { |
| desc: "template error", |
| rw: &httptest.ResponseRecorder{}, |
| data: &withoutFoo{}, |
| expVars: 0, |
| }, |
| { |
| desc: "ResponseWriter error", |
| rw: &errResponseWriter{}, |
| data: &withFoo{}, |
| expVars: 1, |
| }, |
| } { |
| httpErrors.Init() |
| applyTemplateToResponseWriter(tc.rw, tmpl, tc.data) |
| gotVars := 0 |
| httpErrors.Do(func(expvar.KeyValue) { |
| gotVars++ |
| }) |
| if gotVars != tc.expVars { |
| t.Errorf("applyTemplateToResponseWriter(%q): got %d vars, want %d", tc.desc, gotVars, tc.expVars) |
| } |
| } |
| } |