1 | // Copyright 2015 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 redirect |
6 | |
7 | import ( |
8 | "net/http" |
9 | "net/http/httptest" |
10 | "testing" |
11 | ) |
12 | |
13 | type redirectResult struct { |
14 | status int |
15 | path string |
16 | } |
17 | |
18 | func errorResult(status int) redirectResult { |
19 | return redirectResult{status, ""} |
20 | } |
21 | |
22 | func TestRedirects(t *testing.T) { |
23 | var tests = map[string]redirectResult{ |
24 | "/foo": errorResult(404), |
25 | } |
26 | |
27 | mux := http.NewServeMux() |
28 | Register(mux) |
29 | ts := httptest.NewServer(mux) |
30 | defer ts.Close() |
31 | |
32 | for path, want := range tests { |
33 | if want.path != "" && want.path[0] == '/' { |
34 | // All redirects are absolute. |
35 | want.path = ts.URL + want.path |
36 | } |
37 | |
38 | req, err := http.NewRequest("GET", ts.URL+path, nil) |
39 | if err != nil { |
40 | t.Errorf("(path: %q) unexpected error: %v", path, err) |
41 | continue |
42 | } |
43 | |
44 | resp, err := http.DefaultTransport.RoundTrip(req) |
45 | if err != nil { |
46 | t.Errorf("(path: %q) unexpected error: %v", path, err) |
47 | continue |
48 | } |
49 | resp.Body.Close() // We only care about the headers, so close the body immediately. |
50 | |
51 | if resp.StatusCode != want.status { |
52 | t.Errorf("(path: %q) got status %d, want %d", path, resp.StatusCode, want.status) |
53 | } |
54 | |
55 | if want.status != 301 && want.status != 302 { |
56 | // Not a redirect. Just check status. |
57 | continue |
58 | } |
59 | |
60 | out, _ := resp.Location() |
61 | if got := out.String(); got != want.path { |
62 | t.Errorf("(path: %q) got %s, want %s", path, got, want.path) |
63 | } |
64 | } |
65 | } |
66 |
Members