diff --git a/internal/server/data/server.go b/internal/server/data/server.go index 0ad59c2..60ccf07 100644 --- a/internal/server/data/server.go +++ b/internal/server/data/server.go @@ -1 +1,24 @@ package data + +import ( + "net/http" + + "github.com/gorilla/mux" +) + +type routeSpec struct { + route string + method string + rh resourceHandler +} + +func configRouter(rs []routeSpec) (r *mux.Router) { + r = mux.NewRouter() + for _, s := range rs { + r.HandleFunc(s.route, checkHandler(s.rh)).Methods(s.method) + } + r.HandleFunc( + "/handlers/{handlerID}/{resource:.*}", + func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadRequest) }) + return r +} diff --git a/internal/server/data/server_test.go b/internal/server/data/server_test.go index 0ad59c2..c61a2ed 100644 --- a/internal/server/data/server_test.go +++ b/internal/server/data/server_test.go @@ -1 +1,43 @@ package data + +import ( + "net/http" + "net/http/httptest" + "testing" + + // "github.com/gorilla/mux" + + "github.com/BBVA/kapow/internal/server/model" +) + +func TestConfigRouterReturnsRouterWithDecoratedRoutes(t *testing.T) { + var handlerID string + list := []routeSpec{ + { + "/handlers/{handlerID}/dummy", + "GET", + func(w http.ResponseWriter, r *http.Request, h *model.Handler) { handlerID = h.ID }, + }, + } + Handlers = New() + Handlers.Add(&model.Handler{ID: "FOO"}) + m := configRouter(list) + + m.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", "/handlers/FOO/dummy", nil)) + + if handlerID != "FOO" { + t.Errorf(`Handler ID mismatch. Expected "FOO". Got %q`, handlerID) + } +} + +func TestConfigRouterReturnsRouterThat400sOnUnconfiguredResources(t *testing.T) { + m := configRouter([]routeSpec{}) + w := httptest.NewRecorder() + + m.ServeHTTP(w, httptest.NewRequest("GET", "/handlers/FOO/dummy", nil)) + + res := w.Result() + if res.StatusCode != http.StatusBadRequest { + t.Errorf("Status code mismatch. Expected 400. Got %d", res.StatusCode) + } +}