Skip to content

Commit 28ae864

Browse files
author
Billy
authored
178270494 client (#4)
* add common client to be used by other packages * update fakes
1 parent a412fda commit 28ae864

File tree

4 files changed

+329
-0
lines changed

4 files changed

+329
-0
lines changed

pkg/client.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package arcade
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"net/http"
8+
"net/url"
9+
)
10+
11+
const (
12+
defaultURL = `http://localhost:1982`
13+
)
14+
15+
//go:generate counterfeiter . Client
16+
type Client interface {
17+
Token(string) (string, error)
18+
}
19+
20+
// NewDefaultClient creates a new instance of client with an API Key
21+
// that calls the default URL endpoint.
22+
func NewDefaultClient(apiKey string) Client {
23+
return NewClient(defaultURL, apiKey)
24+
}
25+
26+
// NewClient creates a new instance of client with a defined API Key
27+
// and URL endpoint.
28+
func NewClient(url, apiKey string) Client {
29+
return &client{
30+
apiKey: apiKey,
31+
url: url,
32+
}
33+
}
34+
35+
type client struct {
36+
apiKey string
37+
url string
38+
}
39+
40+
// Token returns a token for a given provider.
41+
func (c *client) Token(tokenProvider string) (string, error) {
42+
req, err := http.NewRequest(http.MethodGet, c.url+"/tokens", nil)
43+
if err != nil {
44+
return "", err
45+
}
46+
47+
q := url.Values{}
48+
q.Add("provider", tokenProvider)
49+
req.URL.RawQuery = q.Encode()
50+
51+
req.Header.Add("Api-Key", c.apiKey)
52+
53+
res, err := http.DefaultClient.Do(req)
54+
if err != nil {
55+
return "", err
56+
}
57+
defer res.Body.Close()
58+
59+
if res.StatusCode < 200 || res.StatusCode > 399 {
60+
return "", fmt.Errorf("error getting token: %s", res.Status)
61+
}
62+
63+
var response struct {
64+
Token string `json:"token"`
65+
}
66+
67+
b, err := ioutil.ReadAll(res.Body)
68+
if err != nil {
69+
return "", err
70+
}
71+
72+
err = json.Unmarshal(b, &response)
73+
if err != nil {
74+
return "", err
75+
}
76+
77+
return response.Token, nil
78+
}

pkg/client_test.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package arcade_test
2+
3+
import (
4+
"net/http"
5+
6+
. "github.com/homedepot/arcade/pkg"
7+
. "github.com/onsi/ginkgo"
8+
. "github.com/onsi/gomega"
9+
"github.com/onsi/gomega/ghttp"
10+
)
11+
12+
var _ = Describe("Client", func() {
13+
var (
14+
server *ghttp.Server
15+
client Client
16+
err error
17+
token string
18+
provider string
19+
)
20+
21+
BeforeEach(func() {
22+
provider = "google"
23+
server = ghttp.NewServer()
24+
client = NewClient(server.URL(), "test-api-key")
25+
})
26+
27+
AfterEach(func() {
28+
server.Close()
29+
})
30+
31+
Describe("#NewDefaultClient", func() {
32+
BeforeEach(func() {
33+
client = NewDefaultClient("test-api-key")
34+
})
35+
36+
It("succeeds", func() {
37+
})
38+
})
39+
40+
Describe("#Token", func() {
41+
JustBeforeEach(func() {
42+
token, err = client.Token(provider)
43+
})
44+
45+
When("the uri is invalid", func() {
46+
BeforeEach(func() {
47+
client = NewClient("::haha", "test-api-key")
48+
})
49+
50+
It("returns an error", func() {
51+
Expect(err).ToNot(BeNil())
52+
})
53+
})
54+
55+
When("the server is not reachable", func() {
56+
BeforeEach(func() {
57+
server.Close()
58+
})
59+
60+
It("returns an error", func() {
61+
Expect(err).ToNot(BeNil())
62+
})
63+
})
64+
65+
When("the response is not 2XX", func() {
66+
BeforeEach(func() {
67+
server.AppendHandlers(
68+
ghttp.RespondWith(http.StatusInternalServerError, nil),
69+
)
70+
})
71+
72+
It("returns an error", func() {
73+
Expect(err).ToNot(BeNil())
74+
Expect(err.Error()).To(Equal("error getting token: 500 Internal Server Error"))
75+
})
76+
})
77+
78+
When("the server returns bad data", func() {
79+
BeforeEach(func() {
80+
server.AppendHandlers(
81+
ghttp.RespondWith(http.StatusOK, ";{["),
82+
)
83+
})
84+
85+
It("returns an error", func() {
86+
Expect(err).ToNot(BeNil())
87+
Expect(err.Error()).To(Equal("invalid character ';' looking for beginning of value"))
88+
})
89+
})
90+
91+
When("provider is rancher", func() {
92+
BeforeEach(func() {
93+
provider = "rancher"
94+
server.AppendHandlers(ghttp.CombineHandlers(
95+
ghttp.VerifyHeaderKV("api-key", "test-api-key"),
96+
ghttp.VerifyRequest(http.MethodGet, "/tokens", "provider=rancher"),
97+
ghttp.RespondWith(http.StatusOK, `{"token":"some.bearer.token"}`),
98+
))
99+
})
100+
101+
It("succeeds", func() {
102+
Expect(err).To(BeNil())
103+
Expect(token).To(Equal("some.bearer.token"))
104+
})
105+
})
106+
107+
When("it succeeds", func() {
108+
BeforeEach(func() {
109+
server.AppendHandlers(ghttp.CombineHandlers(
110+
ghttp.VerifyHeaderKV("api-key", "test-api-key"),
111+
ghttp.VerifyRequest(http.MethodGet, "/tokens", "provider=google"),
112+
ghttp.RespondWith(http.StatusOK, `{"token":"some.bearer.token"}`),
113+
))
114+
})
115+
116+
It("succeeds", func() {
117+
Expect(err).To(BeNil())
118+
Expect(token).To(Equal("some.bearer.token"))
119+
})
120+
})
121+
})
122+
})

pkg/pkg_suite_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package arcade_test
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/onsi/ginkgo"
7+
. "github.com/onsi/gomega"
8+
)
9+
10+
func TestPkg(t *testing.T) {
11+
RegisterFailHandler(Fail)
12+
RunSpecs(t, "Pkg Suite")
13+
}

pkg/pkgfakes/fake_client.go

Lines changed: 116 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)