diff --git a/README.md b/README.md index d3e8a9bc..006eea5d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

Statup - Web and App Status Monitoring for Any Type of Project
-View Wiki | Demo
Docker | EC2 | Heroku | Mac | Linux | Windows | Plugins +View Wiki | Demo
API | Docker | EC2 | Heroku | Mac | Linux | Windows | Plugins

# Statup - Status Page & Monitoring Server diff --git a/cmd/main_test.go b/cmd/main_test.go index ea101f71..f91b1b81 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -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)) } diff --git a/handlers/api_handlers_test.go b/handlers/api_handlers_test.go index 4bb5464c..c2aa3c98 100644 --- a/handlers/api_handlers_test.go +++ b/handlers/api_handlers_test.go @@ -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) { diff --git a/handlers/handlers_test.go b/handlers/handlers_test.go index b59f986b..985a99a1 100644 --- a/handlers/handlers_test.go +++ b/handlers/handlers_test.go @@ -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, "Statup | Services") 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, "admin") assert.Contains(t, body, "changedusername") 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, "admin") assert.NotContains(t, body, "changedusername") 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, "Statup | Settings") 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, "Statup | Help") 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, "Statup | Logs") 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, "Statup | Settings") 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 +}