statping/handlers/handlers_test.go

494 lines
16 KiB
Go
Raw Normal View History

2018-08-16 06:22:20 +00:00
// Statup
// Copyright (C) 2018. Hunter Long and the project contributors
// Written by Hunter Long <info@socialeck.com> and the project contributors
//
2018-12-04 04:17:29 +00:00
// https://github.com/hunterlong/statping
2018-08-16 06:22:20 +00:00
//
// The licenses for most software and other practical works are designed
// to take away your freedom to share and change the works. By contrast,
// the GNU General Public License is intended to guarantee your freedom to
// share and change all versions of a program--to make sure it remains free
// software for all its users.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package handlers
import (
2018-12-04 04:17:29 +00:00
"github.com/hunterlong/statping/core"
_ "github.com/hunterlong/statping/notifiers"
"github.com/hunterlong/statping/source"
"github.com/hunterlong/statping/utils"
"github.com/stretchr/testify/assert"
"net/http"
"net/http/httptest"
2018-07-27 06:13:29 +00:00
"net/url"
2018-08-12 19:23:04 +00:00
"os"
2018-07-27 06:13:29 +00:00
"strings"
"testing"
)
2018-09-13 01:24:22 +00:00
func TestResetHandlerDatabase(t *testing.T) {
Clean()
loadDatabase()
createDatabase()
2018-08-12 19:23:04 +00:00
}
2018-08-16 02:22:10 +00:00
func TestFailedHTTPServer(t *testing.T) {
err := RunHTTPServer("missinghost", 0)
assert.Error(t, err)
}
2018-07-27 06:13:29 +00:00
func TestSetupHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/setup", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Setup</title>")
}
func TestProcessSetupHandler(t *testing.T) {
form := url.Values{}
form.Add("db_host", "")
form.Add("db_user", "")
form.Add("db_password", "")
form.Add("db_database", "")
form.Add("db_connection", "sqlite")
form.Add("db_port", "")
form.Add("project", "Tester")
form.Add("username", "admin")
form.Add("password", "password123")
form.Add("sample_data", "on")
form.Add("description", "This is an awesome test")
form.Add("domain", "http://localhost:8080")
form.Add("email", "info@statup.io")
req, err := http.NewRequest("POST", "/setup", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.FileExists(t, dir+"/config.yml")
assert.FileExists(t, dir+"/statup.db")
2018-07-27 06:13:29 +00:00
}
2018-07-28 01:50:13 +00:00
func TestCheckSetupHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/setup", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
}
2018-07-27 06:13:29 +00:00
func TestCheckIndexHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 200, rr.Code)
}
func TestServicesViewHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/service/1", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
2018-10-02 06:21:14 +00:00
assert.Contains(t, body, "<title>Google Status</title>")
2018-10-22 22:29:57 +00:00
assert.Contains(t, body, "</footer>")
2018-07-27 06:13:29 +00:00
}
2018-08-10 04:38:54 +00:00
func TestMissingServiceViewHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/service/99999999", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 404, rr.Code)
}
2018-07-28 01:50:13 +00:00
func TestServiceChartHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/charts.js", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "var ctx_1")
assert.Contains(t, body, "var ctx_2")
assert.Contains(t, body, "var ctx_3")
assert.Contains(t, body, "var ctx_4")
assert.Contains(t, body, "var ctx_5")
2018-07-28 01:50:13 +00:00
}
2018-07-27 06:13:29 +00:00
func TestDashboardHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/dashboard", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Dashboard</title>")
2018-10-22 22:29:57 +00:00
assert.Contains(t, body, "</footer>")
2018-07-27 06:13:29 +00:00
}
2018-07-27 06:13:29 +00:00
func TestLoginHandler(t *testing.T) {
form := url.Values{}
form.Add("username", "admin")
form.Add("password", "password123")
req, err := http.NewRequest("POST", "/dashboard", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
}
2018-07-27 06:13:29 +00:00
2018-07-28 01:50:13 +00:00
func TestBadLoginHandler(t *testing.T) {
form := url.Values{}
form.Add("username", "admin")
form.Add("password", "wrongpassword")
req, err := http.NewRequest("POST", "/dashboard", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Contains(t, body, "Incorrect login information submitted, try again.")
assert.Equal(t, 200, rr.Code)
}
2018-07-27 06:13:29 +00:00
func TestServicesHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/services", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Services</title>")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestUsersHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/users", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Users</title>")
assert.Contains(t, body, "<td>admin</td>")
2018-07-28 01:50:13 +00:00
assert.NotContains(t, body, "<td>changedusername</td>")
2018-10-22 22:29:57 +00:00
assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-28 01:50:13 +00:00
}
func TestUsersEditHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/user/1", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
2018-10-02 06:21:14 +00:00
assert.Contains(t, body, "<title>Statup | admin</title>")
2018-10-07 06:39:57 +00:00
assert.Contains(t, body, "<h3>User admin</h3>")
2018-07-28 01:50:13 +00:00
assert.Contains(t, body, "value=\"info@statup.io\"")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestSettingsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Settings</title>")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestHelpHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/help", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Help</title>")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestServicesHandler2(t *testing.T) {
req, err := http.NewRequest("GET", "/services", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Services</title>")
2018-11-13 19:28:21 +00:00
assert.Contains(t, body, "JSON Users Test")
assert.Contains(t, body, "JSON API Tester")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestViewHTTPServicesHandler(t *testing.T) {
2018-11-13 19:28:21 +00:00
req, err := http.NewRequest("GET", "/service/5", nil)
2018-07-27 06:13:29 +00:00
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
2018-11-13 19:28:21 +00:00
assert.Contains(t, body, "<title>Google DNS Status</title>")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-07-27 06:13:29 +00:00
}
func TestViewTCPServicesHandler(t *testing.T) {
2018-11-13 19:28:21 +00:00
req, err := http.NewRequest("GET", "/service/5", nil)
2018-07-27 06:13:29 +00:00
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
2018-11-13 19:28:21 +00:00
assert.Contains(t, body, "<title>Google DNS Status</title>")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-07-27 06:13:29 +00:00
}
2018-07-28 03:24:54 +00:00
func TestServicesDeleteFailuresHandler(t *testing.T) {
2018-11-13 19:28:21 +00:00
req, err := http.NewRequest("GET", "/service/5/delete_failures", nil)
2018-07-28 03:24:54 +00:00
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-28 03:24:54 +00:00
}
2018-08-19 02:40:08 +00:00
func TestFailingServicesDeleteFailuresHandler(t *testing.T) {
2018-11-13 19:28:21 +00:00
req, err := http.NewRequest("GET", "/service/5/delete_failures", nil)
2018-07-28 01:50:13 +00:00
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-28 01:50:13 +00:00
}
2018-07-27 06:13:29 +00:00
func TestLogsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/logs", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Logs</title>")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestLogsLineHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/logs/line", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.NotEmpty(t, body)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestSaveSettingsHandler(t *testing.T) {
form := url.Values{}
form.Add("project", "Awesome Status")
form.Add("description", "These tests can probably be better")
req, err := http.NewRequest("POST", "/settings", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
func TestViewSettingsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Settings</title>")
assert.Contains(t, body, "Awesome Status")
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:13:29 +00:00
}
2018-07-27 06:32:04 +00:00
2018-07-28 03:24:54 +00:00
func TestSaveAssetsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings/build", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-07-28 03:24:54 +00:00
assert.FileExists(t, utils.Directory+"/assets/css/base.css")
assert.DirExists(t, utils.Directory+"/assets")
2018-08-16 20:55:30 +00:00
assert.True(t, source.UsingAssets(dir))
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-28 03:24:54 +00:00
}
func TestDeleteAssetsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings/delete_assets", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-08-16 20:55:30 +00:00
assert.False(t, source.UsingAssets(dir))
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-28 03:24:54 +00:00
}
2018-07-27 06:32:04 +00:00
func TestPrometheusHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/metrics", nil)
req.Header.Set("Authorization", core.CoreApp.ApiSecret)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
2018-11-13 19:28:21 +00:00
assert.Contains(t, body, "statup_total_services 5")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-27 06:32:04 +00:00
}
2018-11-15 01:32:32 +00:00
func TestUpdateNotificationHandler(t *testing.T) {
t.SkipNow()
data := `{"limits": 7, "enabled": true, "method": "email", "host": "smtp.emailserver.com", "username": "exampleuser", "password": "password123", "port": 543, "var1": "info@betatude.com", "var2": "sendto@gmail.com"}`
rr, err := httpRequestAPI(t, "POST", "/api/notifier/email", strings.NewReader(data))
assert.Nil(t, err)
body := rr.Body.String()
var obj apiResponse
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Equal(t, "success", obj.Status)
}
2018-07-28 03:24:54 +00:00
func TestViewNotificationSettingsHandler(t *testing.T) {
2018-11-14 03:55:12 +00:00
t.SkipNow()
2018-07-28 03:24:54 +00:00
req, err := http.NewRequest("GET", "/settings", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Settings</title>")
assert.Contains(t, body, `value="exampleuser" id="smtp_username"`)
assert.Contains(t, body, `value="587" id="smtp_port"`)
assert.Contains(t, body, `value="info@betatude.com" id="outgoing_email_address"`)
assert.Contains(t, body, `value="sendto@gmail.com" id="send_alerts_to"`)
2018-09-15 06:09:07 +00:00
assert.Contains(t, body, `id="limits_per_hour_email" value="7"`)
2018-07-28 03:24:54 +00:00
assert.Contains(t, body, `id="switch-email" checked`)
2018-10-22 22:29:57 +00:00
//assert.Contains(t, body, "</footer>")
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-07-28 03:24:54 +00:00
}
func TestSaveFooterHandler(t *testing.T) {
form := url.Values{}
form.Add("footer", "Created by Hunter Long")
req, err := http.NewRequest("POST", "/settings", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
req, err = http.NewRequest("GET", "/", nil)
assert.Nil(t, err)
rr = httptest.NewRecorder()
Router().ServeHTTP(rr, req)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "Created by Hunter Long")
}
2018-07-28 03:24:54 +00:00
func TestError404Handler(t *testing.T) {
req, err := http.NewRequest("GET", "/404me", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 404, rr.Code)
}
2018-07-27 06:32:04 +00:00
func TestLogoutHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/logout", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-07-28 01:50:13 +00:00
}
2018-08-16 02:22:10 +00:00
func TestBuildAssetsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings/build", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-08-16 02:22:10 +00:00
assert.FileExists(t, "../assets/scss/base.scss")
}
func TestSaveSassHandler(t *testing.T) {
base := source.OpenAsset(utils.Directory, "scss/base.scss")
vars := source.OpenAsset(utils.Directory, "scss/variables.scss")
form := url.Values{}
form.Add("theme", base+"\n .test_design { color: $test-design; }")
form.Add("variables", vars+"\n $test-design: #ffffff; ")
req, err := http.NewRequest("POST", "/settings/css", strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
2018-08-16 02:22:10 +00:00
newBase := source.OpenAsset(utils.Directory, "css/base.css")
assert.Contains(t, newBase, ".test_design {")
}
func TestReorderServiceHandler(t *testing.T) {
data := `[{id: 1, order: 3},{id: 2, order: 2},{id: 3, order: 1}]"`
2018-11-29 19:07:29 +00:00
req, err := http.NewRequest("POST", "/api/services/reorder", strings.NewReader(data))
req.Header.Set("Content-Type", "application/json")
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 200, rr.Code)
2018-09-13 01:24:22 +00:00
assert.True(t, isRouteAuthenticated(req))
}
2018-10-07 06:39:57 +00:00
func TestExportHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings/export", nil)
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 200, rr.Code)
assert.True(t, isRouteAuthenticated(req))
}
2018-09-13 01:24:22 +00:00
func isRouteAuthenticated(req *http.Request) bool {
os.Setenv("GO_ENV", "production")
rr := httptest.NewRecorder()
req.Header.Set("Authorization", "badkey")
Router().ServeHTTP(rr, req)
code := rr.Code
if code == 200 {
os.Setenv("GO_ENV", "test")
return false
}
os.Setenv("GO_ENV", "test")
return true
}