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://app.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://app.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://app.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://app.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 }