summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorBen Burwell <ben@benburwell.com>2019-09-16 15:56:31 -0400
committerBen Burwell <ben@benburwell.com>2019-09-16 16:29:16 -0400
commit679a62a9407c09be0cfb4e22455dca5ae694ce01 (patch)
treea99e8d61ada1677aee6f63a78545463308c5badd /client
parent528352cddbe0290653c56a27a4134637ad0624e5 (diff)
Flesh out
Diffstat (limited to 'client')
-rw-r--r--client/client.go43
-rw-r--r--client/client_test.go66
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)
+ }
+}