Handler tests (#106)

This commit is contained in:
Mike Arpaia 2016-09-04 15:43:12 -04:00 committed by GitHub
parent 1abc44790e
commit 186f96b8e8
2 changed files with 297 additions and 181 deletions

View file

@ -11,6 +11,188 @@ import (
"golang.org/x/net/context"
)
func attachAPIRoutes(router *mux.Router, ctx context.Context, svc kolide.Service, opts []kithttp.ServerOption) {
router.Handle("/api/v1/kolide/users",
kithttp.NewServer(
ctx,
mustBeAdmin(makeCreateUserEndpoint(svc)),
decodeCreateUserRequest,
encodeResponse,
opts...,
),
).Methods("POST")
router.Handle("/api/v1/kolide/users/{id}",
kithttp.NewServer(
ctx,
canReadUser(makeGetUserEndpoint(svc)),
decodeGetUserRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/users/{id}/password",
kithttp.NewServer(
ctx,
canModifyUser(makeChangePasswordEndpoint(svc)),
decodeChangePasswordRequest,
encodeResponse,
opts...,
),
).Methods("POST")
router.Handle("/api/v1/kolide/users/{id}/role",
kithttp.NewServer(
ctx,
mustBeAdmin(makeUpdateAdminRoleEndpoint(svc)),
decodeUpdateAdminRoleRequest,
encodeResponse,
opts...,
),
).Methods("POST")
router.Handle("/api/v1/kolide/users/{id}/status",
kithttp.NewServer(
ctx,
canModifyUser(makeUpdateUserStatusEndpoint(svc)),
decodeUpdateUserStatusRequest,
encodeResponse,
opts...,
),
).Methods("POST")
router.Handle("/api/v1/kolide/queries/{id}",
kithttp.NewServer(
ctx,
makeGetQueryEndpoint(svc),
decodeGetQueryRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/queries",
kithttp.NewServer(
ctx,
makeGetAllQueriesEndpoint(svc),
decodeNoParamsRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/queries",
kithttp.NewServer(
ctx,
makeCreateQueryEndpoint(svc),
decodeCreateQueryRequest,
encodeResponse,
opts...,
),
).Methods("POST")
router.Handle("/api/v1/kolide/queries/{id}",
kithttp.NewServer(
ctx,
makeModifyQueryEndpoint(svc),
decodeModifyQueryRequest,
encodeResponse,
opts...,
),
).Methods("PATCH")
router.Handle("/api/v1/kolide/queries/{id}",
kithttp.NewServer(
ctx,
makeDeleteQueryEndpoint(svc),
decodeDeleteQueryRequest,
encodeResponse,
opts...,
),
).Methods("DELETE")
router.Handle("/api/v1/kolide/packs/{id}",
kithttp.NewServer(
ctx,
makeGetPackEndpoint(svc),
decodeGetPackRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/packs",
kithttp.NewServer(
ctx,
makeGetAllPacksEndpoint(svc),
decodeNoParamsRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/packs",
kithttp.NewServer(
ctx,
makeCreatePackEndpoint(svc),
decodeCreatePackRequest,
encodeResponse,
opts...,
),
).Methods("POST")
router.Handle("/api/v1/kolide/packs/{id}",
kithttp.NewServer(
ctx,
makeModifyPackEndpoint(svc),
decodeModifyPackRequest,
encodeResponse,
opts...,
),
).Methods("PATCH")
router.Handle("/api/v1/kolide/packs/{id}",
kithttp.NewServer(
ctx,
makeDeletePackEndpoint(svc),
decodeDeletePackRequest,
encodeResponse,
opts...,
),
).Methods("DELETE")
router.Handle("/api/v1/kolide/packs/{pid}/queries/{qid}",
kithttp.NewServer(
ctx,
makeAddQueryToPackEndpoint(svc),
decodeAddQueryToPackRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/packs/{id}/queries",
kithttp.NewServer(
ctx,
makeGetQueriesInPackEndpoint(svc),
decodeGetQueriesInPackRequest,
encodeResponse,
opts...,
),
).Methods("GET")
router.Handle("/api/v1/kolide/packs/{pid}/queries/{qid}",
kithttp.NewServer(
ctx,
makeDeleteQueryFromPackEndpoint(svc),
decodeDeleteQueryFromPackRequest,
encodeResponse,
opts...,
),
).Methods("DELETE")
}
// MakeHandler creates an http handler for the Kolide API
func MakeHandler(ctx context.Context, svc kolide.Service, logger kitlog.Logger) http.Handler {
opts := []kithttp.ServerOption{
@ -24,189 +206,9 @@ func MakeHandler(ctx context.Context, svc kolide.Service, logger kitlog.Logger)
}
api := mux.NewRouter()
api.Handle("/users",
kithttp.NewServer(
ctx,
mustBeAdmin(makeCreateUserEndpoint(svc)),
decodeCreateUserRequest,
encodeResponse,
opts...,
),
).Methods("POST")
api.Handle("/users/{id}",
kithttp.NewServer(
ctx,
canReadUser(makeGetUserEndpoint(svc)),
decodeGetUserRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/users/{id}/password",
kithttp.NewServer(
ctx,
canModifyUser(makeChangePasswordEndpoint(svc)),
decodeChangePasswordRequest,
encodeResponse,
opts...,
),
).Methods("POST")
api.Handle("/users/{id}/role",
kithttp.NewServer(
ctx,
mustBeAdmin(makeUpdateAdminRoleEndpoint(svc)),
decodeUpdateAdminRoleRequest,
encodeResponse,
opts...,
),
).Methods("POST")
api.Handle("/users/{id}/status",
kithttp.NewServer(
ctx,
canModifyUser(makeUpdateUserStatusEndpoint(svc)),
decodeUpdateUserStatusRequest,
encodeResponse,
opts...,
),
).Methods("POST")
api.Handle("/queries/{id}",
kithttp.NewServer(
ctx,
makeGetQueryEndpoint(svc),
decodeGetQueryRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/queries",
kithttp.NewServer(
ctx,
makeGetAllQueriesEndpoint(svc),
decodeNoParamsRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/queries",
kithttp.NewServer(
ctx,
makeCreateQueryEndpoint(svc),
decodeCreateQueryRequest,
encodeResponse,
opts...,
),
).Methods("POST")
api.Handle("/queries/{id}",
kithttp.NewServer(
ctx,
makeModifyQueryEndpoint(svc),
decodeModifyQueryRequest,
encodeResponse,
opts...,
),
).Methods("PATCH")
api.Handle("/queries/{id}",
kithttp.NewServer(
ctx,
makeDeleteQueryEndpoint(svc),
decodeDeleteQueryRequest,
encodeResponse,
opts...,
),
).Methods("DELETE")
api.Handle("/packs/{id}",
kithttp.NewServer(
ctx,
makeGetPackEndpoint(svc),
decodeGetPackRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/packs",
kithttp.NewServer(
ctx,
makeGetAllPacksEndpoint(svc),
decodeNoParamsRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/packs",
kithttp.NewServer(
ctx,
makeCreatePackEndpoint(svc),
decodeCreatePackRequest,
encodeResponse,
opts...,
),
).Methods("POST")
api.Handle("/packs/{id}",
kithttp.NewServer(
ctx,
makeModifyPackEndpoint(svc),
decodeModifyPackRequest,
encodeResponse,
opts...,
),
).Methods("PATCH")
api.Handle("/packs/{id}",
kithttp.NewServer(
ctx,
makeDeletePackEndpoint(svc),
decodeDeletePackRequest,
encodeResponse,
opts...,
),
).Methods("DELETE")
api.Handle("/packs/{pid}/queries/{qid}",
kithttp.NewServer(
ctx,
makeAddQueryToPackEndpoint(svc),
decodeAddQueryToPackRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/packs/{id}/queries",
kithttp.NewServer(
ctx,
makeGetQueriesInPackEndpoint(svc),
decodeGetQueriesInPackRequest,
encodeResponse,
opts...,
),
).Methods("GET")
api.Handle("/packs/{pid}/queries/{qid}",
kithttp.NewServer(
ctx,
makeDeleteQueryFromPackEndpoint(svc),
decodeDeleteQueryFromPackRequest,
encodeResponse,
opts...,
),
).Methods("DELETE")
attachAPIRoutes(api, ctx, svc, opts)
r := mux.NewRouter()
r.PathPrefix("/api/v1/kolide").Handler(authMiddleware(svc, logger, api))
r.Handle("/api/login", login(svc, logger)).Methods("POST")
r.Handle("/api/logout", logout(svc, logger)).Methods("GET")

114
kitserver/handler_test.go Normal file
View file

@ -0,0 +1,114 @@
package kitserver
import (
"context"
"net/http/httptest"
"testing"
"github.com/gorilla/mux"
"github.com/kolide/kolide-ose/datastore"
"github.com/stretchr/testify/assert"
)
func TestAPIRoutes(t *testing.T) {
ds, err := datastore.New("gorm-sqlite3", ":memory:")
assert.Nil(t, err)
svc, err := NewService(testConfig(ds))
assert.Nil(t, err)
ctx := context.Background()
r := mux.NewRouter()
attachAPIRoutes(r, ctx, svc, nil)
handler := mux.NewRouter()
handler.PathPrefix("/api/v1/kolide").Handler(r)
var routes = []struct {
verb string
uri string
}{
{
verb: "POST",
uri: "/api/v1/kolide/users",
},
{
verb: "GET",
uri: "/api/v1/kolide/users/1",
},
{
verb: "POST",
uri: "/api/v1/kolide/users/1/password",
},
{
verb: "POST",
uri: "/api/v1/kolide/users/1/role",
},
{
verb: "POST",
uri: "/api/v1/kolide/users/1/status",
},
{
verb: "GET",
uri: "/api/v1/kolide/queries/1",
},
{
verb: "GET",
uri: "/api/v1/kolide/queries",
},
{
verb: "POST",
uri: "/api/v1/kolide/queries",
},
{
verb: "PATCH",
uri: "/api/v1/kolide/queries/1",
},
{
verb: "DELETE",
uri: "/api/v1/kolide/queries/1",
},
{
verb: "GET",
uri: "/api/v1/kolide/packs/1",
},
{
verb: "GET",
uri: "/api/v1/kolide/packs",
},
{
verb: "POST",
uri: "/api/v1/kolide/packs",
},
{
verb: "PATCH",
uri: "/api/v1/kolide/packs/1",
},
{
verb: "DELETE",
uri: "/api/v1/kolide/packs/1",
},
{
verb: "GET",
uri: "/api/v1/kolide/packs/1/queries/2",
},
{
verb: "GET",
uri: "/api/v1/kolide/packs/1/queries",
},
{
verb: "DELETE",
uri: "/api/v1/kolide/packs/1/queries/2",
},
}
for _, route := range routes {
recorder := httptest.NewRecorder()
handler.ServeHTTP(
recorder,
httptest.NewRequest(route.verb, route.uri, nil),
)
assert.NotEqual(t, 404, recorder.Code)
}
}