From f5d7521a454e58ae90e62cf8786b0fdd47dd26bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Thu, 17 Oct 2019 15:35:29 +0200 Subject: [PATCH] Implement getRequestCookies Co-authored-by: Hector Hurtado --- internal/server/data/resource.go | 12 ++++ internal/server/data/resource_test.go | 87 ++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/internal/server/data/resource.go b/internal/server/data/resource.go index ca2dd6f..0121624 100644 --- a/internal/server/data/resource.go +++ b/internal/server/data/resource.go @@ -69,3 +69,15 @@ func getRequestHeaders(w http.ResponseWriter, r *http.Request, h *model.Handler) w.WriteHeader(http.StatusNotFound) } } + +// TODO: Add to the note section of the specification the fact that +// Cookie keys are CaseSensitive +func getRequestCookies(w http.ResponseWriter, r *http.Request, h *model.Handler) { + w.Header().Add("Content-Type", "application/octet-stream") + name := mux.Vars(r)["name"] + if cookie, err := h.Request.Cookie(name); err == nil { + _, _ = w.Write([]byte(cookie.Value)) + } else { + w.WriteHeader(http.StatusNotFound) + } +} diff --git a/internal/server/data/resource_test.go b/internal/server/data/resource_test.go index 80cc838..b810106 100644 --- a/internal/server/data/resource_test.go +++ b/internal/server/data/resource_test.go @@ -560,7 +560,7 @@ func TestGetRequestHeadersReturnsTheFirstCorrectMatchValue(t *testing.T) { Writer: httptest.NewRecorder(), } h.Request.Header.Set("bar", "BAZ") - h.Request.Header.Add("bar", "BUX") + h.Request.Header.Add("bar", "QUX") r := createMuxRequest("/handlers/HANDLERID/request/headers/{name}", "/handlers/HANDLERID/request/headers/bar", "GET") w := httptest.NewRecorder() @@ -571,3 +571,88 @@ func TestGetRequestHeadersReturnsTheFirstCorrectMatchValue(t *testing.T) { t.Errorf("Body mismatch. Expected: BAZ. Got: %v", string(body)) } } + +func TestGetRequestCookies200sOnHappyPath(t *testing.T) { + h := model.Handler{ + Request: httptest.NewRequest("GET", "/", nil), + Writer: httptest.NewRecorder(), + } + h.Request.AddCookie(&http.Cookie{Name: "bar", Value: "BAZ"}) + r := createMuxRequest("/handlers/HANDLERID/request/cookies/{name}", "/handlers/HANDLERID/request/cookies/bar", "GET") + w := httptest.NewRecorder() + + getRequestCookies(w, r, &h) + + res := w.Result() + if res.StatusCode != http.StatusOK { + t.Errorf("Status code mismatch. Expected: 200, Got: %d", res.StatusCode) + } +} + +func TestGetRequestCookiesSetsOctectStreamContentType(t *testing.T) { + h := model.Handler{ + Request: httptest.NewRequest("GET", "/", nil), + Writer: httptest.NewRecorder(), + } + h.Request.AddCookie(&http.Cookie{Name: "bar", Value: "BAZ"}) + r := createMuxRequest("/handlers/HANDLERID/request/cookies/{name}", "/handlers/HANDLERID/request/cookies/bar", "GET") + w := httptest.NewRecorder() + + getRequestCookies(w, r, &h) + + res := w.Result() + if res.Header.Get("Content-Type") != "application/octet-stream" { + t.Error("Content Type mismatch") + } +} + +func TestGetRequestCookiesReturnsMatchedCookieValue(t *testing.T) { + h := model.Handler{ + Request: httptest.NewRequest("GET", "/", nil), + Writer: httptest.NewRecorder(), + } + h.Request.AddCookie(&http.Cookie{Name: "bar", Value: "BAZ"}) + r := createMuxRequest("/handlers/HANDLERID/request/cookies/{name}", "/handlers/HANDLERID/request/cookies/bar", "GET") + w := httptest.NewRecorder() + + getRequestCookies(w, r, &h) + + res := w.Result() + if body, _ := ioutil.ReadAll(res.Body); string(body) != "BAZ" { + t.Errorf("Body mismatch. Expected: BAZ. Got: %v", string(body)) + } +} + +func TestGetRequestCookies404sIfCookieDoesntExist(t *testing.T) { + h := model.Handler{ + Request: httptest.NewRequest("GET", "/", nil), + Writer: httptest.NewRecorder(), + } + r := createMuxRequest("/handlers/HANDLERID/request/cookies/{name}", "/handlers/HANDLERID/request/cookies/bar", "GET") + w := httptest.NewRecorder() + + getRequestCookies(w, r, &h) + + res := w.Result() + if res.StatusCode != http.StatusNotFound { + t.Errorf("Status code mismatch. Expected: 404, Got: %d", res.StatusCode) + } +} + +func TestGetRequestCookiesReturnsTheFirstCorrectMatchValue(t *testing.T) { + h := model.Handler{ + Request: httptest.NewRequest("GET", "/", nil), + Writer: httptest.NewRecorder(), + } + h.Request.AddCookie(&http.Cookie{Name: "bar", Value: "BAZ"}) + h.Request.AddCookie(&http.Cookie{Name: "bar", Value: "QUX"}) + r := createMuxRequest("/handlers/HANDLERID/request/headers/{name}", "/handlers/HANDLERID/request/headers/bar", "GET") + w := httptest.NewRecorder() + + getRequestCookies(w, r, &h) + + res := w.Result() + if body, _ := ioutil.ReadAll(res.Body); string(body) != "BAZ" { + t.Errorf("Body mismatch. Expected: BAZ. Got: %v", string(body)) + } +}