mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
initial router tests: apps
This commit is contained in:
37
api/server/datastore/mock.go
Normal file
37
api/server/datastore/mock.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package datastore
|
||||||
|
|
||||||
|
import "github.com/iron-io/functions/api/models"
|
||||||
|
|
||||||
|
type Mock struct{}
|
||||||
|
|
||||||
|
func (m *Mock) GetApp(app string) (*models.App, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) GetApps(appFilter *models.AppFilter) ([]*models.App, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) StoreApp(app *models.App) (*models.App, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) RemoveApp(app string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) GetRoute(app, route string) (*models.Route, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) GetRoutes(routeFilter *models.RouteFilter) ([]*models.Route, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) StoreRoute(route *models.Route) (*models.Route, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Mock) RemoveRoute(app, route string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/iron-io/functions/api/models"
|
"github.com/iron-io/functions/api/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleAppDestroy(c *gin.Context) {
|
func handleAppDelete(c *gin.Context) {
|
||||||
store := c.MustGet("store").(models.Datastore)
|
store := c.MustGet("store").(models.Datastore)
|
||||||
log := c.MustGet("log").(logrus.FieldLogger)
|
log := c.MustGet("log").(logrus.FieldLogger)
|
||||||
|
|
||||||
176
api/server/router/apps_test.go
Normal file
176
api/server/router/apps_test.go
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
package router
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/iron-io/functions/api/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAppCreate(t *testing.T) {
|
||||||
|
router := testRouter()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
path string
|
||||||
|
body string
|
||||||
|
expectedCode int
|
||||||
|
expectedError error
|
||||||
|
}{
|
||||||
|
// errors
|
||||||
|
{"/v1/apps", ``, http.StatusBadRequest, models.ErrInvalidJSON},
|
||||||
|
{"/v1/apps", `{}`, http.StatusBadRequest, models.ErrAppsMissingNew},
|
||||||
|
{"/v1/apps", `{ "name": "Test" }`, http.StatusBadRequest, models.ErrAppsMissingNew},
|
||||||
|
{"/v1/apps", `{ "app": { "name": "" } }`, http.StatusInternalServerError, models.ErrAppsValidationMissingName},
|
||||||
|
{"/v1/apps", `{ "app": { "name": "1234567890123456789012345678901" } }`, http.StatusInternalServerError, models.ErrAppsValidationTooLongName},
|
||||||
|
{"/v1/apps", `{ "app": { "name": "&&%@!#$#@$" } }`, http.StatusInternalServerError, models.ErrAppsValidationInvalidName},
|
||||||
|
{"/v1/apps", `{ "app": { "name": "&&%@!#$#@$" } }`, http.StatusInternalServerError, models.ErrAppsValidationInvalidName},
|
||||||
|
|
||||||
|
// success
|
||||||
|
{"/v1/apps", `{ "app": { "name": "teste" } }`, http.StatusOK, nil},
|
||||||
|
} {
|
||||||
|
body := bytes.NewBuffer([]byte(test.body))
|
||||||
|
_, rec := routerRequest(t, router, "POST", test.path, body)
|
||||||
|
|
||||||
|
if rec.Code != test.expectedCode {
|
||||||
|
t.Errorf("Test %d: Expected status code to be %d but was %d",
|
||||||
|
i, test.expectedCode, rec.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
if test.expectedError != nil {
|
||||||
|
resp := getErrorResponse(t, rec)
|
||||||
|
|
||||||
|
if !strings.Contains(resp.Error.Message, test.expectedError.Error()) {
|
||||||
|
t.Errorf("Test %d: Expected error message to have `%s`",
|
||||||
|
i, test.expectedError.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppDelete(t *testing.T) {
|
||||||
|
router := testRouter()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
path string
|
||||||
|
body string
|
||||||
|
expectedCode int
|
||||||
|
expectedError error
|
||||||
|
}{
|
||||||
|
{"/v1/apps", "", http.StatusNotFound, nil},
|
||||||
|
{"/v1/apps/myapp", "", http.StatusOK, nil},
|
||||||
|
} {
|
||||||
|
_, rec := routerRequest(t, router, "DELETE", test.path, nil)
|
||||||
|
|
||||||
|
if rec.Code != test.expectedCode {
|
||||||
|
t.Errorf("Test %d: Expected status code to be %d but was %d",
|
||||||
|
i, test.expectedCode, rec.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
if test.expectedError != nil {
|
||||||
|
resp := getErrorResponse(t, rec)
|
||||||
|
|
||||||
|
if !strings.Contains(resp.Error.Message, test.expectedError.Error()) {
|
||||||
|
t.Errorf("Test %d: Expected error message to have `%s`",
|
||||||
|
i, test.expectedError.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppList(t *testing.T) {
|
||||||
|
router := testRouter()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
path string
|
||||||
|
body string
|
||||||
|
expectedCode int
|
||||||
|
expectedError error
|
||||||
|
}{
|
||||||
|
{"/v1/apps", "", http.StatusOK, nil},
|
||||||
|
} {
|
||||||
|
_, rec := routerRequest(t, router, "GET", test.path, nil)
|
||||||
|
|
||||||
|
if rec.Code != test.expectedCode {
|
||||||
|
t.Errorf("Test %d: Expected status code to be %d but was %d",
|
||||||
|
i, test.expectedCode, rec.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
if test.expectedError != nil {
|
||||||
|
resp := getErrorResponse(t, rec)
|
||||||
|
|
||||||
|
if !strings.Contains(resp.Error.Message, test.expectedError.Error()) {
|
||||||
|
t.Errorf("Test %d: Expected error message to have `%s`",
|
||||||
|
i, test.expectedError.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppGet(t *testing.T) {
|
||||||
|
router := testRouter()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
path string
|
||||||
|
body string
|
||||||
|
expectedCode int
|
||||||
|
expectedError error
|
||||||
|
}{
|
||||||
|
{"/v1/apps/myapp", "", http.StatusNotFound, nil},
|
||||||
|
} {
|
||||||
|
_, rec := routerRequest(t, router, "GET", test.path, nil)
|
||||||
|
|
||||||
|
if rec.Code != test.expectedCode {
|
||||||
|
t.Errorf("Test %d: Expected status code to be %d but was %d",
|
||||||
|
i, test.expectedCode, rec.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
if test.expectedError != nil {
|
||||||
|
resp := getErrorResponse(t, rec)
|
||||||
|
|
||||||
|
if !strings.Contains(resp.Error.Message, test.expectedError.Error()) {
|
||||||
|
t.Errorf("Test %d: Expected error message to have `%s`",
|
||||||
|
i, test.expectedError.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppUpdate(t *testing.T) {
|
||||||
|
router := testRouter()
|
||||||
|
|
||||||
|
for i, test := range []struct {
|
||||||
|
path string
|
||||||
|
body string
|
||||||
|
expectedCode int
|
||||||
|
expectedError error
|
||||||
|
}{
|
||||||
|
// errors
|
||||||
|
{"/v1/apps/myapp", ``, http.StatusBadRequest, models.ErrInvalidJSON},
|
||||||
|
{"/v1/apps/myapp", `{ "name": "" }`, http.StatusInternalServerError, models.ErrAppsValidationMissingName},
|
||||||
|
{"/v1/apps/myapp", `{ "name": "1234567890123456789012345678901" }`, http.StatusInternalServerError, models.ErrAppsValidationTooLongName},
|
||||||
|
{"/v1/apps/myapp", `{ "name": "&&%@!#$#@$" }`, http.StatusInternalServerError, models.ErrAppsValidationInvalidName},
|
||||||
|
{"/v1/apps/myapp", `{ "name": "&&%@!#$#@$" }`, http.StatusInternalServerError, models.ErrAppsValidationInvalidName},
|
||||||
|
|
||||||
|
// success
|
||||||
|
{"/v1/apps/myapp", `{ "name": "teste" }`, http.StatusOK, nil},
|
||||||
|
} {
|
||||||
|
body := bytes.NewBuffer([]byte(test.body))
|
||||||
|
_, rec := routerRequest(t, router, "PUT", test.path, body)
|
||||||
|
|
||||||
|
if rec.Code != test.expectedCode {
|
||||||
|
t.Errorf("Test %d: Expected status code to be %d but was %d",
|
||||||
|
i, test.expectedCode, rec.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
if test.expectedError != nil {
|
||||||
|
resp := getErrorResponse(t, rec)
|
||||||
|
|
||||||
|
if !strings.Contains(resp.Error.Message, test.expectedError.Error()) {
|
||||||
|
t.Errorf("Test %d: Expected error message to have `%s`",
|
||||||
|
i, test.expectedError.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,5 +21,25 @@ func handleAppUpdate(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if app == nil {
|
||||||
|
log.Debug(models.ErrAppsMissingNew)
|
||||||
|
c.JSON(http.StatusBadRequest, simpleError(models.ErrAppsMissingNew))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := app.Validate(); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
c.JSON(http.StatusInternalServerError, simpleError(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// app, err := store.StoreApp(wapp.App)
|
||||||
|
// if err != nil {
|
||||||
|
// log.WithError(err).Debug(models.ErrAppsCreate)
|
||||||
|
// c.JSON(http.StatusInternalServerError, simpleError(models.ErrAppsCreate))
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Nothing to update right now in apps
|
||||||
c.JSON(http.StatusOK, simpleError(models.ErrAppsNothingToUpdate))
|
c.JSON(http.StatusOK, simpleError(models.ErrAppsNothingToUpdate))
|
||||||
}
|
}
|
||||||
|
|||||||
53
api/server/router/helpers.go
Normal file
53
api/server/router/helpers.go
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package router
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/Sirupsen/logrus"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/iron-io/functions/api/models"
|
||||||
|
"github.com/iron-io/functions/api/server/datastore"
|
||||||
|
)
|
||||||
|
|
||||||
|
func testRouter() *gin.Engine {
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(func(c *gin.Context) {
|
||||||
|
c.Set("store", &datastore.Mock{})
|
||||||
|
c.Set("log", logrus.WithFields(logrus.Fields{}))
|
||||||
|
c.Next()
|
||||||
|
})
|
||||||
|
Start(r)
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func routerRequest(t *testing.T, router *gin.Engine, method, path string, body io.Reader) (*http.Request, *httptest.ResponseRecorder) {
|
||||||
|
req, err := http.NewRequest(method, "http://localhost:8080"+path, body)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Test: Could not create %s request to %s: %v", method, path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
router.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
return req, rec
|
||||||
|
}
|
||||||
|
|
||||||
|
func getErrorResponse(t *testing.T, rec *httptest.ResponseRecorder) models.Error {
|
||||||
|
respBody, err := ioutil.ReadAll(rec.Body)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Test: Expected not empty response body")
|
||||||
|
}
|
||||||
|
|
||||||
|
var errResp models.Error
|
||||||
|
err = json.Unmarshal(respBody, &errResp)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Test: Expected response body to be a valid models.Error object")
|
||||||
|
}
|
||||||
|
|
||||||
|
return errResp
|
||||||
|
}
|
||||||
@@ -16,7 +16,7 @@ func Start(engine *gin.Engine) {
|
|||||||
|
|
||||||
v1.GET("/apps/:app", handleAppGet)
|
v1.GET("/apps/:app", handleAppGet)
|
||||||
v1.PUT("/apps/:app", handleAppUpdate)
|
v1.PUT("/apps/:app", handleAppUpdate)
|
||||||
v1.DELETE("/apps/:app", handleAppDestroy)
|
v1.DELETE("/apps/:app", handleAppDelete)
|
||||||
|
|
||||||
apps := v1.Group("/apps/:app")
|
apps := v1.Group("/apps/:app")
|
||||||
{
|
{
|
||||||
@@ -24,7 +24,7 @@ func Start(engine *gin.Engine) {
|
|||||||
apps.POST("/routes", handleRouteCreate)
|
apps.POST("/routes", handleRouteCreate)
|
||||||
apps.GET("/routes/:route", handleRouteGet)
|
apps.GET("/routes/:route", handleRouteGet)
|
||||||
apps.POST("/routes/:route", handleRouteUpdate)
|
apps.POST("/routes/:route", handleRouteUpdate)
|
||||||
apps.DELETE("/routes/:route", handleRouteDestroy)
|
apps.DELETE("/routes/:route", handleRouteDelete)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/iron-io/functions/api/models"
|
"github.com/iron-io/functions/api/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleRouteDestroy(c *gin.Context) {
|
func handleRouteDelete(c *gin.Context) {
|
||||||
store := c.MustGet("store").(models.Datastore)
|
store := c.MustGet("store").(models.Datastore)
|
||||||
log := c.MustGet("log").(logrus.FieldLogger)
|
log := c.MustGet("log").(logrus.FieldLogger)
|
||||||
|
|
||||||
1
api/server/router/routes_test.go
Normal file
1
api/server/router/routes_test.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package router
|
||||||
@@ -13,6 +13,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func handleRunner(c *gin.Context) {
|
func handleRunner(c *gin.Context) {
|
||||||
|
if strings.HasPrefix(c.Request.URL.Path, "/v1") {
|
||||||
|
c.Status(http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
log := c.MustGet("log").(logrus.FieldLogger)
|
log := c.MustGet("log").(logrus.FieldLogger)
|
||||||
store := c.MustGet("store").(models.Datastore)
|
store := c.MustGet("store").(models.Datastore)
|
||||||
config := c.MustGet("config").(*models.Config)
|
config := c.MustGet("config").(*models.Config)
|
||||||
|
|||||||
1
api/server/router/runner_test.go
Normal file
1
api/server/router/runner_test.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package router
|
||||||
Reference in New Issue
Block a user