From 301b2fd050f0cbe50a6dd06f2d232d8e06565d32 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Sun, 4 Jan 2026 17:50:57 +0000 Subject: [PATCH] test: fix config tests failing in CI when /etc/pulse doesn't exist Tests were calling Load() without setting PULSE_DATA_DIR, causing them to try to create /etc/pulse which fails in CI environments. - Skip TestLoad_Defaults if /etc/pulse doesn't exist - Add PULSE_DATA_DIR to tests that were missing it --- internal/config/config_load_extra_coverage_test.go | 5 +++++ internal/config/config_load_extra_test.go | 1 + internal/config/config_load_test.go | 12 ++++++++++++ 3 files changed, 18 insertions(+) diff --git a/internal/config/config_load_extra_coverage_test.go b/internal/config/config_load_extra_coverage_test.go index b72d4775b..b08549a7f 100644 --- a/internal/config/config_load_extra_coverage_test.go +++ b/internal/config/config_load_extra_coverage_test.go @@ -35,6 +35,7 @@ func TestLoad_EnvLoadErrors(t *testing.T) { } func TestLoad_EnvOverrides_Invalid_Extra(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("BACKUP_POLLING_CYCLES", "-1") t.Setenv("BACKUP_POLLING_INTERVAL", "-5s") t.Setenv("PVE_POLLING_INTERVAL", "5s") // too low @@ -51,6 +52,7 @@ func TestLoad_EnvOverrides_Invalid_Extra(t *testing.T) { } func TestLoad_EnvOverrides_Seconds(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("BACKUP_POLLING_INTERVAL", "30") t.Setenv("PVE_POLLING_INTERVAL", "45") @@ -62,6 +64,7 @@ func TestLoad_EnvOverrides_Seconds(t *testing.T) { } func TestLoad_EnvOverrides_More(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("PULSE_ENABLE_SENSOR_PROXY", "true") t.Setenv("PULSE_AUTH_HIDE_LOCAL_LOGIN", "true") t.Setenv("PULSE_DISABLE_DOCKER_UPDATE_ACTIONS", "true") @@ -89,6 +92,7 @@ func TestLoad_EnvOverrides_More(t *testing.T) { } func TestLoad_EnvOverrides_AdaptivePolling_Intervals(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("ADAPTIVE_POLLING_BASE_INTERVAL", "30s") t.Setenv("ADAPTIVE_POLLING_MIN_INTERVAL", "10s") t.Setenv("ADAPTIVE_POLLING_MAX_INTERVAL", "10m") @@ -102,6 +106,7 @@ func TestLoad_EnvOverrides_AdaptivePolling_Intervals(t *testing.T) { } func TestLoad_EnvOverrides_Invalid_Negative(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("GUEST_METADATA_MIN_REFRESH_INTERVAL", "-1s") t.Setenv("GUEST_METADATA_REFRESH_JITTER", "-500ms") t.Setenv("GUEST_METADATA_RETRY_BACKOFF", "-1s") diff --git a/internal/config/config_load_extra_test.go b/internal/config/config_load_extra_test.go index 900f5fbd3..23230e14e 100644 --- a/internal/config/config_load_extra_test.go +++ b/internal/config/config_load_extra_test.go @@ -88,6 +88,7 @@ func TestLoad_MockEnvErrors(t *testing.T) { os.Chdir(tempCWD) defer os.Chdir(cwd) + t.Setenv("PULSE_DATA_DIR", tempCWD) require.NoError(t, os.WriteFile("mock.env", []byte("invalid="), 0644)) require.NoError(t, os.WriteFile("mock.env.local", []byte("invalid="), 0644)) diff --git a/internal/config/config_load_test.go b/internal/config/config_load_test.go index 1a63272b8..3d07d1d37 100644 --- a/internal/config/config_load_test.go +++ b/internal/config/config_load_test.go @@ -11,6 +11,12 @@ import ( ) func TestLoad_Defaults(t *testing.T) { + // This test requires write access to /etc/pulse (the default data path) + // Skip in CI environments where /etc/pulse doesn't exist or isn't writable + if _, err := os.Stat("/etc/pulse"); os.IsNotExist(err) { + t.Skip("Skipping test: /etc/pulse does not exist (likely CI environment)") + } + // Clear env vars that might affect defaults os.Unsetenv("PULSE_DATA_DIR") os.Unsetenv("PORT") @@ -84,6 +90,8 @@ func TestLoad_APITokens_Migration(t *testing.T) { } func TestLoad_LegacyAPIToken(t *testing.T) { + tempDir := t.TempDir() + t.Setenv("PULSE_DATA_DIR", tempDir) t.Setenv("API_TOKEN", "legacytoken") cfg, err := Load() @@ -115,6 +123,7 @@ func TestLoad_MockEnv(t *testing.T) { } func TestLoad_ProxyAuth(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("PROXY_AUTH_SECRET", "secret") t.Setenv("PROXY_AUTH_USER_HEADER", "X-User") @@ -126,6 +135,7 @@ func TestLoad_ProxyAuth(t *testing.T) { } func TestLoad_OIDC(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) t.Setenv("OIDC_ENABLED", "true") t.Setenv("OIDC_ISSUER_URL", "https://issuer.com") t.Setenv("OIDC_CLIENT_ID", "client-id") @@ -140,6 +150,7 @@ func TestLoad_OIDC(t *testing.T) { } func TestLoad_AuthPass_AutoHash(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) pass := "mysecretpassword" t.Setenv("PULSE_AUTH_PASS", pass) @@ -151,6 +162,7 @@ func TestLoad_AuthPass_AutoHash(t *testing.T) { } func TestLoad_AuthPass_PreHashed(t *testing.T) { + t.Setenv("PULSE_DATA_DIR", t.TempDir()) hash := "$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy" t.Setenv("PULSE_AUTH_PASS", hash)