Validate url_pattern format in control API append operation
Closes: #38 Co-authored-by: César Gallego Rodríguez <cesar.gallego.next@bbva.com>
This commit is contained in:
@@ -70,6 +70,10 @@ func listRoutes(res http.ResponseWriter, req *http.Request) {
|
|||||||
var funcAdd func(model.Route) model.Route = user.Routes.Append
|
var funcAdd func(model.Route) model.Route = user.Routes.Append
|
||||||
var idGenerator = uuid.NewUUID
|
var idGenerator = uuid.NewUUID
|
||||||
|
|
||||||
|
var pathValidator func(string) error = func(path string) error {
|
||||||
|
return mux.NewRouter().NewRoute().BuildOnly().Path(path).GetError()
|
||||||
|
}
|
||||||
|
|
||||||
func addRoute(res http.ResponseWriter, req *http.Request) {
|
func addRoute(res http.ResponseWriter, req *http.Request) {
|
||||||
var route model.Route
|
var route model.Route
|
||||||
|
|
||||||
@@ -88,6 +92,12 @@ func addRoute(res http.ResponseWriter, req *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = pathValidator(route.Pattern)
|
||||||
|
if err != nil {
|
||||||
|
res.WriteHeader(http.StatusUnprocessableEntity)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
id, err := idGenerator()
|
id, err := idGenerator()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
res.WriteHeader(http.StatusInternalServerError)
|
res.WriteHeader(http.StatusInternalServerError)
|
||||||
|
|||||||
@@ -72,6 +72,22 @@ func TestConfigRouterHasRoutesWellConfigured(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPathValidatorNoErrorWhenCorrectPath(t *testing.T) {
|
||||||
|
err := pathValidator("/routes/{routeID}")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPathValidatorErrorWhenInvalidPath(t *testing.T) {
|
||||||
|
err := pathValidator("/routes/{routeID{")
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestAddRouteReturnsBadRequestWhenMalformedJSONBody(t *testing.T) {
|
func TestAddRouteReturnsBadRequestWhenMalformedJSONBody(t *testing.T) {
|
||||||
reqPayload := `{
|
reqPayload := `{
|
||||||
method": "GET",
|
method": "GET",
|
||||||
@@ -181,6 +197,9 @@ func TestAddRouteGeneratesRouteID(t *testing.T) {
|
|||||||
input.Index = 0
|
input.Index = 0
|
||||||
return input
|
return input
|
||||||
}
|
}
|
||||||
|
origPathValidator := pathValidator
|
||||||
|
defer func() { pathValidator = origPathValidator }()
|
||||||
|
pathValidator = func(path string) error { return nil }
|
||||||
|
|
||||||
handler.ServeHTTP(resp, req)
|
handler.ServeHTTP(resp, req)
|
||||||
|
|
||||||
@@ -200,6 +219,10 @@ func TestAddRoute500sWhenIDGeneratorFails(t *testing.T) {
|
|||||||
resp := httptest.NewRecorder()
|
resp := httptest.NewRecorder()
|
||||||
handler := http.HandlerFunc(addRoute)
|
handler := http.HandlerFunc(addRoute)
|
||||||
|
|
||||||
|
origPathValidator := pathValidator
|
||||||
|
defer func() { pathValidator = origPathValidator }()
|
||||||
|
pathValidator = func(path string) error { return nil }
|
||||||
|
|
||||||
idGenOrig := idGenerator
|
idGenOrig := idGenerator
|
||||||
defer func() { idGenerator = idGenOrig }()
|
defer func() { idGenerator = idGenOrig }()
|
||||||
idGenerator = func() (uuid.UUID, error) {
|
idGenerator = func() (uuid.UUID, error) {
|
||||||
@@ -237,6 +260,9 @@ func TestAddRouteReturnsCreated(t *testing.T) {
|
|||||||
|
|
||||||
return model.Route{}
|
return model.Route{}
|
||||||
}
|
}
|
||||||
|
origPathValidator := pathValidator
|
||||||
|
defer func() { pathValidator = origPathValidator }()
|
||||||
|
pathValidator = func(path string) error { return nil }
|
||||||
|
|
||||||
handler.ServeHTTP(resp, req)
|
handler.ServeHTTP(resp, req)
|
||||||
|
|
||||||
@@ -259,6 +285,27 @@ func TestAddRouteReturnsCreated(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddRoute422sWhenInvalidRoute(t *testing.T) {
|
||||||
|
reqPayload := `{
|
||||||
|
"method": "GET",
|
||||||
|
"url_pattern": "/he{{o",
|
||||||
|
"entrypoint": "/bin/sh -c",
|
||||||
|
"command": "echo Hello World | kapow set /response/body"
|
||||||
|
}`
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/routes", strings.NewReader(reqPayload))
|
||||||
|
resp := httptest.NewRecorder()
|
||||||
|
handler := http.HandlerFunc(addRoute)
|
||||||
|
origPathValidator := pathValidator
|
||||||
|
defer func() { pathValidator = origPathValidator }()
|
||||||
|
pathValidator = func(path string) error { return errors.New("Invalid route") }
|
||||||
|
|
||||||
|
handler.ServeHTTP(resp, req)
|
||||||
|
|
||||||
|
if resp.Code != http.StatusUnprocessableEntity {
|
||||||
|
t.Error("Invalid route registered")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRemoveRouteReturnsNotFound(t *testing.T) {
|
func TestRemoveRouteReturnsNotFound(t *testing.T) {
|
||||||
req := httptest.NewRequest(http.MethodDelete, "/routes/ROUTE_XXXXXXXXXXXXXXXXXX", nil)
|
req := httptest.NewRequest(http.MethodDelete, "/routes/ROUTE_XXXXXXXXXXXXXXXXXX", nil)
|
||||||
resp := httptest.NewRecorder()
|
resp := httptest.NewRecorder()
|
||||||
|
|||||||
Reference in New Issue
Block a user