| @ -0,0 +1,112 @@ | |||||
| package middleware | |||||
| import ( | |||||
| "net/http" | |||||
| "net/http/httptest" | |||||
| "testing" | |||||
| "github.com/zenazn/goji/web" | |||||
| ) | |||||
| func testOptions(r *http.Request, f func(*web.C, http.ResponseWriter, *http.Request)) *httptest.ResponseRecorder { | |||||
| var c web.C | |||||
| h := func(w http.ResponseWriter, r *http.Request) { | |||||
| f(&c, w, r) | |||||
| } | |||||
| m := AutomaticOptions(&c, http.HandlerFunc(h)) | |||||
| w := httptest.NewRecorder() | |||||
| m.ServeHTTP(w, r) | |||||
| return w | |||||
| } | |||||
| var optionsTestEnv = map[string]interface{}{ | |||||
| web.ValidMethodsKey: []string{ | |||||
| "hello", | |||||
| "world", | |||||
| }, | |||||
| } | |||||
| func TestAutomaticOptions(t *testing.T) { | |||||
| t.Parallel() | |||||
| // Shouldn't interfere with normal requests | |||||
| r, _ := http.NewRequest("GET", "/", nil) | |||||
| rr := testOptions(r, | |||||
| func(c *web.C, w http.ResponseWriter, r *http.Request) { | |||||
| w.Write([]byte{'h', 'i'}) | |||||
| }, | |||||
| ) | |||||
| if rr.Code != http.StatusOK { | |||||
| t.Errorf("status is %d, not 200", rr.Code) | |||||
| } | |||||
| if rr.Body.String() != "hi" { | |||||
| t.Errorf("body was %q, should be %q", rr.Body.String(), "hi") | |||||
| } | |||||
| allow := rr.HeaderMap.Get("Allow") | |||||
| if allow != "" { | |||||
| t.Errorf("Allow header was set to %q, should be empty", allow) | |||||
| } | |||||
| // If we respond non-404 to an OPTIONS request, also don't interfere | |||||
| r, _ = http.NewRequest("OPTIONS", "/", nil) | |||||
| rr = testOptions(r, | |||||
| func(c *web.C, w http.ResponseWriter, r *http.Request) { | |||||
| c.Env = optionsTestEnv | |||||
| w.Write([]byte{'h', 'i'}) | |||||
| }, | |||||
| ) | |||||
| if rr.Code != http.StatusOK { | |||||
| t.Errorf("status is %d, not 200", rr.Code) | |||||
| } | |||||
| if rr.Body.String() != "hi" { | |||||
| t.Errorf("body was %q, should be %q", rr.Body.String(), "hi") | |||||
| } | |||||
| allow = rr.HeaderMap.Get("Allow") | |||||
| if allow != "" { | |||||
| t.Errorf("Allow header was set to %q, should be empty", allow) | |||||
| } | |||||
| // Provide options if we 404. Make sure we nom the output bytes | |||||
| r, _ = http.NewRequest("OPTIONS", "/", nil) | |||||
| rr = testOptions(r, | |||||
| func(c *web.C, w http.ResponseWriter, r *http.Request) { | |||||
| c.Env = optionsTestEnv | |||||
| w.WriteHeader(http.StatusNotFound) | |||||
| w.Write([]byte{'h', 'i'}) | |||||
| }, | |||||
| ) | |||||
| if rr.Code != http.StatusOK { | |||||
| t.Errorf("status is %d, not 200", rr.Code) | |||||
| } | |||||
| if rr.Body.Len() != 0 { | |||||
| t.Errorf("body was %q, should be empty", rr.Body.String()) | |||||
| } | |||||
| allow = rr.HeaderMap.Get("Allow") | |||||
| correctHeaders := "hello, world, OPTIONS" | |||||
| if allow != "hello, world, OPTIONS" { | |||||
| t.Errorf("Allow header should be %q, was %q", correctHeaders, | |||||
| allow) | |||||
| } | |||||
| // If we somehow 404 without giving a list of valid options, don't do | |||||
| // anything | |||||
| r, _ = http.NewRequest("OPTIONS", "/", nil) | |||||
| rr = testOptions(r, | |||||
| func(c *web.C, w http.ResponseWriter, r *http.Request) { | |||||
| w.WriteHeader(http.StatusNotFound) | |||||
| w.Write([]byte{'h', 'i'}) | |||||
| }, | |||||
| ) | |||||
| if rr.Code != http.StatusNotFound { | |||||
| t.Errorf("status is %d, not 404", rr.Code) | |||||
| } | |||||
| if rr.Body.String() != "hi" { | |||||
| t.Errorf("body was %q, should be %q", rr.Body.String(), "hi") | |||||
| } | |||||
| allow = rr.HeaderMap.Get("Allow") | |||||
| if allow != "" { | |||||
| t.Errorf("Allow header was set to %q, should be empty", allow) | |||||
| } | |||||
| } | |||||