diff options
author | Ben Burwell <ben@benburwell.com> | 2019-09-16 15:56:31 -0400 |
---|---|---|
committer | Ben Burwell <ben@benburwell.com> | 2019-09-16 16:29:16 -0400 |
commit | 679a62a9407c09be0cfb4e22455dca5ae694ce01 (patch) | |
tree | a99e8d61ada1677aee6f63a78545463308c5badd /client | |
parent | 528352cddbe0290653c56a27a4134637ad0624e5 (diff) |
Flesh out
Diffstat (limited to 'client')
-rw-r--r-- | client/client.go | 43 | ||||
-rw-r--r-- | client/client_test.go | 66 |
2 files changed, 109 insertions, 0 deletions
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) + } +} |