From b9d65783b39bf7752881856131ae16e4c9cd0fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Hurtado?= Date: Thu, 10 Oct 2019 16:41:02 +0200 Subject: [PATCH] Added data server tests for checking valid handler --- internal/server/data/server.go | 33 +++--- internal/server/data/server_test.go | 149 ++++++++++++++++++---------- 2 files changed, 113 insertions(+), 69 deletions(-) diff --git a/internal/server/data/server.go b/internal/server/data/server.go index e2b8a11..eda9eb0 100644 --- a/internal/server/data/server.go +++ b/internal/server/data/server.go @@ -10,27 +10,26 @@ import ( // Rutas a registrar: // /handlers/{handler_id}/{resource_path}/request GET // /handlers/{handler_id}/{resource_path}/response PUT - -func configRouter() *mux.Router { - r := mux.NewRouter() - - r.HandleFunc("/handlers/{handler_id}/response/headers/", updateResource).Methods("PUT") - r.HandleFunc("/handlers/{handler_id}/response/headers/{key}", updateResource).Methods("PUT") - return r -} - -var getHandlerId func(string) (*model.Handler, bool) = Handlers.Get - +//func configRouter() *mux.Router { +// r := mux.NewRouter() +// +// r.HandleFunc("/handlers/{handler_id}/response/headers/", updateResource).Methods("PUT") +// r.HandleFunc("/handlers/{handler_id}/response/headers/{key}", updateResource).Methods("PUT") +// return r +//} +// //func Run(bindAddr string) { // r := configRouter() // // log.Fatal(http.ListenAndServe(bindAddr, r)) //} - +// //func readResource(res http.ResponseWriter, req *http.Request) { // //} +var getHandlerId func(string) (*model.Handler, bool) = Handlers.Get + func updateResource(res http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) hID := vars["handler_id"] @@ -40,8 +39,10 @@ func updateResource(res http.ResponseWriter, req *http.Request) { return } - if _, ok := vars["key"]; !ok { - res.WriteHeader(http.StatusBadRequest) - return - } + res.WriteHeader(http.StatusOK) + // + //if _, ok := vars["key"]; !ok { + // res.WriteHeader(http.StatusBadRequest) + // return + //} } diff --git a/internal/server/data/server_test.go b/internal/server/data/server_test.go index f7e27e4..d1c6fc4 100644 --- a/internal/server/data/server_test.go +++ b/internal/server/data/server_test.go @@ -3,7 +3,6 @@ package data import ( "net/http" "net/http/httptest" - "reflect" "strings" "testing" @@ -11,79 +10,123 @@ import ( "github.com/gorilla/mux" ) -func TestConfigRouterHasRoutesWellConfigured(t *testing.T) { - testCases := []struct { - pattern, method string - handler uintptr - mustMatch bool - vars []struct{ k, v string } - }{ - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/request/params/name", http.MethodGet, reflect.ValueOf(readResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "request"}, {"resource", "params/name"}}}, - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/request/params/name", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "request"}, {"resource", "params/name"}}}, - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/cookies/name", http.MethodGet, reflect.ValueOf(readResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "response"}, {"resource", "cookies/name"}}}, - {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/headers/", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}}}, - {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/headers/name", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"key", "name"}}}, - } - r := configRouter() +//func TestConfigRouterHasRoutesWellConfigured(t *testing.T) { +// testCases := []struct { +// pattern, method string +// handler uintptr +// mustMatch bool +// vars []struct{ k, v string } +// }{ +// {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/request/params/name", http.MethodGet, reflect.ValueOf(readResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "request"}, {"resource", "params/name"}}}, +// {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/request/params/name", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "request"}, {"resource", "params/name"}}}, +// {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/cookies/name", http.MethodGet, reflect.ValueOf(readResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "response"}, {"resource", "cookies/name"}}}, +// {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/headers/", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}}}, +// {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/headers/name", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"key", "name"}}}, +// } +// r := configRouter() +// +// for _, tc := range testCases { +// rm := mux.RouteMatch{} +// rq, _ := http.NewRequest(tc.method, tc.pattern, nil) +// if matched := r.Match(rq, &rm); tc.mustMatch != matched { +// t.Errorf("Route mismatch: Expected: %+v\n\t\t\t\t\t\t got: %+v", tc, rm) +// } else { +// if tc.mustMatch { +// // Check for Handler match. +// realHandler := reflect.ValueOf(rm.Handler).Pointer() +// if realHandler != tc.handler { +// t.Errorf("Handler mismatch. Expected: %X, got: %X", tc.handler, realHandler) +// } +// +// // Check for variables +// for _, v := range tc.vars { +// if value, exists := rm.Vars[v.k]; !exists { +// t.Errorf("Variable not present: %s", v.k) +// } else if v.v != value { +// t.Errorf("Variable value mismatch. Expected: %s, got: %s", v.v, value) +// } +// } +// } +// } +// } +//} - for _, tc := range testCases { - rm := mux.RouteMatch{} - rq, _ := http.NewRequest(tc.method, tc.pattern, nil) - if matched := r.Match(rq, &rm); tc.mustMatch != matched { - t.Errorf("Route mismatch: Expected: %+v\n\t\t\t\t\t\t got: %+v", tc, rm) - } else { - if tc.mustMatch { - // Check for Handler match. - realHandler := reflect.ValueOf(rm.Handler).Pointer() - if realHandler != tc.handler { - t.Errorf("Handler mismatch. Expected: %X, got: %X", tc.handler, realHandler) - } - - // Check for variables - for _, v := range tc.vars { - if value, exists := rm.Vars[v.k]; !exists { - t.Errorf("Variable not present: %s", v.k) - } else if v.v != value { - t.Errorf("Variable value mismatch. Expected: %s, got: %s", v.v, value) - } - } - } - } - } -} - -// FIXME: Fails because URL doesn't match func TestUpdateResourceNotFoundWhenInvalidHandlerID(t *testing.T) { - request := httptest.NewRequest(http.MethodPut, "/handlers/response/headers/language", strings.NewReader("ES")) + request := httptest.NewRequest(http.MethodPut, "/handlers/HANDLER_YYYYYYYYYYYYYYYY/response/headers/name", strings.NewReader("value")) response := httptest.NewRecorder() - handler := configRouter() + handler := mux.NewRouter() + handler.HandleFunc("/handlers/{handler_id}/{resource:.*$}", updateResource). + Methods("PUT") + + getHandlerId = func(id string) (*model.Handler, bool) { + if id == "HANDLER_YYYYYYYYYYYYYYYY" { + return nil, false + } + + return nil, true + } handler.ServeHTTP(response, request) - if response.Code != http.StatusNotFound { t.Errorf("HTTP Status mismatch. Expected: %d, got: %d", http.StatusNotFound, response.Code) } } -func TestUpdateResourceBadRequestWhenIncompletedResourceURL(t *testing.T) { - request := httptest.NewRequest(http.MethodPut, "/handlers/xxxxxxxxx/response/headers/", strings.NewReader("ES")) +func TestUpdateResourceOkWhenValidHandlerID(t *testing.T) { + request := httptest.NewRequest(http.MethodPut, "/handlers/HANDLER_XXXXXXXXXXXX/response/headers/name", strings.NewReader("value")) response := httptest.NewRecorder() - handler := configRouter() + handler := mux.NewRouter() + handler.HandleFunc("/handlers/{handler_id}/{resource:.*$}", updateResource). + Methods("PUT") getHandlerId = func(id string) (*model.Handler, bool) { - if id == "xxxxxxxxx" { + if id == "HANDLER_YYYYYYYYYYYYYYYY" { + return nil, false + } else if id == "HANDLER_XXXXXXXXXXXX" { return nil, true } - return nil, false + + return nil, true } handler.ServeHTTP(response, request) - // TODO: We need to assure that an invalid resource path returns 400 (Bad Request) - if response.Code != http.StatusBadRequest { - t.Errorf("HTTP Status mismatch. Expected: %d, got: %d", http.StatusBadRequest, response.Code) + if response.Code != http.StatusOK { + t.Errorf("HTTP Status mismatch. Expected: %d, got: %d", http.StatusOK, response.Code) } } +// FIXME: Fails because URL doesn't match +//func TestUpdateResourceNotFoundWhenInvalidHandlerID(t *testing.T) { +// request := httptest.NewRequest(http.MethodPut, "/handlers/response/headers/language", strings.NewReader("ES")) +// response := httptest.NewRecorder() +// handler := configRouter() +// +// handler.ServeHTTP(response, request) +// +// if response.Code != http.StatusNotFound { +// t.Errorf("HTTP Status mismatch. Expected: %d, got: %d", http.StatusNotFound, response.Code) +// } +//} + +//func TestUpdateResourceBadRequestWhenIncompletedResourceURL(t *testing.T) { +// request := httptest.NewRequest(http.MethodPut, "/handlers/xxxxxxxxx/response/headers/", strings.NewReader("ES")) +// response := httptest.NewRecorder() +// handler := configRouter() +// +// getHandlerId = func(id string) (*model.Handler, bool) { +// if id == "xxxxxxxxx" { +// return nil, true +// } +// return nil, false +// } +// +// handler.ServeHTTP(response, request) +// // TODO: We need to assure that an invalid resource path returns 400 (Bad Request) +// if response.Code != http.StatusBadRequest { +// t.Errorf("HTTP Status mismatch. Expected: %d, got: %d", http.StatusBadRequest, response.Code) +// } +//} + //func TestUpdateResourceSetHeaderWhenPutReceived(t *testing.T) { // request := httptest.NewRequest(http.MethodPut, "/handlers/xxxxxxxxxx/response/headers/language", strings.NewReader("ES")) // response := httptest.NewRecorder()