terraform/vendor/github.com/DreamItGetIT/statuscake/client_test.go

237 lines
4.9 KiB
Go

package statuscake
import (
"bytes"
"io"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestAuth_validate(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
auth := &Auth{}
err := auth.validate()
require.NotNil(err)
assert.Contains(err.Error(), "Username is required")
assert.Contains(err.Error(), "Apikey is required")
auth.Username = "foo"
err = auth.validate()
require.NotNil(err)
assert.Equal("Apikey is required", err.Error())
auth.Apikey = "bar"
err = auth.validate()
assert.Nil(err)
}
func TestClient(t *testing.T) {
require := require.New(t)
assert := assert.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
assert.Equal("random-user", c.username)
assert.Equal("my-pass", c.apiKey)
}
func TestClient_newRequest(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
r, err := c.newRequest("GET", "/hello", nil, nil)
require.Nil(err)
assert.Equal("GET", r.Method)
assert.Equal("https://www.statuscake.com/API/hello", r.URL.String())
assert.Equal("random-user", r.Header.Get("Username"))
assert.Equal("my-pass", r.Header.Get("API"))
}
func TestClient_doRequest(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
hc := &fakeHTTPClient{StatusCode: 200}
c.c = hc
req, err := http.NewRequest("GET", "http://example.com/test", nil)
require.Nil(err)
_, err = c.doRequest(req)
require.Nil(err)
assert.Len(hc.requests, 1)
assert.Equal("http://example.com/test", hc.requests[0].URL.String())
}
func TestClient_doRequest_WithHTTPErrors(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
hc := &fakeHTTPClient{
StatusCode: 500,
}
c.c = hc
req, err := http.NewRequest("GET", "http://example.com/test", nil)
require.Nil(err)
_, err = c.doRequest(req)
require.NotNil(err)
assert.IsType(&httpError{}, err)
}
func TestClient_doRequest_HttpAuthenticationErrors(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
hc := &fakeHTTPClient{
StatusCode: 200,
Fixture: "auth_error.json",
}
c.c = hc
req, err := http.NewRequest("GET", "http://example.com/test", nil)
require.Nil(err)
_, err = c.doRequest(req)
require.NotNil(err)
assert.IsType(&AuthenticationError{}, err)
}
func TestClient_get(t *testing.T) {
require := require.New(t)
assert := assert.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
hc := &fakeHTTPClient{}
c.c = hc
c.get("/hello", nil)
assert.Len(hc.requests, 1)
assert.Equal("GET", hc.requests[0].Method)
assert.Equal("https://www.statuscake.com/API/hello", hc.requests[0].URL.String())
}
func TestClient_put(t *testing.T) {
require := require.New(t)
assert := assert.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
hc := &fakeHTTPClient{}
c.c = hc
v := url.Values{"foo": {"bar"}}
c.put("/hello", v)
assert.Len(hc.requests, 1)
assert.Equal("PUT", hc.requests[0].Method)
assert.Equal("https://www.statuscake.com/API/hello", hc.requests[0].URL.String())
b, err := ioutil.ReadAll(hc.requests[0].Body)
require.Nil(err)
assert.Equal("foo=bar", string(b))
}
func TestClient_delete(t *testing.T) {
require := require.New(t)
assert := assert.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
hc := &fakeHTTPClient{}
c.c = hc
v := url.Values{"foo": {"bar"}}
c.delete("/hello", v)
assert.Len(hc.requests, 1)
assert.Equal("DELETE", hc.requests[0].Method)
assert.Equal("https://www.statuscake.com/API/hello?foo=bar", hc.requests[0].URL.String())
}
func TestClient_Tests(t *testing.T) {
require := require.New(t)
assert := assert.New(t)
c, err := New(Auth{Username: "random-user", Apikey: "my-pass"})
require.Nil(err)
expected := &tests{
client: c,
}
assert.Equal(expected, c.Tests())
}
type fakeBody struct {
io.Reader
}
func (f *fakeBody) Close() error {
return nil
}
type fakeHTTPClient struct {
StatusCode int
Fixture string
requests []*http.Request
}
func (c *fakeHTTPClient) Do(r *http.Request) (*http.Response, error) {
c.requests = append(c.requests, r)
var body []byte
if c.Fixture != "" {
p := filepath.Join("fixtures", c.Fixture)
f, err := os.Open(p)
if err != nil {
log.Fatal(err)
}
defer f.Close()
b, err := ioutil.ReadAll(f)
if err != nil {
log.Fatal(err)
}
body = b
}
resp := &http.Response{
StatusCode: c.StatusCode,
Body: &fakeBody{Reader: bytes.NewReader(body)},
}
return resp, nil
}