Added getRoute to control api

This commit is contained in:
Héctor Hurtado
2019-10-24 17:51:55 +02:00
parent 2fc18b76e3
commit a54c6f24a1
5 changed files with 145 additions and 8 deletions
+19 -3
View File
@@ -36,11 +36,13 @@ func Run(bindAddr string) {
func configRouter() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/routes/{id}", removeRoute).
Methods("DELETE")
Methods(http.MethodDelete)
r.HandleFunc("/routes/{id}", getRoute).
Methods(http.MethodGet)
r.HandleFunc("/routes", listRoutes).
Methods("GET")
Methods(http.MethodGet)
r.HandleFunc("/routes", addRoute).
Methods("POST")
Methods(http.MethodPost)
return r
}
@@ -84,6 +86,7 @@ func addRoute(res http.ResponseWriter, req *http.Request) {
return
}
if route.Method == "" {
spec / test / features / control / get / success.feature
res.WriteHeader(http.StatusUnprocessableEntity)
return
}
@@ -112,3 +115,16 @@ func addRoute(res http.ResponseWriter, req *http.Request) {
res.Header().Set("Content-Type", "application/json")
_, _ = res.Write(createdBytes)
}
var funcGet func(string) (model.Route, error) = user.Routes.Get
func getRoute(res http.ResponseWriter, req *http.Request) {
id := mux.Vars(req)["id"]
if r, err := funcGet(id); err != nil {
res.WriteHeader(http.StatusNotFound)
} else {
res.Header().Set("Content-Type", "application/json")
rBytes, _ := json.Marshal(r)
_, _ = res.Write(rBytes)
}
}
+46 -4
View File
@@ -18,6 +18,7 @@ package control
import (
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"net/http/httptest"
"reflect"
@@ -28,6 +29,7 @@ import (
"github.com/gorilla/mux"
"github.com/BBVA/kapow/internal/server/model"
"github.com/BBVA/kapow/internal/server/user"
)
func TestConfigRouterHasRoutesWellConfigured(t *testing.T) {
@@ -37,10 +39,10 @@ func TestConfigRouterHasRoutesWellConfigured(t *testing.T) {
mustMatch bool
vars []string
}{
{"/routes/ROUTE_YYYYYYYYYYYYYYY", http.MethodGet, 0, false, []string{}},
{"/routes/ROUTE_YYYYYYYYYYYYYYY", http.MethodPut, 0, false, []string{}},
{"/routes/ROUTE_YYYYYYYYYYYYYYY", http.MethodPost, 0, false, []string{}},
{"/routes/ROUTE_YYYYYYYYYYYYYYY", http.MethodDelete, reflect.ValueOf(removeRoute).Pointer(), true, []string{"id"}},
{"/routes/FOO", http.MethodGet, reflect.ValueOf(getRoute).Pointer(), true, []string{"id"}},
{"/routes/FOO", http.MethodPut, 0, false, []string{}},
{"/routes/FOO", http.MethodPost, 0, false, []string{}},
{"/routes/FOO", http.MethodDelete, reflect.ValueOf(removeRoute).Pointer(), true, []string{"id"}},
{"/routes", http.MethodGet, reflect.ValueOf(listRoutes).Pointer(), true, []string{}},
{"/routes", http.MethodPut, 0, false, []string{}},
{"/routes", http.MethodPost, reflect.ValueOf(addRoute).Pointer(), true, []string{}},
@@ -402,3 +404,43 @@ func TestListRoutesReturnsTwoElementsList(t *testing.T) {
t.Errorf("Response mismatch. Expected %#v, got: %#v", expectedRouteList, respJson)
}
}
func TestGetRouteReturns404sWhenRouteDoesntExist(t *testing.T) {
handler := mux.NewRouter()
handler.HandleFunc("/routes/{id}", getRoute).
Methods("GET")
r := httptest.NewRequest(http.MethodGet, "/routes/FOO", nil)
w := httptest.NewRecorder()
handler.ServeHTTP(w, r)
resp := w.Result()
if resp.StatusCode != http.StatusNotFound {
t.Errorf("HTTP status mismatch. Expected: %d, got: %d", http.StatusNotFound, resp.StatusCode)
}
}
func TestGetRouteReturnsTheRequestedRoute(t *testing.T) {
handler := mux.NewRouter()
handler.HandleFunc("/routes/{id}", getRoute).
Methods("GET")
r := httptest.NewRequest(http.MethodGet, "/routes/FOO", nil)
w := httptest.NewRecorder()
user.Routes.Append(model.Route{ID: "FOO"})
handler.ServeHTTP(w, r)
resp := w.Result()
respJson := model.Route{}
if resp.StatusCode != http.StatusOK {
t.Errorf("HTTP status mismatch. Expected: %d, got: %d", http.StatusOK, resp.StatusCode)
}
bBytes, _ := ioutil.ReadAll(resp.Body)
if err := json.Unmarshal(bBytes, &respJson); err != nil {
t.Errorf("Invalid JSON response. %s", string(bBytes))
}
if respJson.ID != "FOO" {
t.Errorf(`Route mismatch. Expected: "FOO". Got: %s`, respJson.ID)
}
}