fixed sqlite - test all for each database

pull/10/head v0.28.7
Hunter Long 2018-07-02 20:39:26 -07:00
parent 4c09c11cad
commit df6916400a
14 changed files with 457 additions and 369 deletions

View File

@ -18,7 +18,7 @@ services:
env: env:
global: global:
- VERSION=0.28.6 - VERSION=0.28.7
- DB_HOST=localhost - DB_HOST=localhost
- DB_USER=travis - DB_USER=travis
- DB_PASS= - DB_PASS=

View File

@ -1,6 +1,6 @@
FROM alpine:latest FROM alpine:latest
ENV VERSION=v0.28.6 ENV VERSION=v0.28.7
RUN apk --no-cache add libstdc++ ca-certificates RUN apk --no-cache add libstdc++ ca-certificates
RUN wget -q https://github.com/hunterlong/statup/releases/download/$VERSION/statup-linux-alpine.tar.gz && \ RUN wget -q https://github.com/hunterlong/statup/releases/download/$VERSION/statup-linux-alpine.tar.gz && \

View File

@ -162,7 +162,7 @@ func CreateDatabase() {
sql := "postgres_up.sql" sql := "postgres_up.sql"
if dbServer == "mysql" { if dbServer == "mysql" {
sql = "mysql_up.sql" sql = "mysql_up.sql"
} else if dbServer == "sqlite3" { } else if dbServer == "sqlite" {
sql = "sqlite_up.sql" sql = "sqlite_up.sql"
} }
up, _ := SqlBox.String(sql) up, _ := SqlBox.String(sql)

View File

@ -128,7 +128,15 @@ func (s *Service) GraphData() string {
var d []DateScan var d []DateScan
increment := "minute" increment := "minute"
since := time.Now().Add(time.Hour*-12 + time.Minute*0 + time.Second*0) 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)) 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)) dated, err := DbSession.Query(db.Raw(sql))
if err != nil { if err != nil {
utils.Log(2, err) utils.Log(2, err)

View File

@ -1,6 +1,7 @@
package core package core
import ( import (
"fmt"
"github.com/hunterlong/statup/types" "github.com/hunterlong/statup/types"
"github.com/hunterlong/statup/utils" "github.com/hunterlong/statup/utils"
"os" "os"
@ -77,17 +78,32 @@ func LoadSampleData() error {
Method: "POST", Method: "POST",
PostData: `{ "title": "statup", "body": "bar", "userId": 19999 }`, PostData: `{ "title": "statup", "body": "bar", "userId": 19999 }`,
} }
s1.Create() id, err := s1.Create()
s2.Create() if err != nil {
s3.Create() utils.Log(3, fmt.Sprintf("Error creating Service %v: %v", id, err))
s4.Create() }
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{ checkin := &Checkin{
Service: s2.Id, Service: s2.Id,
Interval: 30, Interval: 30,
Api: utils.NewSHA1Hash(18), 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++ { //for i := 0; i < 3; i++ {
// s1.Check() // s1.Check()

View File

@ -7,4 +7,4 @@ import (
func Error404Handler(w http.ResponseWriter, r *http.Request) { func Error404Handler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
ExecuteResponse(w, r, "error_404.html", nil) ExecuteResponse(w, r, "error_404.html", nil)
} }

View File

@ -1,7 +1,6 @@
package handlers package handlers
import ( import (
"fmt"
"github.com/hunterlong/statup/core" "github.com/hunterlong/statup/core"
"github.com/hunterlong/statup/notifications" "github.com/hunterlong/statup/notifications"
"github.com/hunterlong/statup/types" "github.com/hunterlong/statup/types"
@ -25,7 +24,6 @@ func PluginsHandler(w http.ResponseWriter, r *http.Request) {
//} //}
//CoreApp.PluginFields = pluginFields //CoreApp.PluginFields = pluginFields
fmt.Println(core.CoreApp.Communications)
ExecuteResponse(w, r, "settings.html", core.CoreApp) ExecuteResponse(w, r, "settings.html", core.CoreApp)
} }

View File

@ -20,333 +20,120 @@ var (
testSession *sessions.Session testSession *sessions.Session
) )
func init() { func RunInit(t *testing.T) {
route = handlers.Router()
}
func TestInit(t *testing.T) {
RenderBoxes() RenderBoxes()
os.Remove("./statup.db") os.Remove("./statup.db")
handlers.Router() os.Remove("./config.yml")
route = handlers.Router()
LoadDotEnvs() LoadDotEnvs()
} }
func TestMySQLMakeConfig(t *testing.T) { var forceSequential chan bool = make(chan bool, 1)
config := &core.DbConfig{
"mysql", type databaseTest struct {
os.Getenv("DB_HOST"), in string
os.Getenv("DB_USER"), out string
os.Getenv("DB_PASS"), }
os.Getenv("DB_DATABASE"),
3306, var dbTests []databaseTest
"Testing MYSQL",
"This is a test of Statup.io!", func TestRunAll(t *testing.T) {
"",
"admin", databases := []string{"mysql", "sqlite", "postgres"}
"admin",
"", for _, dbt := range databases {
nil,
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) { func TestVersionCommand(t *testing.T) {
@ -377,3 +164,274 @@ func TestAssetsCommand(t *testing.T) {
t.Log(c.Stdout()) t.Log(c.Stdout())
assert.True(t, c.StdoutContains("Statup v")) 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")
//}

View File

@ -16,6 +16,12 @@ $('select#database_type').on('change', function(){
$("#db_user").show(); $("#db_user").show();
$("#db_database").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() { $("#setup_form").submit(function() {

View File

@ -1,7 +1,7 @@
DROP table core; DROP TABLE IF EXISTS core;
DROP table hits; DROP TABLE IF EXISTS hits;
DROP table failures; DROP TABLE IF EXISTS failures;
DROP table users; DROP TABLE IF EXISTS users;
DROP table checkins; DROP TABLE IF EXISTS checkins;
DROP table services; DROP TABLE IF EXISTS services;
DROP table communication; DROP TABLE IF EXISTS communication;

View File

@ -11,7 +11,7 @@ CREATE TABLE core (
); );
CREATE TABLE users ( CREATE TABLE users (
id SERIAL PRIMARY KEY, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
username text, username text,
password text, password text,
email text, email text,
@ -22,7 +22,7 @@ CREATE TABLE users (
); );
CREATE TABLE services ( CREATE TABLE services (
id SERIAL PRIMARY KEY, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name text, name text,
domain text, domain text,
check_type text, check_type text,
@ -37,14 +37,14 @@ CREATE TABLE services (
); );
CREATE TABLE hits ( 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, service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE,
latency float, latency float,
created_at TIMESTAMP created_at TIMESTAMP
); );
CREATE TABLE failures ( CREATE TABLE failures (
id SERIAL PRIMARY KEY, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
issue text, issue text,
method text, method text,
service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE, service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE,
@ -52,7 +52,7 @@ CREATE TABLE failures (
); );
CREATE TABLE checkins ( 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, service INTEGER NOT NULL REFERENCES services(id) ON DELETE CASCADE ON UPDATE CASCADE,
check_interval integer, check_interval integer,
api text, api text,
@ -60,7 +60,7 @@ CREATE TABLE checkins (
); );
CREATE TABLE communication ( CREATE TABLE communication (
id SERIAL PRIMARY KEY, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
method text, method text,
host text, host text,
port integer, port integer,

View File

@ -50,6 +50,8 @@
</div> </div>
{{template "footer"}}
<script src="/js/jquery-3.3.1.slim.min.js"></script> <script src="/js/jquery-3.3.1.slim.min.js"></script>
<script src="/js/bootstrap.min.js"></script> <script src="/js/bootstrap.min.js"></script>
</body> </body>

View File

@ -7,7 +7,7 @@
<link rel="stylesheet" href="/css/base.css"> <link rel="stylesheet" href="/css/base.css">
<script src="/js/Chart.bundle.min.js"></script> <script src="/js/Chart.bundle.min.js"></script>
<title>Statup | Services</title> <title>Statup | {{.Name}} Service</title>
</head> </head>
<body> <body>

View File

@ -35,24 +35,24 @@
</select> </select>
</div> </div>
<div class="form-group" id="db_host"> <div class="form-group" id="db_host">
<label for="formGroupExampleInput">Host</label> <label for="db_host_in">Host</label>
<input type="text" name="db_host" class="form-control" value="{{.DbHost}}" placeholder="localhost"> <input type="text" name="db_host" id="db_host_in" class="form-control" value="{{.DbHost}}" placeholder="localhost">
</div> </div>
<div class="form-group" id="db_port"> <div class="form-group" id="db_port">
<label for="formGroupExampleInput">Database Port</label> <label for="db_port_in">Database Port</label>
<input type="text" name="db_port" class="form-control" value="{{.DbPort}}" placeholder="localhost"> <input type="text" name="db_port" id="db_port_in" class="form-control" value="{{.DbPort}}" placeholder="localhost">
</div> </div>
<div class="form-group" id="db_user"> <div class="form-group" id="db_user">
<label for="formGroupExampleInput2">Username</label> <label for="db_user_in">Username</label>
<input type="text" name="db_user" class="form-control" value="{{.DbUser}}" placeholder="root"> <input type="text" name="db_user" id="db_user_in" class="form-control" value="{{.DbUser}}" placeholder="root">
</div> </div>
<div class="form-group" id="db_password"> <div class="form-group" id="db_password">
<label for="formGroupExampleInput2">Password</label> <label for="db_password">Password</label>
<input type="password" name="db_password" class="form-control" value="{{.DbPass}}" id="formGroupExampleInput2" placeholder="password123"> <input type="password" name="db_password" class="form-control" value="{{.DbPass}}" id="db_password" placeholder="password123">
</div> </div>
<div class="form-group" id="db_database"> <div class="form-group" id="db_database">
<label for="formGroupExampleInput2">Database</label> <label for="db_database">Database</label>
<input type="text" name="db_database" class="form-control" value="{{.DbData}}" id="formGroupExampleInput2" placeholder="Database name"> <input type="text" name="db_database" class="form-control" value="{{.DbData}}" id="db_database" placeholder="Database name">
</div> </div>
</div> </div>
@ -60,13 +60,13 @@
<div class="col-6"> <div class="col-6">
<div class="form-group"> <div class="form-group">
<label for="formGroupExampleInput">Project Name</label> <label for="project">Project Name</label>
<input type="text" name="project" class="form-control" value="{{.Project}}" id="formGroupExampleInput" placeholder="Great Uptime" required> <input type="text" name="project" class="form-control" value="{{.Project}}" id="project" placeholder="Great Uptime" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="formGroupExampleInput">Project Description</label> <label for="description">Project Description</label>
<input type="text" name="description" class="form-control" value="{{.Description}}" id="formGroupExampleInput" placeholder="Great Uptime"> <input type="text" name="description" class="form-control" value="{{.Description}}" id="description" placeholder="Great Uptime">
</div> </div>
<div class="form-group"> <div class="form-group">
@ -75,25 +75,25 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="formGroupExampleInput">Admin Username</label> <label for="username">Admin Username</label>
<input type="text" name="username" class="form-control" value="{{.Username}}" id="formGroupExampleInput" value="admin" placeholder="admin" required> <input type="text" name="username" class="form-control" value="{{.Username}}" id="username" value="admin" placeholder="admin" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="formGroupExampleInput">Admin Email Address</label> <label for="email">Admin Email Address</label>
<input type="email" name="email" class="form-control" value="{{.Email}}" id="formGroupExampleInput" placeholder="info@admin.com" required> <input type="email" name="email" class="form-control" value="{{.Email}}" id="email" placeholder="info@admin.com" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="formGroupExampleInput">Admin Password</label> <label for="password">Admin Password</label>
<input type="password" name="password" class="form-control" value="{{.Password}}" id="formGroupExampleInput" placeholder="password" required> <input type="password" name="password" class="form-control" value="{{.Password}}" id="password" placeholder="password" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-check-label" for="gridCheck1"> <span class="switch">
Load Sample Data <input type="checkbox" name="sample_data" class="switch" id="switch-normal" checked>
</label> <label for="switch-normal">Load Sample Data</label>
<input name="sample_data" class="form-control" type="checkbox" id="gridCheck1" checked> </span>
</div> </div>
</div> </div>