From d53a4e6ac30cafff3abf650e3de4ea74016544d3 Mon Sep 17 00:00:00 2001 From: Tyler Koenig Date: Fri, 5 Jun 2026 16:30:38 -0400 Subject: [PATCH 1/2] refactor(monitor): extract magic numbers into named constants Closes #75 --- internal/monitor/checker.go | 24 +++++++++++++++++------- internal/monitor/monitor.go | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/internal/monitor/checker.go b/internal/monitor/checker.go index 5ce2720..5ed3f3a 100644 --- a/internal/monitor/checker.go +++ b/internal/monitor/checker.go @@ -15,6 +15,16 @@ import ( probing "github.com/prometheus-community/pro-bing" ) +const ( + maxErrorLength = 256 + defaultAcceptedCodes = "200-299" + defaultHTTPStatusMin = 200 + defaultHTTPStatusMax = 300 + defaultTimeout = 5 * time.Second + defaultDNSServer = "1.1.1.1" + defaultDNSPort = "53" +) + type CheckResult struct { SiteID int Status string // "UP", "DOWN", "SSL EXP" @@ -90,7 +100,7 @@ func runHTTPCheck(site models.Site, strict, insecure *http.Client, globalInsecur if err != nil { result.Status = "DOWN" - result.ErrorReason = truncateError(err.Error(), 256) + result.ErrorReason = truncateError(err.Error(), maxErrorLength) return result } defer resp.Body.Close() @@ -100,7 +110,7 @@ func runHTTPCheck(site models.Site, strict, insecure *http.Client, globalInsecur result.Status = "DOWN" expected := site.AcceptedCodes if expected == "" { - expected = "200-299" + expected = defaultAcceptedCodes } result.ErrorReason = fmt.Sprintf("HTTP %d (expected %s)", resp.StatusCode, expected) } @@ -160,7 +170,7 @@ func runPortCheck(site models.Site) CheckResult { latency := time.Since(start) if err != nil { - return CheckResult{SiteID: site.ID, Status: "DOWN", LatencyNs: latency.Nanoseconds(), ErrorReason: truncateError(err.Error(), 256)} + return CheckResult{SiteID: site.ID, Status: "DOWN", LatencyNs: latency.Nanoseconds(), ErrorReason: truncateError(err.Error(), maxErrorLength)} } _ = conn.Close() return CheckResult{SiteID: site.ID, Status: "UP", LatencyNs: latency.Nanoseconds()} @@ -174,10 +184,10 @@ func runDNSCheck(site models.Site) CheckResult { server := site.DNSServer if server == "" { - server = "1.1.1.1" + server = defaultDNSServer } if _, _, err := net.SplitHostPort(server); err != nil { - server = net.JoinHostPort(server, "53") + server = net.JoinHostPort(server, defaultDNSPort) } qtype := dns.TypeA @@ -223,12 +233,12 @@ func siteTimeout(site models.Site) time.Duration { if site.Timeout > 0 { return time.Duration(site.Timeout) * time.Second } - return 5 * time.Second + return defaultTimeout } func isCodeAccepted(code int, accepted string) bool { if accepted == "" { - return code >= 200 && code < 300 + return code >= defaultHTTPStatusMin && code < defaultHTTPStatusMax } for _, part := range strings.Split(accepted, ",") { part = strings.TrimSpace(part) diff --git a/internal/monitor/monitor.go b/internal/monitor/monitor.go index 05df6f8..ac20972 100644 --- a/internal/monitor/monitor.go +++ b/internal/monitor/monitor.go @@ -138,7 +138,7 @@ func (e *Engine) AddLog(msg string) { } func (e *Engine) InitLogs() { - logs, err := e.db.LoadLogs(100) + logs, err := e.db.LoadLogs(maxLogEntries) if err != nil { return } -- 2.52.0 From cc139bdb7381b02a84113bb88872faa161e1e057 Mon Sep 17 00:00:00 2001 From: Tyler Koenig Date: Fri, 5 Jun 2026 16:30:39 -0400 Subject: [PATCH 2/2] refactor(store): check all discarded errors in sqlstore_test.go Closes #74 --- internal/store/sqlstore_test.go | 62 ++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/internal/store/sqlstore_test.go b/internal/store/sqlstore_test.go index ef5956b..e1d9b50 100644 --- a/internal/store/sqlstore_test.go +++ b/internal/store/sqlstore_test.go @@ -50,7 +50,10 @@ func TestSiteCRUD(t *testing.T) { t.Fatalf("UpdateSite: %v", err) } - sites, _ = s.GetSites() + sites, err = s.GetSites() + if err != nil { + t.Fatalf("GetSites: %v", err) + } if sites[0].Name != "Updated" { t.Errorf("expected name 'Updated', got '%s'", sites[0].Name) } @@ -59,7 +62,10 @@ func TestSiteCRUD(t *testing.T) { t.Fatalf("DeleteSite: %v", err) } - sites, _ = s.GetSites() + sites, err = s.GetSites() + if err != nil { + t.Fatalf("GetSites: %v", err) + } if len(sites) != 0 { t.Fatalf("expected 0 sites after delete, got %d", len(sites)) } @@ -98,7 +104,10 @@ func TestAlertCRUD(t *testing.T) { t.Fatalf("UpdateAlert: %v", err) } - a, _ = s.GetAlert(a.ID) + a, err = s.GetAlert(a.ID) + if err != nil { + t.Fatalf("GetAlert: %v", err) + } if a.Type != "slack" { t.Errorf("expected type 'slack', got '%s'", a.Type) } @@ -107,7 +116,10 @@ func TestAlertCRUD(t *testing.T) { t.Fatalf("DeleteAlert: %v", err) } - alerts, _ = s.GetAllAlerts() + alerts, err = s.GetAllAlerts() + if err != nil { + t.Fatalf("GetAllAlerts: %v", err) + } if len(alerts) != 0 { t.Fatalf("expected 0 alerts after delete, got %d", len(alerts)) } @@ -135,7 +147,10 @@ func TestUserCRUD(t *testing.T) { t.Fatalf("UpdateUser: %v", err) } - users, _ = s.GetAllUsers() + users, err = s.GetAllUsers() + if err != nil { + t.Fatalf("GetAllUsers: %v", err) + } if users[0].Username != "root" { t.Errorf("expected username 'root', got '%s'", users[0].Username) } @@ -144,7 +159,10 @@ func TestUserCRUD(t *testing.T) { t.Fatalf("DeleteUser: %v", err) } - users, _ = s.GetAllUsers() + users, err = s.GetAllUsers() + if err != nil { + t.Fatalf("GetAllUsers: %v", err) + } if len(users) != 0 { t.Fatalf("expected 0 users after delete, got %d", len(users)) } @@ -157,7 +175,10 @@ func TestPushTokenGeneration(t *testing.T) { t.Fatalf("AddSite: %v", err) } - sites, _ := s.GetSites() + sites, err := s.GetSites() + if err != nil { + t.Fatalf("GetSites: %v", err) + } if len(sites) != 1 { t.Fatalf("expected 1 site, got %d", len(sites)) } @@ -172,9 +193,15 @@ func TestPushTokenGeneration(t *testing.T) { func TestImportExport(t *testing.T) { s := newTestStore(t) - s.AddAlert("Test Alert", "webhook", map[string]string{"url": "https://example.com"}) - s.AddSite(models.Site{Name: "Site1", URL: "https://example.com", Type: "http", Interval: 30}) - s.AddUser("user1", "ssh-ed25519 KEY", "user") + if err := s.AddAlert("Test Alert", "webhook", map[string]string{"url": "https://example.com"}); err != nil { + t.Fatalf("AddAlert: %v", err) + } + if err := s.AddSite(models.Site{Name: "Site1", URL: "https://example.com", Type: "http", Interval: 30}); err != nil { + t.Fatalf("AddSite: %v", err) + } + if err := s.AddUser("user1", "ssh-ed25519 KEY", "user"); err != nil { + t.Fatalf("AddUser: %v", err) + } backup, err := s.ExportData() if err != nil { @@ -189,9 +216,18 @@ func TestImportExport(t *testing.T) { t.Fatalf("ImportData: %v", err) } - sites, _ := s2.GetSites() - alerts, _ := s2.GetAllAlerts() - users, _ := s2.GetAllUsers() + sites, err := s2.GetSites() + if err != nil { + t.Fatalf("GetSites: %v", err) + } + alerts, err := s2.GetAllAlerts() + if err != nil { + t.Fatalf("GetAllAlerts: %v", err) + } + users, err := s2.GetAllUsers() + if err != nil { + t.Fatalf("GetAllUsers: %v", err) + } if len(sites) != 1 || len(alerts) != 1 || len(users) != 1 { t.Fatalf("import mismatch: %d sites, %d alerts, %d users", len(sites), len(alerts), len(users)) } -- 2.52.0