From 63baf4a83a89aee5694a7fb6c43a09c41b6b8ceb Mon Sep 17 00:00:00 2001 From: "Luis Gustavo S. Barreto" Date: Mon, 18 Jan 2021 16:05:55 -0300 Subject: [PATCH] Fix gorm issue when saving zero values in 'ExpectedStatus' field Any zero value like 0, '', false won't be saved into the database for those fields defined default value, you might want to use pointer type or Scanner/Valuer to avoid this. See: https://gorm.io/docs/create.html#Default-Values --- types/services/routine.go | 12 ++++++------ types/services/routine_test.go | 20 ++++++++++---------- types/services/samples.go | 10 +++++----- types/services/services_test.go | 10 +++++----- types/services/struct.go | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/types/services/routine.go b/types/services/routine.go index ff298c94..ae908a0b 100644 --- a/types/services/routine.go +++ b/types/services/routine.go @@ -208,9 +208,9 @@ func CheckGrpc(s *Service, record bool) (*Service, error) { s.Online = true if s.GrpcHealthCheck.Bool { - if s.ExpectedStatus != s.LastStatusCode { + if *s.ExpectedStatus != s.LastStatusCode { if record { - RecordFailure(s, fmt.Sprintf("GRPC Service: '%s', Status Code: expected '%v', got '%v'", s.Name, s.ExpectedStatus, s.LastStatusCode), "response_code") + RecordFailure(s, fmt.Sprintf("GRPC Service: '%s', Status Code: expected '%v', got '%v'", s.Name, *s.ExpectedStatus, s.LastStatusCode), "response_code") } return s, nil } @@ -381,9 +381,9 @@ func CheckHttp(s *Service, record bool) (*Service, error) { return s, err } } - if s.ExpectedStatus != res.StatusCode { + if *s.ExpectedStatus != res.StatusCode { if record { - RecordFailure(s, fmt.Sprintf("HTTP Status Code %v did not match %v", res.StatusCode, s.ExpectedStatus), "status_code") + RecordFailure(s, fmt.Sprintf("HTTP Status Code %v did not match %v", res.StatusCode, *s.ExpectedStatus), "status_code") } return s, err } @@ -462,9 +462,9 @@ func CheckSsh(s *Service, record bool) (*Service, error) { s.Online = true if s.SshHealthCheck.Bool { - if s.ExpectedStatus != s.LastStatusCode { + if *s.ExpectedStatus != s.LastStatusCode { if record { - RecordFailure(s, fmt.Sprintf("SSH Service: '%s', Exit Code: expected '%v', got '%v'", s.Name, s.ExpectedStatus, s.LastStatusCode), "response_code") + RecordFailure(s, fmt.Sprintf("SSH Service: '%s', Exit Code: expected '%v', got '%v'", s.Name, *s.ExpectedStatus, s.LastStatusCode), "response_code") } return s, nil } diff --git a/types/services/routine_test.go b/types/services/routine_test.go index 92f1035c..9e1174a7 100644 --- a/types/services/routine_test.go +++ b/types/services/routine_test.go @@ -31,7 +31,7 @@ var testdata = []struct { Domain: "localhost", Port: 50053, Expected: null.NewNullString("status:SERVING"), - ExpectedStatus: 1, + ExpectedStatus: &[]int{1}[0], Type: "grpc", Timeout: 3, VerifySSL: null.NewNullBool(false), @@ -47,7 +47,7 @@ var testdata = []struct { Domain: "localhost", Port: 50054, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(true), @@ -63,7 +63,7 @@ var testdata = []struct { Domain: "localhost", Port: 50055, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(false), @@ -78,7 +78,7 @@ var testdata = []struct { Domain: "localhost", Port: 1000, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(false), @@ -94,7 +94,7 @@ var testdata = []struct { Domain: "localhost", Port: 1000, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(true), @@ -110,7 +110,7 @@ var testdata = []struct { Domain: "http://localhost", Port: 50058, Expected: null.NewNullString("status:SERVING"), - ExpectedStatus: 1, + ExpectedStatus: &[]int{1}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(false), @@ -126,7 +126,7 @@ var testdata = []struct { Domain: "http://local//host", Port: 50059, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(false), @@ -142,7 +142,7 @@ var testdata = []struct { Domain: "https://google.com", Port: 443, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(false), @@ -157,7 +157,7 @@ var testdata = []struct { Domain: "http://localhost", Port: 50061, Expected: null.NewNullString(""), - ExpectedStatus: 0, + ExpectedStatus: &[]int{0}[0], Type: "grpc", Timeout: 1, VerifySSL: null.NewNullBool(false), @@ -194,7 +194,7 @@ func TestCheckGrpc(t *testing.T) { server := v.grpcService(v.clientChecker.Port, v.clientChecker.GrpcHealthCheck.Bool) defer server.Stop() v.clientChecker.CheckService(false) - if v.clientChecker.LastStatusCode != v.clientChecker.ExpectedStatus || strings.TrimSpace(v.clientChecker.LastResponse) != v.clientChecker.Expected.String { + if v.clientChecker.LastStatusCode != *v.clientChecker.ExpectedStatus || strings.TrimSpace(v.clientChecker.LastResponse) != v.clientChecker.Expected.String { t.Errorf("Expected message: '%v', Got message: '%v' , Expected Status: '%v', Got Status: '%v'", v.clientChecker.Expected.String, v.clientChecker.LastResponse, v.clientChecker.ExpectedStatus, v.clientChecker.LastStatusCode) } }) diff --git a/types/services/samples.go b/types/services/samples.go index 1ed482b4..0f5f60fe 100644 --- a/types/services/samples.go +++ b/types/services/samples.go @@ -12,7 +12,7 @@ func Example(online bool) Service { Name: "Statping Example", Domain: "https://statping.com", Expected: null.NewNullString(""), - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Interval: int(time.Duration(15 * time.Second).Seconds()), Type: "http", Method: "get", @@ -63,7 +63,7 @@ func Samples() error { s1 := &Service{ Name: "Google", Domain: "https://google.com", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Interval: 10, Type: "http", Method: "GET", @@ -84,7 +84,7 @@ func Samples() error { s2 := &Service{ Name: "Statping Github", Domain: "https://github.com/statping/statping", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Interval: 30, Type: "http", Method: "GET", @@ -103,7 +103,7 @@ func Samples() error { s3 := &Service{ Name: "JSON Users Test", Domain: "https://jsonplaceholder.typicode.com/users", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Interval: 60, Type: "http", Method: "GET", @@ -122,7 +122,7 @@ func Samples() error { s4 := &Service{ Name: "JSON API Tester", Domain: "https://jsonplaceholder.typicode.com/posts", - ExpectedStatus: 201, + ExpectedStatus: &[]int{201}[0], Expected: null.NewNullString(`(title)": "((\\"|[statping])*)"`), Interval: 30, Type: "http", diff --git a/types/services/services_test.go b/types/services/services_test.go index 637e2088..c53ceaea 100644 --- a/types/services/services_test.go +++ b/types/services/services_test.go @@ -26,7 +26,7 @@ import ( var example = &Service{ Name: "Example Service", Domain: "https://statping.com", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Interval: 30, Type: "http", Method: "GET", @@ -237,7 +237,7 @@ func TestServices(t *testing.T) { e := &Service{ Name: "Example HTTP", Domain: "http://localhost:15000", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Type: "http", Method: "GET", Timeout: 5, @@ -255,7 +255,7 @@ func TestServices(t *testing.T) { e := &Service{ Name: "Example TLS", Domain: "http://localhost:15001", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Type: "http", Method: "GET", Timeout: 5, @@ -276,7 +276,7 @@ func TestServices(t *testing.T) { e := &Service{ Name: "Example TLS HTTP", Domain: "https://localhost:15001", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Type: "http", Method: "GET", Timeout: 15, @@ -487,7 +487,7 @@ func TestServices(t *testing.T) { example := &Service{ Name: "Example Service 2", Domain: "https://slack.statping.com", - ExpectedStatus: 200, + ExpectedStatus: &[]int{200}[0], Interval: 10, Type: "http", Method: "GET", diff --git a/types/services/struct.go b/types/services/struct.go index 0594c019..74cec9b3 100644 --- a/types/services/struct.go +++ b/types/services/struct.go @@ -16,7 +16,7 @@ type Service struct { Name string `gorm:"column:name" json:"name" yaml:"name"` Domain string `gorm:"column:domain" json:"domain" yaml:"domain" private:"true" scope:"user,admin"` Expected null.NullString `gorm:"column:expected" json:"expected" yaml:"expected" scope:"user,admin"` - ExpectedStatus int `gorm:"default:200;column:expected_status" json:"expected_status" yaml:"expected_status" scope:"user,admin"` + ExpectedStatus *int `gorm:"column:expected_status" json:"expected_status" yaml:"expected_status" scope:"user,admin"` Interval int `gorm:"default:30;column:check_interval" json:"check_interval" yaml:"check_interval"` Type string `gorm:"column:check_type" json:"type" scope:"user,admin" yaml:"type"` Method string `gorm:"column:method" json:"method" scope:"user,admin" yaml:"method"`