pull/78/head v0.59
Hunter Long 2018-09-12 18:24:22 -07:00
parent 4b51cf4081
commit d24156f005
4 changed files with 137 additions and 84 deletions

View File

@ -3,7 +3,7 @@
</p>
<p align="center">
<b>Statup - Web and App Status Monitoring for Any Type of Project</b><br>
<a href="https://github.com/hunterlong/statup/wiki">View Wiki</a> | <a href="https://demo.statup.io">Demo</a> <br> <a href="https://github.com/hunterlong/statup/wiki/Docker">Docker</a> | <a href="https://github.com/hunterlong/statup/wiki/AWS-EC2">EC2</a> | <a href="https://github.com/hunterlong/statup/wiki/Heroku">Heroku</a> | <a href="https://github.com/hunterlong/statup/wiki/Mac">Mac</a> | <a href="https://github.com/hunterlong/statup/wiki/Linux">Linux</a> | <a href="https://github.com/hunterlong/statup/wiki/Windows">Windows</a> | <a href="https://github.com/hunterlong/statup/wiki/Statup-Plugins">Plugins</a>
<a href="https://github.com/hunterlong/statup/wiki">View Wiki</a> | <a href="https://demo.statup.io">Demo</a> <br> <a href="https://github.com/hunterlong/statup/wiki/API">API</a> | <a href="https://github.com/hunterlong/statup/wiki/Docker">Docker</a> | <a href="https://github.com/hunterlong/statup/wiki/AWS-EC2">EC2</a> | <a href="https://github.com/hunterlong/statup/wiki/Heroku">Heroku</a> | <a href="https://github.com/hunterlong/statup/wiki/Mac">Mac</a> | <a href="https://github.com/hunterlong/statup/wiki/Linux">Linux</a> | <a href="https://github.com/hunterlong/statup/wiki/Windows">Windows</a> | <a href="https://github.com/hunterlong/statup/wiki/Statup-Plugins">Plugins</a>
</p>
# Statup - Status Page & Monitoring Server

View File

@ -551,7 +551,7 @@ func RunLoginHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
route.ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Result().StatusCode)
assert.Equal(t, 200, rr.Result().StatusCode)
assert.True(t, handlers.IsAuthenticated(req))
}

View File

@ -18,6 +18,7 @@ package handlers
import (
"encoding/json"
"github.com/hunterlong/statup/core"
"github.com/hunterlong/statup/source"
"github.com/hunterlong/statup/types"
"github.com/hunterlong/statup/utils"
"github.com/stretchr/testify/assert"
@ -34,13 +35,39 @@ const (
NEW_TCP_SERVICE = `{"name": "Google DNS", "domain": "8.8.8.8", "expected": "", "check_interval": 5, "type": "tcp"}`
)
func injectDatabase() {
var (
dir string
)
func init() {
dir = utils.Directory
utils.InitLogs()
source.Assets()
}
func loadDatabase() {
core.NewCore()
core.Configs = new(core.DbConfig)
core.Configs.DbConn = "sqlite"
core.LoadConfig(dir)
core.Configs = &core.DbConfig{DbConfig: &types.DbConfig{
DbConn: "sqlite",
Location: dir,
}}
core.Configs.Connect(false, utils.Directory)
core.CoreApp.DbConnection = "sqlite"
core.CoreApp.Version = "DEV"
core.Configs.Connect(false, utils.Directory)
core.Configs.Save()
}
func createDatabase() {
core.Configs.DropDatabase()
core.Configs.CreateDatabase()
core.InitApp()
}
func resetDatabase() {
core.Configs.DropDatabase()
core.Configs.CreateDatabase()
core.Configs.SeedDatabase()
core.InitApp()
}
@ -53,6 +80,10 @@ func Clean() {
func TestInit(t *testing.T) {
Clean()
loadDatabase()
resetDatabase()
loadDatabase()
core.InitApp()
}
func formatJSON(res string, out interface{}) {
@ -60,7 +91,7 @@ func formatJSON(res string, out interface{}) {
}
func TestApiIndexHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "GET", "/api", nil)
assert.Nil(t, err)
body := rr.Body.String()
@ -68,12 +99,12 @@ func TestApiIndexHandler(t *testing.T) {
var obj types.Core
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Equal(t, "Tester", obj.Name)
assert.Equal(t, "Awesome Status", obj.Name)
assert.Equal(t, "sqlite", obj.DbConnection)
}
func TestApiAllServicesHandlerHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "GET", "/api/services", nil)
assert.Nil(t, err)
body := rr.Body.String()
@ -86,7 +117,7 @@ func TestApiAllServicesHandlerHandler(t *testing.T) {
}
func TestApiServiceHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "GET", "/api/services/1", nil)
assert.Nil(t, err)
body := rr.Body.String()
@ -99,7 +130,7 @@ func TestApiServiceHandler(t *testing.T) {
}
func TestApiCreateServiceHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "POST", "/api/services", strings.NewReader(NEW_HTTP_SERVICE))
assert.Nil(t, err)
body := rr.Body.String()
@ -113,20 +144,30 @@ func TestApiCreateServiceHandler(t *testing.T) {
}
func TestApiUpdateServiceHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "POST", "/api/services/1", strings.NewReader(UPDATED_HTTP_SERVICE))
data := `{
"name": "Updated Service",
"domain": "https://google.com",
"expected": "",
"expected_status": 200,
"check_interval": 60,
"type": "http",
"method": "GET",
"post_data": "",
"port": 0,
"timeout": 10,
"order_id": 0}`
rr, err := httpRequestAPI(t, "POST", "/api/services/1", strings.NewReader(data))
assert.Nil(t, err)
body := rr.Body.String()
t.Log(body)
var obj types.Service
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Equal(t, "Google Website", obj.Name)
assert.Equal(t, "Updated Service", obj.Name)
assert.Equal(t, "https://google.com", obj.Domain)
}
func TestApiDeleteServiceHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "DELETE", "/api/services/1", nil)
assert.Nil(t, err)
body := rr.Body.String()
@ -134,12 +175,12 @@ func TestApiDeleteServiceHandler(t *testing.T) {
var obj ApiResponse
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Equal(t, "Google Website", obj.Method)
assert.Equal(t, "https://google.com", obj.Status)
assert.Equal(t, "delete", obj.Method)
assert.Equal(t, "success", obj.Status)
}
func TestApiAllUsersHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "GET", "/api/users", nil)
assert.Nil(t, err)
body := rr.Body.String()
@ -147,46 +188,62 @@ func TestApiAllUsersHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
var obj []types.User
formatJSON(body, &obj)
assert.Equal(t, "Google", obj[0].Admin)
assert.Equal(t, "https://google.com", obj[0].Username)
assert.Equal(t, true, obj[0].Admin)
assert.Equal(t, "admin", obj[0].Username)
}
func TestApiCreateUserHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "POST", "/api/users", nil)
data := `{
"username": "admin2",
"email": "info@email.com",
"password": "password123",
"admin": true}`
rr, err := httpRequestAPI(t, "POST", "/api/users", strings.NewReader(data))
assert.Nil(t, err)
body := rr.Body.String()
t.Log(body)
var obj ApiResponse
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "statup_total_services 6")
assert.Contains(t, "create", obj.Method)
assert.Contains(t, "success", obj.Status)
}
func TestApiViewUserHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "GET", "/api/users/1", nil)
rr, err := httpRequestAPI(t, "GET", "/api/users/2", nil)
assert.Nil(t, err)
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "statup_total_services 6")
var obj types.User
formatJSON(body, &obj)
assert.Equal(t, "admin2", obj.Username)
assert.Equal(t, true, obj.Admin)
}
func TestApiUpdateUserHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "POST", "/api/users/1", nil)
data := `{
"username": "adminupdated",
"email": "info@email.com",
"password": "password123",
"admin": true}`
rr, err := httpRequestAPI(t, "POST", "/api/users/1", strings.NewReader(data))
assert.Nil(t, err)
body := rr.Body.String()
t.Log(body)
var obj types.User
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "statup_total_services 6")
assert.Equal(t, "adminupdated", obj.Username)
assert.Equal(t, true, obj.Admin)
}
func TestApiDeleteUserHandler(t *testing.T) {
t.SkipNow()
rr, err := httpRequestAPI(t, "DELETE", "/api/users/1", nil)
assert.Nil(t, err)
body := rr.Body.String()
var obj ApiResponse
formatJSON(body, &obj)
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "statup_total_services 6")
assert.Equal(t, "delete", obj.Method)
assert.Equal(t, "success", obj.Status)
}
func httpRequestAPI(t *testing.T, method, url string, body io.Reader) (*httptest.ResponseRecorder, error) {

View File

@ -29,28 +29,10 @@ import (
"testing"
)
var (
dir string
)
func init() {
utils.InitLogs()
source.Assets()
dir = utils.Directory
}
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
func TestResetHandlerDatabase(t *testing.T) {
Clean()
loadDatabase()
createDatabase()
}
func TestFailedHTTPServer(t *testing.T) {
@ -63,7 +45,7 @@ func TestIndexHandler(t *testing.T) {
assert.Nil(t, err)
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.Equal(t, 200, rr.Code)
}
func TestSetupHandler(t *testing.T) {
@ -197,7 +179,7 @@ func TestServicesHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Services</title>")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestCreateUserHandler(t *testing.T) {
@ -212,7 +194,7 @@ func TestCreateUserHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestEditUserHandler(t *testing.T) {
@ -235,7 +217,7 @@ func TestEditUserHandler(t *testing.T) {
assert.Contains(t, body, "<td>admin</td>")
assert.Contains(t, body, "<td>changedusername</td>")
assert.Equal(t, 200, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestDeleteUserHandler(t *testing.T) {
@ -244,7 +226,7 @@ func TestDeleteUserHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestUsersHandler(t *testing.T) {
@ -258,7 +240,7 @@ func TestUsersHandler(t *testing.T) {
assert.Contains(t, body, "<td>admin</td>")
assert.NotContains(t, body, "<td>changedusername</td>")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestUsersEditHandler(t *testing.T) {
@ -273,7 +255,7 @@ func TestUsersEditHandler(t *testing.T) {
assert.Contains(t, body, "value=\"info@statup.io\"")
assert.Contains(t, body, "value=\"##########\"")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestSettingsHandler(t *testing.T) {
@ -285,7 +267,7 @@ func TestSettingsHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Settings</title>")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestHelpHandler(t *testing.T) {
@ -297,7 +279,7 @@ func TestHelpHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Help</title>")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestCreateHTTPServiceHandler(t *testing.T) {
@ -318,7 +300,7 @@ func TestCreateHTTPServiceHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestCreateTCPerviceHandler(t *testing.T) {
@ -339,7 +321,7 @@ func TestCreateTCPerviceHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestServicesHandler2(t *testing.T) {
@ -353,7 +335,7 @@ func TestServicesHandler2(t *testing.T) {
assert.Contains(t, body, "Crystal Castles - Kept")
assert.Contains(t, body, "Local Postgres")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestViewHTTPServicesHandler(t *testing.T) {
@ -384,7 +366,7 @@ func TestServicesDeleteFailuresHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestFailingServicesDeleteFailuresHandler(t *testing.T) {
@ -393,7 +375,7 @@ func TestFailingServicesDeleteFailuresHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestServicesUpdateHandler(t *testing.T) {
@ -429,7 +411,7 @@ func TestDeleteServiceHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestLogsHandler(t *testing.T) {
@ -441,7 +423,7 @@ func TestLogsHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "<title>Statup | Logs</title>")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestLogsLineHandler(t *testing.T) {
@ -453,7 +435,7 @@ func TestLogsLineHandler(t *testing.T) {
assert.Equal(t, 200, rr.Code)
t.Log(body)
assert.NotEmpty(t, body)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestSaveSettingsHandler(t *testing.T) {
@ -466,7 +448,7 @@ func TestSaveSettingsHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestViewSettingsHandler(t *testing.T) {
@ -479,7 +461,7 @@ func TestViewSettingsHandler(t *testing.T) {
assert.Contains(t, body, "<title>Statup | Settings</title>")
assert.Contains(t, body, "Awesome Status")
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestSaveAssetsHandler(t *testing.T) {
@ -491,7 +473,7 @@ func TestSaveAssetsHandler(t *testing.T) {
assert.FileExists(t, utils.Directory+"/assets/css/base.css")
assert.DirExists(t, utils.Directory+"/assets")
assert.True(t, source.UsingAssets(dir))
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestDeleteAssetsHandler(t *testing.T) {
@ -501,7 +483,7 @@ func TestDeleteAssetsHandler(t *testing.T) {
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.False(t, source.UsingAssets(dir))
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestPrometheusHandler(t *testing.T) {
@ -513,7 +495,7 @@ func TestPrometheusHandler(t *testing.T) {
body := rr.Body.String()
assert.Equal(t, 200, rr.Code)
assert.Contains(t, body, "statup_total_services 11")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestSaveNotificationHandler(t *testing.T) {
@ -535,7 +517,7 @@ func TestSaveNotificationHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 200, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestViewNotificationSettingsHandler(t *testing.T) {
@ -555,7 +537,7 @@ func TestViewNotificationSettingsHandler(t *testing.T) {
assert.Contains(t, body, `value="7" id="limits_per_hour_email"`)
assert.Contains(t, body, `id="switch-email" checked`)
assert.Contains(t, body, "Statup made with ❤️")
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestSaveFooterHandler(t *testing.T) {
@ -567,7 +549,7 @@ func TestSaveFooterHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
req, err = http.NewRequest("GET", "/", nil)
assert.Nil(t, err)
@ -600,7 +582,7 @@ func TestBuildAssetsHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
assert.FileExists(t, "../assets/scss/base.scss")
}
@ -617,7 +599,7 @@ func TestSaveSassHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
newBase := source.OpenAsset(utils.Directory, "css/base.css")
assert.Contains(t, newBase, ".test_design {")
@ -631,7 +613,7 @@ func TestReorderServiceHandler(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 200, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
func TestCreateBulkServices(t *testing.T) {
@ -666,6 +648,20 @@ func TestCreateBulkServices(t *testing.T) {
rr := httptest.NewRecorder()
Router().ServeHTTP(rr, req)
assert.Equal(t, 303, rr.Code)
assert.True(t, IsRouteAuthenticated(req))
assert.True(t, isRouteAuthenticated(req))
}
}
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
}