15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
19 func TestTest_Validate(t *testing.T) {
20 assert := assert.New(t)
21 require := require.New(t)
32 CustomHeader: "here be dragons",
37 err := test.Validate()
40 message := err.Error()
41 assert.Contains(message, "WebsiteName is required")
42 assert.Contains(message, "WebsiteURL is required")
43 assert.Contains(message, "Timeout must be 0 or between 6 and 99")
44 assert.Contains(message, "Confirmation must be between 0 and 9")
45 assert.Contains(message, "CheckRate must be between 0 and 23999")
46 assert.Contains(message, "Public must be 0 or 1")
47 assert.Contains(message, "Virus must be 0 or 1")
48 assert.Contains(message, "TestType must be HTTP, TCP, or PING")
49 assert.Contains(message, "RealBrowser must be 0 or 1")
50 assert.Contains(message, "TriggerRate must be between 0 and 59")
51 assert.Contains(message, "CustomHeader must be provided as json string")
57 test.TestType = "HTTP"
61 test.WebsiteName = "Foo"
62 test.WebsiteURL = "http://example.com"
63 test.CustomHeader = `{"test": 15}`
64 test.NodeLocations = []string{"foo", "bar"}
70 func TestTest_ToURLValues(t *testing.T) {
71 assert := assert.New(t)
76 WebsiteName: "Foo Bar",
77 CustomHeader: `{"some":{"json": ["value"]}}`,
78 WebsiteURL: "http://example.com",
80 NodeLocations: []string{"foo", "bar"},
82 PingURL: "http://example.com/ping",
88 LogoImage: "http://example.com/logo.jpg",
90 WebsiteHost: "hoster",
97 TestTags: []string{"tag1", "tag2"},
99 EnableSSLAlert: false,
100 FollowRedirect: false,
103 expected := url.Values{
106 "WebsiteName": {"Foo Bar"},
107 "WebsiteURL": {"http://example.com"},
108 "CustomHeader": {`{"some":{"json": ["value"]}}`},
110 "NodeLocations": {"foo,bar"},
112 "PingURL": {"http://example.com/ping"},
113 "ContactGroup": {""},
114 "Confirmation": {"1"},
115 "CheckRate": {"500"},
116 "BasicUser": {"myuser"},
117 "BasicPass": {"mypass"},
119 "LogoImage": {"http://example.com/logo.jpg"},
121 "WebsiteHost": {"hoster"},
123 "FindString": {"hello"},
125 "TestType": {"HTTP"},
126 "RealBrowser": {"1"},
127 "TriggerRate": {"50"},
128 "TestTags": {"tag1,tag2"},
129 "StatusCodes": {"500"},
132 "FinalEndpoint": {""},
133 "EnableSSLAlert": {"0"},
134 "FollowRedirect": {"0"},
137 assert.Equal(expected, test.ToURLValues())
140 delete(expected, "TestID")
142 assert.Equal(expected.Encode(), test.ToURLValues().Encode())
145 func TestTests_All(t *testing.T) {
146 assert := assert.New(t)
147 require := require.New(t)
150 fixture: "tests_all_ok.json",
153 tests, err := tt.All()
156 assert.Equal("/Tests", c.sentRequestPath)
157 assert.Equal("GET", c.sentRequestMethod)
158 assert.Nil(c.sentRequestValues)
161 expectedTest := &Test{
165 WebsiteName: "www 1",
166 ContactGroup: []string{"1"},
169 NodeLocations: []string{"foo", "bar"},
171 assert.Equal(expectedTest, tests[0])
173 expectedTest = &Test{
177 WebsiteName: "www 2",
178 ContactGroup: []string{"2"},
181 NodeLocations: []string{"foo"},
182 TestTags: []string{"test1", "test2"},
184 assert.Equal(expectedTest, tests[1])
187 func TestTests_AllWithFilter(t *testing.T) {
188 assert := assert.New(t)
189 require := require.New(t)
192 fixture: "tests_all_ok.json",
196 v.Set("tags", "test1,test2")
198 tests, err := tt.AllWithFilter(v)
201 assert.Equal("/Tests", c.sentRequestPath)
202 assert.Equal("GET", c.sentRequestMethod)
203 assert.NotNil(c.sentRequestValues)
206 expectedTest := &Test{
210 WebsiteName: "www 2",
211 ContactGroup: []string{"2"},
214 NodeLocations: []string{"foo"},
215 TestTags: []string{"test1", "test2"},
217 assert.Equal(expectedTest, tests[0])
220 func TestTests_Update_OK(t *testing.T) {
221 assert := assert.New(t)
222 require := require.New(t)
225 fixture: "tests_update_ok.json",
233 test2, err := tt.Update(test1)
236 assert.Equal("/Tests/Update", c.sentRequestPath)
237 assert.Equal("PUT", c.sentRequestMethod)
238 assert.NotNil(c.sentRequestValues)
241 assert.Equal(1234, test2.TestID)
244 func TestTests_Update_Error(t *testing.T) {
245 assert := assert.New(t)
246 require := require.New(t)
249 fixture: "tests_update_error.json",
257 test2, err := tt.Update(test1)
261 assert.IsType(&updateError{}, err)
262 assert.Contains(err.Error(), "issue a")
265 func TestTests_Update_ErrorWithSliceOfIssues(t *testing.T) {
266 assert := assert.New(t)
267 require := require.New(t)
270 fixture: "tests_update_error_slice_of_issues.json",
278 test2, err := tt.Update(test1)
282 assert.IsType(&updateError{}, err)
283 assert.Equal("Required Data is Missing., hello, world", err.Error())
286 func TestTests_Delete_OK(t *testing.T) {
287 assert := assert.New(t)
288 require := require.New(t)
291 fixture: "tests_delete_ok.json",
295 err := tt.Delete(1234)
298 assert.Equal("/Tests/Details", c.sentRequestPath)
299 assert.Equal("DELETE", c.sentRequestMethod)
300 assert.Equal(url.Values{"TestID": {"1234"}}, c.sentRequestValues)
303 func TestTests_Delete_Error(t *testing.T) {
304 assert := assert.New(t)
305 require := require.New(t)
308 fixture: "tests_delete_error.json",
312 err := tt.Delete(1234)
314 assert.Equal("this is an error", err.Error())
317 func TestTests_Detail_OK(t *testing.T) {
318 assert := assert.New(t)
319 require := require.New(t)
322 fixture: "tests_detail_ok.json",
326 test, err := tt.Detail(1234)
329 assert.Equal("/Tests/Details", c.sentRequestPath)
330 assert.Equal("GET", c.sentRequestMethod)
331 assert.Equal(url.Values{"TestID": {"1234"}}, c.sentRequestValues)
333 assert.Equal(test.TestID, 6735)
334 assert.Equal(test.TestType, "HTTP")
335 assert.Equal(test.Paused, false)
336 assert.Equal(test.WebsiteName, "NL")
337 assert.Equal(test.CustomHeader, `{"some":{"json": ["value"]}}`)
338 assert.Equal(test.UserAgent, "product/version (comment)")
339 assert.Equal(test.ContactGroup, []string{"536"})
340 assert.Equal(test.Status, "Up")
341 assert.Equal(test.Uptime, 0.0)
342 assert.Equal(test.CheckRate, 60)
343 assert.Equal(test.Timeout, 40)
344 assert.Equal(test.LogoImage, "")
345 assert.Equal(test.WebsiteHost, "Various")
346 assert.Equal(test.FindString, "")
347 assert.Equal(test.DoNotFind, false)
348 assert.Equal(test.NodeLocations, []string{"foo", "bar"})
351 type fakeAPIClient struct {
352 sentRequestPath string
353 sentRequestMethod string
354 sentRequestValues url.Values
358 func (c *fakeAPIClient) put(path string, v url.Values) (*http.Response, error) {
359 return c.all("PUT", path, v)
362 func (c *fakeAPIClient) delete(path string, v url.Values) (*http.Response, error) {
363 return c.all("DELETE", path, v)
366 func (c *fakeAPIClient) get(path string, v url.Values) (*http.Response, error) {
367 return c.all("GET", path, v)
370 func (c *fakeAPIClient) all(method string, path string, v url.Values) (*http.Response, error) {
371 c.sentRequestMethod = method
372 c.sentRequestPath = path
373 c.sentRequestValues = v
375 p := filepath.Join("fixtures", c.fixture)
381 var resp *http.Response
382 if len(c.sentRequestValues.Get("tags")) > 0 {
383 var storedResponses []Test
384 var returnResponses []Test
385 byteValue, _ := ioutil.ReadAll(f)
386 json.Unmarshal(byteValue, &storedResponses)
387 requestedTags := strings.Split(c.sentRequestValues.Get("tags"), ",")
389 for _, storedResponse := range storedResponses {
390 if len(requestedTags) > len(storedResponse.TestTags) { // if we are requesting more tags than whats stored then there are no matches
395 for i, tag := range requestedTags {
396 if tag != storedResponse.TestTags[i] {
401 if match { // we can add it to the response now
402 returnResponses = append(returnResponses, storedResponse)
406 if len(returnResponses) == 0 {
410 newByteValue, _ := json.Marshal(&returnResponses)
411 resp = &http.Response{
412 Body: ioutil.NopCloser(bytes.NewBuffer(newByteValue)),
416 resp = &http.Response{