From 679a62a9407c09be0cfb4e22455dca5ae694ce01 Mon Sep 17 00:00:00 2001 From: Ben Burwell Date: Mon, 16 Sep 2019 15:56:31 -0400 Subject: Flesh out --- client/client.go | 43 +++++++++++++++++++++++++++++++++ client/client_test.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 client/client.go create mode 100644 client/client_test.go (limited to 'client') diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..e39a6a1 --- /dev/null +++ b/client/client.go @@ -0,0 +1,43 @@ +package client + +import ( + "bytes" + "fmt" + "io" + "net/http" + "sync" + "time" +) + +type CaesarClient struct { + Endpoint string + Token string + + c *http.Client + once sync.Once +} + +func (c *CaesarClient) EncodeMessage(r io.Reader) (io.Reader, error) { + c.once.Do(func() { + c.c = &http.Client{Timeout: 10 * time.Second} + }) + req, err := http.NewRequest("POST", c.Endpoint, r) + if err != nil { + return nil, err + } + req.Header.Set("authorization", "token "+c.Token) + req.Header.Set("user-agent", "caesar-client/1.0") + resp, err := c.c.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http status %s", resp.Status) + } + var body bytes.Buffer + defer resp.Body.Close() + if _, err := io.Copy(&body, resp.Body); err != nil { + return nil, err + } + return &body, nil +} diff --git a/client/client_test.go b/client/client_test.go new file mode 100644 index 0000000..fb1701c --- /dev/null +++ b/client/client_test.go @@ -0,0 +1,66 @@ +package client + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestBadAuth(t *testing.T) { + var hf http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("authorization") != "token TEST-TOKEN" { + w.WriteHeader(http.StatusUnauthorized) + return + } + w.Write([]byte("encoded yay")) + } + tests := []struct { + name string + tok string + expectErr bool + expectBody bool + }{ + {"valid token", "TEST-TOKEN", false, true}, + {"empty token", "", true, false}, + {"invalid token", "bad token", true, false}, + } + server := httptest.NewServer(hf) + defer server.Close() + c := CaesarClient{Endpoint: server.URL} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r, err := c.EncodeMessage(strings.NewReader("secret message")) + if err == nil { + t.Errorf("should have gotten error") + } + if r != nil { + t.Errorf("should not have gotten a reader") + } + }) + } +} + +func TestEncode(t *testing.T) { + var hf http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("response")) + } + server := httptest.NewServer(hf) + defer server.Close() + c := CaesarClient{Endpoint: server.URL} + r, err := c.EncodeMessage(strings.NewReader("secret message")) + if err != nil { + t.Errorf("should not have gotten error: %v", err) + } + if r == nil { + t.Errorf("should have gotten a reader") + } + resp, err := ioutil.ReadAll(r) + if err != nil { + t.Fatalf("could not read message: %v", err) + } + if string(resp) != "response" { + t.Errorf("expected 'response' but got '%s'", resp) + } +} -- cgit v1.2.3