mirror of https://github.com/statping/statping
parent
4c09c11cad
commit
df6916400a
|
@ -18,7 +18,7 @@ services:
|
|||
|
||||
env:
|
||||
global:
|
||||
- VERSION=0.28.6
|
||||
- VERSION=0.28.7
|
||||
- DB_HOST=localhost
|
||||
- DB_USER=travis
|
||||
- DB_PASS=
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
FROM alpine:latest
|
||||
|
||||
ENV VERSION=v0.28.6
|
||||
ENV VERSION=v0.28.7
|
||||
|
||||
RUN apk --no-cache add libstdc++ ca-certificates
|
||||
RUN wget -q https://github.com/hunterlong/statup/releases/download/$VERSION/statup-linux-alpine.tar.gz && \
|
||||
|
|
|
@ -162,7 +162,7 @@ func CreateDatabase() {
|
|||
sql := "postgres_up.sql"
|
||||
if dbServer == "mysql" {
|
||||
sql = "mysql_up.sql"
|
||||
} else if dbServer == "sqlite3" {
|
||||
} else if dbServer == "sqlite" {
|
||||
sql = "sqlite_up.sql"
|
||||
}
|
||||
up, _ := SqlBox.String(sql)
|
||||
|
|
|
@ -128,7 +128,15 @@ func (s *Service) GraphData() string {
|
|||
var d []DateScan
|
||||
increment := "minute"
|
||||
since := time.Now().Add(time.Hour*-12 + time.Minute*0 + time.Second*0)
|
||||
|
||||
// this function needs some work, asap
|
||||
sql := fmt.Sprintf("SELECT date_trunc('%v', created_at), AVG(latency)*1000 AS value FROM hits WHERE service=%v AND created_at > '%v' GROUP BY 1 ORDER BY date_trunc ASC;", increment, s.Id, since.Format(time.RFC3339))
|
||||
if dbServer == "mysql" {
|
||||
sql = fmt.Sprintf("SELECT created_at, AVG(latency)*1000 AS VALUE FROM hits WHERE service=%v GROUP BY 1 ORDER BY created_at ASC;", s.Id)
|
||||
} else if dbServer == "sqlite" {
|
||||
sql = fmt.Sprintf("SELECT created_at, AVG(latency)*1000 AS VALUE FROM hits WHERE service=%v GROUP BY 1 ORDER BY created_at ASC;", s.Id)
|
||||
}
|
||||
|
||||
dated, err := DbSession.Query(db.Raw(sql))
|
||||
if err != nil {
|
||||
utils.Log(2, err)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/hunterlong/statup/types"
|
||||
"github.com/hunterlong/statup/utils"
|
||||
"os"
|
||||
|
@ -77,17 +78,32 @@ func LoadSampleData() error {
|
|||
Method: "POST",
|
||||
PostData: `{ "title": "statup", "body": "bar", "userId": 19999 }`,
|
||||
}
|
||||
s1.Create()
|
||||
s2.Create()
|
||||
s3.Create()
|
||||
s4.Create()
|
||||
id, err := s1.Create()
|
||||
if err != nil {
|
||||
utils.Log(3, fmt.Sprintf("Error creating Service %v: %v", id, err))
|
||||
}
|
||||
id, err = s2.Create()
|
||||
if err != nil {
|
||||
utils.Log(3, fmt.Sprintf("Error creating Service %v: %v", id, err))
|
||||
}
|
||||
id, err = s3.Create()
|
||||
if err != nil {
|
||||
utils.Log(3, fmt.Sprintf("Error creating Service %v: %v", id, err))
|
||||
}
|
||||
id, err = s4.Create()
|
||||
if err != nil {
|
||||
utils.Log(3, fmt.Sprintf("Error creating Service %v: %v", id, err))
|
||||
}
|
||||
|
||||
checkin := &Checkin{
|
||||
Service: s2.Id,
|
||||
Interval: 30,
|
||||
Api: utils.NewSHA1Hash(18),
|
||||
}
|
||||
checkin.Create()
|
||||
id, err = checkin.Create()
|
||||
if err != nil {
|
||||
utils.Log(3, fmt.Sprintf("Error creating Checkin %v: %v", id, err))
|
||||
}
|
||||
|
||||
//for i := 0; i < 3; i++ {
|
||||
// s1.Check()
|
||||
|
|
|
@ -7,4 +7,4 @@ import (
|
|||
func Error404Handler(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
ExecuteResponse(w, r, "error_404.html", nil)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package handlers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/hunterlong/statup/core"
|
||||
"github.com/hunterlong/statup/notifications"
|
||||
"github.com/hunterlong/statup/types"
|
||||
|
@ -25,7 +24,6 @@ func PluginsHandler(w http.ResponseWriter, r *http.Request) {
|
|||
//}
|
||||
|
||||
//CoreApp.PluginFields = pluginFields
|
||||
fmt.Println(core.CoreApp.Communications)
|
||||
|
||||
ExecuteResponse(w, r, "settings.html", core.CoreApp)
|
||||
}
|
||||
|
|
698
main_test.go
698
main_test.go
|
@ -20,333 +20,120 @@ var (
|
|||
testSession *sessions.Session
|
||||
)
|
||||
|
||||
func init() {
|
||||
route = handlers.Router()
|
||||
}
|
||||
|
||||
func TestInit(t *testing.T) {
|
||||
func RunInit(t *testing.T) {
|
||||
RenderBoxes()
|
||||
os.Remove("./statup.db")
|
||||
handlers.Router()
|
||||
os.Remove("./config.yml")
|
||||
route = handlers.Router()
|
||||
LoadDotEnvs()
|
||||
|
||||
}
|
||||
|
||||
func TestMySQLMakeConfig(t *testing.T) {
|
||||
config := &core.DbConfig{
|
||||
"mysql",
|
||||
os.Getenv("DB_HOST"),
|
||||
os.Getenv("DB_USER"),
|
||||
os.Getenv("DB_PASS"),
|
||||
os.Getenv("DB_DATABASE"),
|
||||
3306,
|
||||
"Testing MYSQL",
|
||||
"This is a test of Statup.io!",
|
||||
"",
|
||||
"admin",
|
||||
"admin",
|
||||
"",
|
||||
nil,
|
||||
var forceSequential chan bool = make(chan bool, 1)
|
||||
|
||||
type databaseTest struct {
|
||||
in string
|
||||
out string
|
||||
}
|
||||
|
||||
var dbTests []databaseTest
|
||||
|
||||
func TestRunAll(t *testing.T) {
|
||||
|
||||
databases := []string{"mysql", "sqlite", "postgres"}
|
||||
|
||||
for _, dbt := range databases {
|
||||
|
||||
forceSequential <- true
|
||||
|
||||
t.Run(dbt+" init", func(t *testing.T) {
|
||||
RunInit(t)
|
||||
})
|
||||
t.Run(dbt+" load database config", func(t *testing.T) {
|
||||
RunMySQLMakeConfig(t, dbt)
|
||||
})
|
||||
t.Run(dbt+" Sample Data", func(t *testing.T) {
|
||||
RunInsertMysqlSample(t)
|
||||
})
|
||||
t.Run(dbt+" Select Core", func(t *testing.T) {
|
||||
RunSelectCoreMYQL(t, dbt)
|
||||
})
|
||||
t.Run(dbt+" Select Services", func(t *testing.T) {
|
||||
RunSelectAllMysqlServices(t)
|
||||
})
|
||||
t.Run(dbt+" Select Comms", func(t *testing.T) {
|
||||
RunSelectAllMysqlCommunications(t)
|
||||
})
|
||||
t.Run(dbt+" Create User", func(t *testing.T) {
|
||||
RunUser_Create(t)
|
||||
})
|
||||
t.Run(dbt+" Select Services", func(t *testing.T) {
|
||||
RunSelectAllServices(t)
|
||||
})
|
||||
t.Run(dbt+" Select One Service", func(t *testing.T) {
|
||||
RunOneService_Check(t)
|
||||
})
|
||||
t.Run(dbt+" Create Service", func(t *testing.T) {
|
||||
RunService_Create(t)
|
||||
})
|
||||
t.Run(dbt+" Create Hits", func(t *testing.T) {
|
||||
RunCreateService_Hits(t)
|
||||
})
|
||||
t.Run(dbt+" Avg Time", func(t *testing.T) {
|
||||
RunService_AvgTime(t)
|
||||
})
|
||||
t.Run(dbt+" Online 24h", func(t *testing.T) {
|
||||
RunService_Online24(t)
|
||||
})
|
||||
t.Run(dbt+" Chart Data", func(t *testing.T) {
|
||||
RunService_GraphData(t)
|
||||
})
|
||||
t.Run(dbt+" Create Service", func(t *testing.T) {
|
||||
RunBadService_Create(t)
|
||||
})
|
||||
t.Run(dbt+" Check Service", func(t *testing.T) {
|
||||
RunBadService_Check(t)
|
||||
})
|
||||
t.Run(dbt+" Select Hits", func(t *testing.T) {
|
||||
RunService_Hits(t)
|
||||
})
|
||||
t.Run(dbt+" Select Limited Hits", func(t *testing.T) {
|
||||
RunService_LimitedHits(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /", func(t *testing.T) {
|
||||
RunIndexHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /service/1", func(t *testing.T) {
|
||||
RunServiceHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /metrics", func(t *testing.T) {
|
||||
RunPrometheusHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /metrics", func(t *testing.T) {
|
||||
RunFailingPrometheusHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /login", func(t *testing.T) {
|
||||
RunLoginHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /dashboard", func(t *testing.T) {
|
||||
RunDashboardHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /users", func(t *testing.T) {
|
||||
RunUsersHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /services", func(t *testing.T) {
|
||||
RunServicesHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /help", func(t *testing.T) {
|
||||
RunHelpHandler(t)
|
||||
})
|
||||
t.Run(dbt+" HTTP /settings", func(t *testing.T) {
|
||||
RunSettingsHandler(t)
|
||||
})
|
||||
|
||||
<-forceSequential
|
||||
|
||||
}
|
||||
err := config.Save()
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = core.LoadConfig()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "mysql", core.Configs.Connection)
|
||||
|
||||
err = core.DbConnection(core.Configs.Connection)
|
||||
assert.Nil(t, err)
|
||||
core.InsertDefaultComms()
|
||||
}
|
||||
|
||||
func TestInsertMysqlSample(t *testing.T) {
|
||||
err := core.LoadSampleData()
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestSelectCoreMYQL(t *testing.T) {
|
||||
var err error
|
||||
core.CoreApp, err = core.SelectCore()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "Testing MYSQL", core.CoreApp.Name)
|
||||
assert.Equal(t, VERSION, core.CoreApp.Version)
|
||||
}
|
||||
|
||||
func TestSqliteMakeConfig(t *testing.T) {
|
||||
config := &core.DbConfig{
|
||||
"sqlite",
|
||||
os.Getenv("DB_HOST"),
|
||||
os.Getenv("DB_USER"),
|
||||
os.Getenv("DB_PASS"),
|
||||
os.Getenv("DB_DATABASE"),
|
||||
5432,
|
||||
"Testing SQLITE",
|
||||
"This is a test of Statup.io!",
|
||||
"",
|
||||
"admin",
|
||||
"admin",
|
||||
"",
|
||||
nil,
|
||||
}
|
||||
err := config.Save()
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = core.LoadConfig()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "sqlite", core.Configs.Connection)
|
||||
|
||||
err = core.DbConnection(core.Configs.Connection)
|
||||
assert.Nil(t, err)
|
||||
core.InsertDefaultComms()
|
||||
}
|
||||
|
||||
func TestInsertSqliteSample(t *testing.T) {
|
||||
err := core.LoadSampleData()
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestPostgresMakeConfig(t *testing.T) {
|
||||
config := &core.DbConfig{
|
||||
"postgres",
|
||||
os.Getenv("DB_HOST"),
|
||||
os.Getenv("DB_USER"),
|
||||
os.Getenv("DB_PASS"),
|
||||
os.Getenv("DB_DATABASE"),
|
||||
5432,
|
||||
"Testing POSTGRES",
|
||||
"This is a test of Statup.io!",
|
||||
"",
|
||||
"admin",
|
||||
"admin",
|
||||
"",
|
||||
nil,
|
||||
}
|
||||
err := config.Save()
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = core.LoadConfig()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "postgres", core.Configs.Connection)
|
||||
|
||||
err = core.DbConnection(core.Configs.Connection)
|
||||
assert.Nil(t, err)
|
||||
core.InsertDefaultComms()
|
||||
}
|
||||
|
||||
func TestInsertPostgresSample(t *testing.T) {
|
||||
err := core.LoadSampleData()
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestSelectCorePostgres(t *testing.T) {
|
||||
var err error
|
||||
core.CoreApp, err = core.SelectCore()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "Testing POSTGRES", core.CoreApp.Name)
|
||||
assert.Equal(t, VERSION, core.CoreApp.Version)
|
||||
}
|
||||
|
||||
func TestSelectCore(t *testing.T) {
|
||||
var err error
|
||||
core.CoreApp, err = core.SelectCore()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "Testing POSTGRES", core.CoreApp.Name)
|
||||
assert.Equal(t, VERSION, core.CoreApp.Version)
|
||||
}
|
||||
|
||||
func TestUser_Create(t *testing.T) {
|
||||
user := &core.User{
|
||||
Username: "admin",
|
||||
Password: "admin",
|
||||
Email: "info@testuser.com",
|
||||
}
|
||||
id, err := user.Create()
|
||||
assert.Nil(t, err)
|
||||
assert.NotZero(t, id)
|
||||
}
|
||||
|
||||
func TestSelectAllServices(t *testing.T) {
|
||||
var err error
|
||||
services, err := core.SelectAllServices()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 4, len(services))
|
||||
}
|
||||
|
||||
func TestOneService_Check(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
t.Log(service)
|
||||
assert.Equal(t, "Google", service.Name)
|
||||
}
|
||||
|
||||
func TestService_Create(t *testing.T) {
|
||||
service := &core.Service{
|
||||
Name: "test service",
|
||||
Domain: "https://google.com",
|
||||
ExpectedStatus: 200,
|
||||
Interval: 1,
|
||||
Port: 0,
|
||||
Type: "https",
|
||||
Method: "GET",
|
||||
}
|
||||
id, err := service.Create()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, int64(5), id)
|
||||
}
|
||||
|
||||
func TestService_Check(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
assert.Equal(t, "Google", service.Name)
|
||||
out := service.Check()
|
||||
assert.Equal(t, true, out.Online)
|
||||
}
|
||||
|
||||
func TestService_AvgTime(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
avg := service.AvgUptime()
|
||||
assert.Equal(t, "100", avg)
|
||||
}
|
||||
|
||||
func TestService_Online24(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
online := service.Online24()
|
||||
assert.Equal(t, float32(100), online)
|
||||
}
|
||||
|
||||
func TestService_GraphData(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
data := service.GraphData()
|
||||
assert.NotEmpty(t, data)
|
||||
}
|
||||
|
||||
func TestBadService_Create(t *testing.T) {
|
||||
service := &core.Service{
|
||||
Name: "Bad Service",
|
||||
Domain: "https://9839f83h72gey2g29278hd2od2d.com",
|
||||
ExpectedStatus: 200,
|
||||
Interval: 10,
|
||||
Port: 0,
|
||||
Type: "http",
|
||||
Method: "GET",
|
||||
}
|
||||
id, err := service.Create()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, int64(6), id)
|
||||
}
|
||||
|
||||
func TestBadService_Check(t *testing.T) {
|
||||
service := core.SelectService(4)
|
||||
assert.NotNil(t, service)
|
||||
assert.Equal(t, "JSON API Tester", service.Name)
|
||||
}
|
||||
|
||||
func TestService_Hits(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
hits, err := service.Hits()
|
||||
assert.Nil(t, err)
|
||||
assert.NotZero(t, len(hits))
|
||||
}
|
||||
|
||||
func TestService_LimitedHits(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
hits, err := service.LimitedHits()
|
||||
assert.Nil(t, err)
|
||||
assert.NotZero(t, len(hits))
|
||||
}
|
||||
|
||||
func TestIndexHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "This is a test of Statup.io!"))
|
||||
}
|
||||
|
||||
func TestServiceHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/service/1", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Services</title>"))
|
||||
}
|
||||
|
||||
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()
|
||||
route.ServeHTTP(rr, req)
|
||||
t.Log(rr.Body.String())
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "statup_total_services 6"))
|
||||
}
|
||||
|
||||
func TestFailingPrometheusHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/metrics", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.Equal(t, 401, rr.Result().StatusCode)
|
||||
}
|
||||
|
||||
func TestLoginHandler(t *testing.T) {
|
||||
form := url.Values{}
|
||||
form.Add("username", "admin")
|
||||
form.Add("password", "admin")
|
||||
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()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.Equal(t, 303, rr.Result().StatusCode)
|
||||
}
|
||||
|
||||
func TestDashboardHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/dashboard", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Dashboard</title>"))
|
||||
}
|
||||
|
||||
func TestUsersHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/users", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Users</title>"))
|
||||
}
|
||||
|
||||
func TestServicesHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/services", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Services</title>"))
|
||||
}
|
||||
|
||||
func TestHelpHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/help", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Help</title>"))
|
||||
}
|
||||
|
||||
func TestSettingsHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/settings", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Settings</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "Theme Editor"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "Email Settings"))
|
||||
}
|
||||
|
||||
func TestVersionCommand(t *testing.T) {
|
||||
|
@ -377,3 +164,274 @@ func TestAssetsCommand(t *testing.T) {
|
|||
t.Log(c.Stdout())
|
||||
assert.True(t, c.StdoutContains("Statup v"))
|
||||
}
|
||||
|
||||
func RunMySQLMakeConfig(t *testing.T, db string) {
|
||||
|
||||
port := 5432
|
||||
if db == "mysql" {
|
||||
port = 3306
|
||||
}
|
||||
|
||||
config := &core.DbConfig{
|
||||
db,
|
||||
os.Getenv("DB_HOST"),
|
||||
os.Getenv("DB_USER"),
|
||||
os.Getenv("DB_PASS"),
|
||||
os.Getenv("DB_DATABASE"),
|
||||
port,
|
||||
"Testing " + db,
|
||||
"This is a test of Statup.io!",
|
||||
"",
|
||||
"admin",
|
||||
"admin",
|
||||
"",
|
||||
nil,
|
||||
}
|
||||
err := config.Save()
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err = core.LoadConfig()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, db, core.Configs.Connection)
|
||||
|
||||
err = core.DbConnection(core.Configs.Connection)
|
||||
assert.Nil(t, err)
|
||||
core.InsertDefaultComms()
|
||||
}
|
||||
|
||||
func RunInsertMysqlSample(t *testing.T) {
|
||||
err := core.LoadSampleData()
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func RunSelectCoreMYQL(t *testing.T, db string) {
|
||||
var err error
|
||||
core.CoreApp, err = core.SelectCore()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "Testing "+db, core.CoreApp.Name)
|
||||
assert.Equal(t, VERSION, core.CoreApp.Version)
|
||||
}
|
||||
|
||||
func RunSelectAllMysqlServices(t *testing.T) {
|
||||
var err error
|
||||
services, err := core.SelectAllServices()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 4, len(services))
|
||||
}
|
||||
|
||||
func RunSelectAllMysqlCommunications(t *testing.T) {
|
||||
var err error
|
||||
comms, err := core.SelectAllCommunications()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 2, len(comms))
|
||||
}
|
||||
|
||||
func RunUser_Create(t *testing.T) {
|
||||
user := &core.User{
|
||||
Username: "admin",
|
||||
Password: "admin",
|
||||
Email: "info@testuser.com",
|
||||
}
|
||||
id, err := user.Create()
|
||||
assert.Nil(t, err)
|
||||
assert.NotZero(t, id)
|
||||
}
|
||||
|
||||
func RunSelectAllServices(t *testing.T) {
|
||||
var err error
|
||||
services, err := core.SelectAllServices()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 4, len(services))
|
||||
}
|
||||
|
||||
func RunOneService_Check(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
t.Log(service)
|
||||
assert.Equal(t, "Google", service.Name)
|
||||
}
|
||||
|
||||
func RunService_Create(t *testing.T) {
|
||||
service := &core.Service{
|
||||
Name: "test service",
|
||||
Domain: "https://google.com",
|
||||
ExpectedStatus: 200,
|
||||
Interval: 1,
|
||||
Port: 0,
|
||||
Type: "http",
|
||||
Method: "GET",
|
||||
}
|
||||
id, err := service.Create()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, int64(5), id)
|
||||
}
|
||||
|
||||
func RunService_AvgTime(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
avg := service.AvgUptime()
|
||||
assert.Equal(t, "100", avg)
|
||||
}
|
||||
|
||||
func RunService_Online24(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
online := service.Online24()
|
||||
assert.Equal(t, float32(100), online)
|
||||
}
|
||||
|
||||
func RunService_GraphData(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
data := service.GraphData()
|
||||
assert.NotEmpty(t, data)
|
||||
}
|
||||
|
||||
func RunBadService_Create(t *testing.T) {
|
||||
service := &core.Service{
|
||||
Name: "Bad Service",
|
||||
Domain: "https://9839f83h72gey2g29278hd2od2d.com",
|
||||
ExpectedStatus: 200,
|
||||
Interval: 10,
|
||||
Port: 0,
|
||||
Type: "http",
|
||||
Method: "GET",
|
||||
}
|
||||
id, err := service.Create()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, int64(6), id)
|
||||
}
|
||||
|
||||
func RunBadService_Check(t *testing.T) {
|
||||
service := core.SelectService(4)
|
||||
assert.NotNil(t, service)
|
||||
assert.Equal(t, "JSON API Tester", service.Name)
|
||||
}
|
||||
|
||||
func RunCreateService_Hits(t *testing.T) {
|
||||
services, err := core.SelectAllServices()
|
||||
assert.Nil(t, err)
|
||||
assert.NotNil(t, services)
|
||||
for i := 0; i <= 2; i++ {
|
||||
for _, s := range services {
|
||||
service := s.Check()
|
||||
assert.NotNil(t, service)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func RunService_Hits(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
hits, err := service.Hits()
|
||||
assert.Nil(t, err)
|
||||
assert.NotZero(t, len(hits))
|
||||
}
|
||||
|
||||
func RunService_LimitedHits(t *testing.T) {
|
||||
service := core.SelectService(1)
|
||||
assert.NotNil(t, service)
|
||||
hits, err := service.LimitedHits()
|
||||
assert.Nil(t, err)
|
||||
assert.NotZero(t, len(hits))
|
||||
}
|
||||
|
||||
func RunIndexHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "This is a test of Statup.io!"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
func RunServiceHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/service/1", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Google Service</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
func RunPrometheusHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/metrics", nil)
|
||||
req.Header.Set("Authorization", core.CoreApp.ApiSecret)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
t.Log(rr.Body.String())
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "statup_total_services 6"))
|
||||
}
|
||||
|
||||
func RunFailingPrometheusHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/metrics", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.Equal(t, 401, rr.Result().StatusCode)
|
||||
}
|
||||
|
||||
func RunLoginHandler(t *testing.T) {
|
||||
form := url.Values{}
|
||||
form.Add("username", "admin")
|
||||
form.Add("password", "admin")
|
||||
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()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.Equal(t, 303, rr.Result().StatusCode)
|
||||
}
|
||||
|
||||
func RunDashboardHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/dashboard", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Dashboard</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
func RunUsersHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/users", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Users</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
func RunServicesHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/services", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Services</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
func RunHelpHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/help", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Help</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
func RunSettingsHandler(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", "/settings", nil)
|
||||
assert.Nil(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
route.ServeHTTP(rr, req)
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "<title>Statup | Settings</title>"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "Theme Editor"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "Email Settings"))
|
||||
assert.True(t, strings.Contains(rr.Body.String(), "footer"))
|
||||
}
|
||||
|
||||
//func RunComplete(t *testing.T) {
|
||||
// //os.Remove("./statup.db")
|
||||
// os.Remove("./config.yml")
|
||||
//}
|
||||
|
|
|
@ -16,6 +16,12 @@ $('select#database_type').on('change', function(){
|
|||
$("#db_user").show();
|
||||
$("#db_database").show();
|
||||
}
|
||||
if (selected=="mysql") {
|
||||
$("#db_port_in").val('3306');
|
||||
} else if (selected=="postgres") {
|
||||
$("#db_port_in").val('5432');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$("#setup_form").submit(function() {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
DROP table core;
|
||||
DROP table hits;
|
||||
DROP table failures;
|
||||
DROP table users;
|
||||
DROP table checkins;
|
||||
DROP table services;
|
||||
DROP table communication;
|
||||
DROP TABLE IF EXISTS core;
|
||||
DROP TABLE IF EXISTS hits;
|
||||
DROP TABLE IF EXISTS failures;
|
||||
DROP TABLE IF EXISTS users;
|
||||
DROP TABLE IF EXISTS checkins;
|
||||
DROP TABLE IF EXISTS services;
|
||||
DROP TABLE IF EXISTS communication;
|
|
@ -11,7 +11,7 @@ CREATE TABLE core (
|
|||
);
|
||||
|
||||
CREATE TABLE users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
username text,
|
||||
password text,
|
||||
email text,
|
||||
|
@ -22,7 +22,7 @@ CREATE TABLE users (
|
|||
);
|
||||
|
||||
CREATE TABLE services (
|
||||
id SERIAL PRIMARY KEY,
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
name text,
|
||||
domain text,
|
||||
check_type text,
|
||||
|
@ -37,14 +37,14 @@ CREATE TABLE services (
|
|||
);
|
||||
|
||||
CREATE TABLE hits (
|
||||
id SERIAL PRIMARY KEY,
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
latency float,
|
||||
created_at TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE failures (
|
||||
id SERIAL PRIMARY KEY,
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
issue text,
|
||||
method text,
|
||||
service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
|
@ -52,7 +52,7 @@ CREATE TABLE failures (
|
|||
);
|
||||
|
||||
CREATE TABLE checkins (
|
||||
id SERIAL PRIMARY KEY,
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
check_interval integer,
|
||||
api text,
|
||||
|
@ -60,7 +60,7 @@ CREATE TABLE checkins (
|
|||
);
|
||||
|
||||
CREATE TABLE communication (
|
||||
id SERIAL PRIMARY KEY,
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
method text,
|
||||
host text,
|
||||
port integer,
|
||||
|
|
|
@ -50,6 +50,8 @@
|
|||
|
||||
</div>
|
||||
|
||||
{{template "footer"}}
|
||||
|
||||
<script src="/js/jquery-3.3.1.slim.min.js"></script>
|
||||
<script src="/js/bootstrap.min.js"></script>
|
||||
</body>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<link rel="stylesheet" href="/css/base.css">
|
||||
<script src="/js/Chart.bundle.min.js"></script>
|
||||
|
||||
<title>Statup | Services</title>
|
||||
<title>Statup | {{.Name}} Service</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
|
|
@ -35,24 +35,24 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="form-group" id="db_host">
|
||||
<label for="formGroupExampleInput">Host</label>
|
||||
<input type="text" name="db_host" class="form-control" value="{{.DbHost}}" placeholder="localhost">
|
||||
<label for="db_host_in">Host</label>
|
||||
<input type="text" name="db_host" id="db_host_in" class="form-control" value="{{.DbHost}}" placeholder="localhost">
|
||||
</div>
|
||||
<div class="form-group" id="db_port">
|
||||
<label for="formGroupExampleInput">Database Port</label>
|
||||
<input type="text" name="db_port" class="form-control" value="{{.DbPort}}" placeholder="localhost">
|
||||
<label for="db_port_in">Database Port</label>
|
||||
<input type="text" name="db_port" id="db_port_in" class="form-control" value="{{.DbPort}}" placeholder="localhost">
|
||||
</div>
|
||||
<div class="form-group" id="db_user">
|
||||
<label for="formGroupExampleInput2">Username</label>
|
||||
<input type="text" name="db_user" class="form-control" value="{{.DbUser}}" placeholder="root">
|
||||
<label for="db_user_in">Username</label>
|
||||
<input type="text" name="db_user" id="db_user_in" class="form-control" value="{{.DbUser}}" placeholder="root">
|
||||
</div>
|
||||
<div class="form-group" id="db_password">
|
||||
<label for="formGroupExampleInput2">Password</label>
|
||||
<input type="password" name="db_password" class="form-control" value="{{.DbPass}}" id="formGroupExampleInput2" placeholder="password123">
|
||||
<label for="db_password">Password</label>
|
||||
<input type="password" name="db_password" class="form-control" value="{{.DbPass}}" id="db_password" placeholder="password123">
|
||||
</div>
|
||||
<div class="form-group" id="db_database">
|
||||
<label for="formGroupExampleInput2">Database</label>
|
||||
<input type="text" name="db_database" class="form-control" value="{{.DbData}}" id="formGroupExampleInput2" placeholder="Database name">
|
||||
<label for="db_database">Database</label>
|
||||
<input type="text" name="db_database" class="form-control" value="{{.DbData}}" id="db_database" placeholder="Database name">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -60,13 +60,13 @@
|
|||
<div class="col-6">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="formGroupExampleInput">Project Name</label>
|
||||
<input type="text" name="project" class="form-control" value="{{.Project}}" id="formGroupExampleInput" placeholder="Great Uptime" required>
|
||||
<label for="project">Project Name</label>
|
||||
<input type="text" name="project" class="form-control" value="{{.Project}}" id="project" placeholder="Great Uptime" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="formGroupExampleInput">Project Description</label>
|
||||
<input type="text" name="description" class="form-control" value="{{.Description}}" id="formGroupExampleInput" placeholder="Great Uptime">
|
||||
<label for="description">Project Description</label>
|
||||
<input type="text" name="description" class="form-control" value="{{.Description}}" id="description" placeholder="Great Uptime">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
|
@ -75,25 +75,25 @@
|
|||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="formGroupExampleInput">Admin Username</label>
|
||||
<input type="text" name="username" class="form-control" value="{{.Username}}" id="formGroupExampleInput" value="admin" placeholder="admin" required>
|
||||
<label for="username">Admin Username</label>
|
||||
<input type="text" name="username" class="form-control" value="{{.Username}}" id="username" value="admin" placeholder="admin" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="formGroupExampleInput">Admin Email Address</label>
|
||||
<input type="email" name="email" class="form-control" value="{{.Email}}" id="formGroupExampleInput" placeholder="info@admin.com" required>
|
||||
<label for="email">Admin Email Address</label>
|
||||
<input type="email" name="email" class="form-control" value="{{.Email}}" id="email" placeholder="info@admin.com" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="formGroupExampleInput">Admin Password</label>
|
||||
<input type="password" name="password" class="form-control" value="{{.Password}}" id="formGroupExampleInput" placeholder="password" required>
|
||||
<label for="password">Admin Password</label>
|
||||
<input type="password" name="password" class="form-control" value="{{.Password}}" id="password" placeholder="password" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-check-label" for="gridCheck1">
|
||||
Load Sample Data
|
||||
</label>
|
||||
<input name="sample_data" class="form-control" type="checkbox" id="gridCheck1" checked>
|
||||
<span class="switch">
|
||||
<input type="checkbox" name="sample_data" class="switch" id="switch-normal" checked>
|
||||
<label for="switch-normal">Load Sample Data</label>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue