From eb13ef5a217be99850adfdb1d3a7e9db5f78b585 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 2 Apr 2026 10:23:40 +0100 Subject: [PATCH] ax(mining): rename settings_manager tests to Good/Bad/Ugly convention MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All test functions in settings_manager_test.go now follow TestFilename_Function_{Good,Bad,Ugly} per AX RFC-025 §Test Naming. Added _Bad (load from missing path) and _Ugly (concurrent access) cases where only descriptive suffixes existed before. Co-Authored-By: Charon --- pkg/mining/settings_manager_test.go | 74 ++++++++++++++++++----------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/pkg/mining/settings_manager_test.go b/pkg/mining/settings_manager_test.go index 69e9d2c..02d6f5c 100644 --- a/pkg/mining/settings_manager_test.go +++ b/pkg/mining/settings_manager_test.go @@ -6,7 +6,7 @@ import ( "testing" ) -func TestSettingsManager_DefaultSettings(t *testing.T) { +func TestSettingsManager_DefaultSettings_Good(t *testing.T) { defaults := DefaultSettings() if defaults.Window.Width != 1400 { @@ -26,36 +26,30 @@ func TestSettingsManager_DefaultSettings(t *testing.T) { } } -func TestSettingsManager_SaveAndLoad(t *testing.T) { - // Use a temp directory for testing +func TestSettingsManager_SaveAndLoad_Good(t *testing.T) { tmpDir := t.TempDir() settingsPath := filepath.Join(tmpDir, "settings.json") - // Create settings manager with custom path sm := &SettingsManager{ settings: DefaultSettings(), settingsPath: settingsPath, } - // Modify settings sm.settings.Window.Width = 1920 sm.settings.Window.Height = 1080 sm.settings.StartOnBoot = true sm.settings.AutostartMiners = true sm.settings.CPUThrottlePercent = 50 - // Save err := sm.Save() if err != nil { t.Fatalf("Failed to save settings: %v", err) } - // Verify file exists if _, err := os.Stat(settingsPath); os.IsNotExist(err) { t.Fatal("Settings file was not created") } - // Create new manager and load sm2 := &SettingsManager{ settings: DefaultSettings(), settingsPath: settingsPath, @@ -65,7 +59,6 @@ func TestSettingsManager_SaveAndLoad(t *testing.T) { t.Fatalf("Failed to load settings: %v", err) } - // Verify loaded values if sm2.settings.Window.Width != 1920 { t.Errorf("Expected width 1920, got %d", sm2.settings.Window.Width) } @@ -83,7 +76,19 @@ func TestSettingsManager_SaveAndLoad(t *testing.T) { } } -func TestSettingsManager_UpdateWindowState(t *testing.T) { +func TestSettingsManager_SaveAndLoad_Bad(t *testing.T) { + // Load from a path that does not exist — must return an error. + sm := &SettingsManager{ + settings: DefaultSettings(), + settingsPath: filepath.Join(t.TempDir(), "does_not_exist", "settings.json"), + } + + if err := sm.Load(); err == nil { + t.Error("Expected error loading from missing path, got nil") + } +} + +func TestSettingsManager_UpdateWindowState_Good(t *testing.T) { tmpDir := t.TempDir() settingsPath := filepath.Join(tmpDir, "settings.json") @@ -112,7 +117,7 @@ func TestSettingsManager_UpdateWindowState(t *testing.T) { } } -func TestSettingsManager_SetCPUThrottle(t *testing.T) { +func TestSettingsManager_SetCPUThrottle_Good(t *testing.T) { tmpDir := t.TempDir() settingsPath := filepath.Join(tmpDir, "settings.json") @@ -121,7 +126,6 @@ func TestSettingsManager_SetCPUThrottle(t *testing.T) { settingsPath: settingsPath, } - // Test enabling throttle err := sm.SetCPUThrottle(true, 30) if err != nil { t.Fatalf("Failed to set CPU throttle: %v", err) @@ -134,19 +138,10 @@ func TestSettingsManager_SetCPUThrottle(t *testing.T) { if settings.CPUThrottlePercent != 30 { t.Errorf("Expected CPUThrottlePercent 30, got %d", settings.CPUThrottlePercent) } - - // Test invalid percentage (should be ignored) - err = sm.SetCPUThrottle(true, 150) - if err != nil { - t.Fatalf("Failed to set CPU throttle: %v", err) - } - settings = sm.Get() - if settings.CPUThrottlePercent != 30 { // Should remain unchanged - t.Errorf("Expected CPUThrottlePercent to remain 30, got %d", settings.CPUThrottlePercent) - } } -func TestSettingsManager_SetMinerDefaults(t *testing.T) { +func TestSettingsManager_SetCPUThrottle_Bad(t *testing.T) { + // An out-of-range percentage (>100) must be ignored, leaving the prior value unchanged. tmpDir := t.TempDir() settingsPath := filepath.Join(tmpDir, "settings.json") @@ -155,7 +150,30 @@ func TestSettingsManager_SetMinerDefaults(t *testing.T) { settingsPath: settingsPath, } - defaults := MinerDefaults{ + if err := sm.SetCPUThrottle(true, 30); err != nil { + t.Fatalf("Setup: failed to set initial throttle: %v", err) + } + + if err := sm.SetCPUThrottle(true, 150); err != nil { + t.Fatalf("Expected no error on invalid percent, got: %v", err) + } + + settings := sm.Get() + if settings.CPUThrottlePercent != 30 { + t.Errorf("Expected CPUThrottlePercent to remain 30 after invalid input, got %d", settings.CPUThrottlePercent) + } +} + +func TestSettingsManager_SetMinerDefaults_Good(t *testing.T) { + tmpDir := t.TempDir() + settingsPath := filepath.Join(tmpDir, "settings.json") + + sm := &SettingsManager{ + settings: DefaultSettings(), + settingsPath: settingsPath, + } + + minerDefaults := MinerDefaults{ DefaultPool: "stratum+tcp://pool.example.com:3333", DefaultWallet: "wallet123", DefaultAlgorithm: "rx/0", @@ -163,7 +181,7 @@ func TestSettingsManager_SetMinerDefaults(t *testing.T) { CPUThrottleThreshold: 90, } - err := sm.SetMinerDefaults(defaults) + err := sm.SetMinerDefaults(minerDefaults) if err != nil { t.Fatalf("Failed to set miner defaults: %v", err) } @@ -177,7 +195,8 @@ func TestSettingsManager_SetMinerDefaults(t *testing.T) { } } -func TestSettingsManager_ConcurrentAccess(t *testing.T) { +func TestSettingsManager_ConcurrentAccess_Ugly(t *testing.T) { + // Ugly: concurrent reads and writes must not race or corrupt state. tmpDir := t.TempDir() settingsPath := filepath.Join(tmpDir, "settings.json") @@ -186,7 +205,6 @@ func TestSettingsManager_ConcurrentAccess(t *testing.T) { settingsPath: settingsPath, } - // Concurrent reads and writes done := make(chan bool) for i := 0; i < 10; i++ { go func(n int) { @@ -198,12 +216,10 @@ func TestSettingsManager_ConcurrentAccess(t *testing.T) { }(i) } - // Wait for all goroutines for i := 0; i < 10; i++ { <-done } - // Should complete without race conditions state := sm.GetWindowState() if state.Width < 800 || state.Width > 900 { t.Errorf("Unexpected width after concurrent access: %d", state.Width)