From 99fa6320219ad37c8c64ed76dd8b5f414acadcea Mon Sep 17 00:00:00 2001 From: TwinProduction Date: Thu, 25 Feb 2021 19:02:02 -0500 Subject: [PATCH] Increase test coverage --- controller/controller_test.go | 115 +++++++++++++++------------------- 1 file changed, 50 insertions(+), 65 deletions(-) diff --git a/controller/controller_test.go b/controller/controller_test.go index 57ebdcc2..f0a526f8 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -277,72 +277,57 @@ func TestServiceStatusesHandler(t *testing.T) { secondResult.Timestamp = time.Time{} router := CreateRouter(&config.Config{}) - request, _ := http.NewRequest("GET", "/api/v1/statuses", nil) - responseRecorder := httptest.NewRecorder() - router.ServeHTTP(responseRecorder, request) - if responseRecorder.Code != http.StatusOK { - t.Errorf("%s %s should have returned %d, but returned %d instead", request.Method, request.URL, http.StatusOK, responseRecorder.Code) + type Scenario struct { + Name string + Path string + ExpectedCode int + ExpectedBody string + } + scenarios := []Scenario{ + { + Name: "no-pagination", + Path: "/api/v1/statuses", + ExpectedCode: http.StatusOK, + ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + }, + { + Name: "pagination-first-result", + Path: "/api/v1/statuses?page=1&pageSize=1", + ExpectedCode: http.StatusOK, + ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + }, + { + Name: "pagination-second-result", + Path: "/api/v1/statuses?page=2&pageSize=1", + ExpectedCode: http.StatusOK, + ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + }, + { + Name: "pagination-no-results", + Path: "/api/v1/statuses?page=5&pageSize=20", + ExpectedCode: http.StatusOK, + ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[]}}`, + }, + { + Name: "invalid-pagination-should-fall-back-to-default", + Path: "/api/v1/statuses?page=INVALID&pageSize=INVALID", + ExpectedCode: http.StatusOK, + ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + }, } - output := responseRecorder.Body.String() - expectedOutput := `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}` - if output != expectedOutput { - t.Errorf("expected:\n %s\n\ngot:\n %s", expectedOutput, output) - } -} - -func TestServiceStatusesHandlerWithPagination(t *testing.T) { - defer storage.Get().Clear() - defer cache.Clear() - staticFolder = "../web/static" - firstResult := &testSuccessfulResult - secondResult := &testUnsuccessfulResult - storage.Get().Insert(&testService, firstResult) - storage.Get().Insert(&testService, secondResult) - // Can't be bothered dealing with timezone issues on the worker that runs the automated tests - firstResult.Timestamp = time.Time{} - secondResult.Timestamp = time.Time{} - router := CreateRouter(&config.Config{}) - - request, _ := http.NewRequest("GET", "/api/v1/statuses?page=2&pageSize=1", nil) - responseRecorder := httptest.NewRecorder() - router.ServeHTTP(responseRecorder, request) - if responseRecorder.Code != http.StatusOK { - t.Errorf("%s %s should have returned %d, but returned %d instead", request.Method, request.URL, http.StatusOK, responseRecorder.Code) - } - - output := responseRecorder.Body.String() - expectedOutput := `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"}]}}` - if output != expectedOutput { - t.Errorf("expected:\n %s\n\ngot:\n %s", expectedOutput, output) - } -} - -// TestServiceStatusesHandlerWithBadPagination checks that the behavior when bad pagination parameters are passed -// is to use the default pagination parameters -func TestServiceStatusesHandlerWithBadPagination(t *testing.T) { - defer storage.Get().Clear() - defer cache.Clear() - staticFolder = "../web/static" - firstResult := &testSuccessfulResult - secondResult := &testUnsuccessfulResult - storage.Get().Insert(&testService, firstResult) - storage.Get().Insert(&testService, secondResult) - // Can't be bothered dealing with timezone issues on the worker that runs the automated tests - firstResult.Timestamp = time.Time{} - secondResult.Timestamp = time.Time{} - router := CreateRouter(&config.Config{}) - - request, _ := http.NewRequest("GET", "/api/v1/statuses?page=INVALID&pageSize=INVALID", nil) - responseRecorder := httptest.NewRecorder() - router.ServeHTTP(responseRecorder, request) - if responseRecorder.Code != http.StatusOK { - t.Errorf("%s %s should have returned %d, but returned %d instead", request.Method, request.URL, http.StatusOK, responseRecorder.Code) - } - - output := responseRecorder.Body.String() - expectedOutput := `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}` - if output != expectedOutput { - t.Errorf("expected:\n %s\n\ngot:\n %s", expectedOutput, output) + for _, scenario := range scenarios { + t.Run(scenario.Name, func(t *testing.T) { + request, _ := http.NewRequest("GET", scenario.Path, nil) + responseRecorder := httptest.NewRecorder() + router.ServeHTTP(responseRecorder, request) + if responseRecorder.Code != scenario.ExpectedCode { + t.Errorf("%s %s should have returned %d, but returned %d instead", request.Method, request.URL, scenario.ExpectedCode, responseRecorder.Code) + } + output := responseRecorder.Body.String() + if output != scenario.ExpectedBody { + t.Errorf("expected:\n %s\n\ngot:\n %s", scenario.ExpectedBody, output) + } + }) } }