From 656ae0d2541515ee2116d0a2f644facb0e2ead3b Mon Sep 17 00:00:00 2001 From: rcourtman Date: Mon, 20 Oct 2025 15:22:23 +0000 Subject: [PATCH] fix: use proper Monitor constructor in PMG tests to initialize all maps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes panic: assignment to entry in nil map in PMG polling tests. **Problem:** Tests were manually creating Monitor structs without initializing internal maps like pollStatusMap, causing nil map panics when recordTaskResult() tried to update task status. **Root Cause:** - TestPollPMGInstancePopulatesState (line 90) - TestPollPMGInstanceRecordsAuthFailures (line 189) Both created Monitor with only partial field initialization, missing: - pollStatusMap - dlqInsightMap - instanceInfoCache - Other internal state maps **Solution:** Changed both tests to use New() constructor which properly initializes all maps and internal state (monitor.go:1541). This ensures tests match production initialization and will automatically pick up any future map additions. **Tests:** ✅ TestPollPMGInstancePopulatesState - now passes ✅ TestPollPMGInstanceRecordsAuthFailures - now passes ✅ All monitoring tests pass (0.125s) Follows best practice: use constructors instead of manual struct creation to maintain initialization invariants. --- internal/monitoring/monitor_pmg_test.go | 61 ++++++++++++------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/internal/monitoring/monitor_pmg_test.go b/internal/monitoring/monitor_pmg_test.go index 9d499d4c1..b3437be5a 100644 --- a/internal/monitoring/monitor_pmg_test.go +++ b/internal/monitoring/monitor_pmg_test.go @@ -10,7 +10,6 @@ import ( "time" "github.com/rcourtman/pulse-go-rewrite/internal/config" - "github.com/rcourtman/pulse-go-rewrite/internal/models" "github.com/rcourtman/pulse-go-rewrite/pkg/pmg" ) @@ -87,25 +86,24 @@ func TestPollPMGInstancePopulatesState(t *testing.T) { t.Fatalf("unexpected client error: %v", err) } - mon := &Monitor{ - config: &config.Config{ - PMGInstances: []config.PMGInstance{ - { - Name: "primary", - Host: server.URL, - User: "api@pmg", - Password: "secret", - MonitorMailStats: true, - MonitorQueues: true, - MonitorQuarantine: true, - MonitorDomainStats: true, - }, + cfg := &config.Config{ + PMGInstances: []config.PMGInstance{ + { + Name: "primary", + Host: server.URL, + User: "api@pmg", + Password: "secret", + MonitorMailStats: true, + MonitorQueues: true, + MonitorQuarantine: true, + MonitorDomainStats: true, }, }, - state: models.NewState(), - authFailures: make(map[string]int), - lastAuthAttempt: make(map[string]time.Time), - pbsBackupPollers: make(map[string]bool), + } + + mon, err := New(cfg) + if err != nil { + t.Fatalf("failed to create monitor: %v", err) } mon.pollPMGInstance(context.Background(), "primary", client) @@ -187,22 +185,21 @@ func TestPollPMGInstanceRecordsAuthFailures(t *testing.T) { t.Fatalf("unexpected error creating token client: %v", err) } - mon := &Monitor{ - config: &config.Config{ - PMGInstances: []config.PMGInstance{ - { - Name: "failing", - Host: server.URL, - User: "apitest@pmg", - TokenName: "apitoken", - TokenValue: "secret", - }, + cfg := &config.Config{ + PMGInstances: []config.PMGInstance{ + { + Name: "failing", + Host: server.URL, + User: "apitest@pmg", + TokenName: "apitoken", + TokenValue: "secret", }, }, - state: models.NewState(), - authFailures: make(map[string]int), - lastAuthAttempt: make(map[string]time.Time), - pbsBackupPollers: make(map[string]bool), + } + + mon, err := New(cfg) + if err != nil { + t.Fatalf("failed to create monitor: %v", err) } mon.pollPMGInstance(context.Background(), "failing", client)