package negroni import ( "net/http" "net/http/httptest" "reflect" "testing" ) /* Test Helpers */ func expect(t *testing.T, a interface{}, b interface{}) { if a != b { t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) } } func refute(t *testing.T, a interface{}, b interface{}) { if a == b { t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) } } func TestNegroniRun(t *testing.T) { // just test that Run doesn't bomb go New().Run(":3000") } func TestNegroniServeHTTP(t *testing.T) { result := "" response := httptest.NewRecorder() n := New() n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { result += "foo" next(rw, r) result += "ban" })) n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { result += "bar" next(rw, r) result += "baz" })) n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { result += "bat" rw.WriteHeader(http.StatusBadRequest) })) n.ServeHTTP(response, (*http.Request)(nil)) expect(t, result, "foobarbatbazban") expect(t, response.Code, http.StatusBadRequest) } // Ensures that a Negroni middleware chain // can correctly return all of its handlers. func TestHandlers(t *testing.T) { response := httptest.NewRecorder() n := New() handlers := n.Handlers() expect(t, 0, len(handlers)) n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { rw.WriteHeader(http.StatusOK) })) // Expects the length of handlers to be exactly 1 // after adding exactly one handler to the middleware chain handlers = n.Handlers() expect(t, 1, len(handlers)) // Ensures that the first handler that is in sequence behaves // exactly the same as the one that was registered earlier handlers[0].ServeHTTP(response, (*http.Request)(nil), nil) expect(t, response.Code, http.StatusOK) }