From 958175c59a70264e4f23eb0c72cb83b8edd8577d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Hurtado?= Date: Thu, 10 Oct 2019 11:49:15 +0200 Subject: [PATCH] Test TestConfigRouterHasRoutesWellConfigured resolved --- internal/server/data/server.go | 29 +++++++++++ internal/server/data/server_test.go | 77 +++++++++++++++-------------- 2 files changed, 70 insertions(+), 36 deletions(-) diff --git a/internal/server/data/server.go b/internal/server/data/server.go index 7c1ad0e..17e0a60 100644 --- a/internal/server/data/server.go +++ b/internal/server/data/server.go @@ -1,5 +1,34 @@ package data +import ( + "log" + "net/http" + + "github.com/gorilla/mux" +) + // 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}/{root}/{resource:.*$}", readResource).Methods("GET") + r.HandleFunc("/handlers/{handler_id}/{root}/{resource:.*$}", 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) { + +} + +func updateResource(res http.ResponseWriter, req *http.Request) { + +} diff --git a/internal/server/data/server_test.go b/internal/server/data/server_test.go index 531d869..6097983 100644 --- a/internal/server/data/server_test.go +++ b/internal/server/data/server_test.go @@ -1,44 +1,49 @@ package data import ( + "net/http" + "reflect" "testing" + + "github.com/gorilla/mux" ) func TestConfigRouterHasRoutesWellConfigured(t *testing.T) { - t.Skip("****** WIP ******") - // testCases := []struct { - // pattern, method string - // handler uintptr - // mustMatch bool - // vars []string - // }{ - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/request/params/name", http.MethodGet, reflect.ValueOf().Pointer(), true, []struct{ key, value string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"resource", "params/name"}}}, - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/request/params/name", http.MethodPut, reflect.ValueOf().Pointer(), true, []struct{ key, value string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"resource", "params/name"}}}, - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/cookies/name", http.MethodGet, reflect.ValueOf().Pointer(), true, []struct{ key, value string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"resource", "cookies/name"}}}, - // {"/handlers/HANDLER_ZZZZZZZZZZZZZZZZ/response/cookies/name", http.MethodPut, reflect.ValueOf().Pointer(), true, []struct{ key, value string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"resource", "cookies/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 { - // 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 _, vn := range tc.vars { - // if _, exists := rm.Vars[vn]; !exists { - // t.Errorf("Variable not present: %s", vn) - // } - // } - // } - // } else { - // t.Errorf("Route mismatch: %+v", tc) - // } - // } + 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/cookies/name", http.MethodPut, reflect.ValueOf(updateResource).Pointer(), true, []struct{ k, v string }{{"handler_id", "HANDLER_ZZZZZZZZZZZZZZZZ"}, {"root", "response"}, {"resource", "cookies/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 { + 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) + } + } + } + } else { + t.Errorf("Route mismatch: %+v", tc) + } + } }