From 186f96b8e875565128f48e92078f379d8b194111 Mon Sep 17 00:00:00 2001 From: Mike Arpaia Date: Sun, 4 Sep 2016 15:43:12 -0400 Subject: [PATCH] Handler tests (#106) --- kitserver/handler.go | 364 +++++++++++++++++++------------------- kitserver/handler_test.go | 114 ++++++++++++ 2 files changed, 297 insertions(+), 181 deletions(-) create mode 100644 kitserver/handler_test.go diff --git a/kitserver/handler.go b/kitserver/handler.go index 192e846d35..e6be71e1ca 100644 --- a/kitserver/handler.go +++ b/kitserver/handler.go @@ -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") diff --git a/kitserver/handler_test.go b/kitserver/handler_test.go new file mode 100644 index 0000000000..892fb32f41 --- /dev/null +++ b/kitserver/handler_test.go @@ -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) + } + +}