mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-05-08 09:53:25 +00:00
190 lines
4.6 KiB
Go
190 lines
4.6 KiB
Go
package config
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestTrueNASNewInstanceDefaultsAndUniqueID(t *testing.T) {
|
|
first := NewTrueNASInstance()
|
|
second := NewTrueNASInstance()
|
|
|
|
require.NotEqual(t, first.ID, second.ID)
|
|
_, err := uuid.Parse(first.ID)
|
|
require.NoError(t, err)
|
|
_, err = uuid.Parse(second.ID)
|
|
require.NoError(t, err)
|
|
|
|
require.True(t, first.UseHTTPS)
|
|
require.True(t, first.Enabled)
|
|
require.Equal(t, 60, first.PollIntervalSecs)
|
|
}
|
|
|
|
func TestTrueNASEffectivePollIntervalAndApplyDefaults(t *testing.T) {
|
|
instance := TrueNASInstance{}
|
|
require.Equal(t, 60, instance.EffectivePollIntervalSecs())
|
|
|
|
instance.ApplyDefaults()
|
|
require.Equal(t, 60, instance.PollIntervalSecs)
|
|
|
|
instance.PollIntervalSecs = 120
|
|
require.Equal(t, 120, instance.EffectivePollIntervalSecs())
|
|
}
|
|
|
|
func TestTrueNASValidate(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
instance *TrueNASInstance
|
|
wantError string
|
|
}{
|
|
{
|
|
name: "nil instance",
|
|
instance: nil,
|
|
wantError: "truenas instance is required",
|
|
},
|
|
{
|
|
name: "missing host",
|
|
instance: &TrueNASInstance{
|
|
APIKey: "key",
|
|
},
|
|
wantError: "truenas host is required",
|
|
},
|
|
{
|
|
name: "missing credentials",
|
|
instance: &TrueNASInstance{
|
|
Host: "nas.local",
|
|
},
|
|
wantError: "truenas credentials are required",
|
|
},
|
|
{
|
|
name: "api key auth",
|
|
instance: &TrueNASInstance{
|
|
Host: "nas.local",
|
|
APIKey: "key",
|
|
},
|
|
},
|
|
{
|
|
name: "username password auth",
|
|
instance: &TrueNASInstance{
|
|
Host: "nas.local",
|
|
Username: "admin",
|
|
Password: "secret",
|
|
},
|
|
},
|
|
{
|
|
name: "username without password",
|
|
instance: &TrueNASInstance{
|
|
Host: "nas.local",
|
|
Username: "admin",
|
|
},
|
|
wantError: "truenas credentials are required",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := tt.instance.Validate()
|
|
if tt.wantError == "" {
|
|
require.NoError(t, err)
|
|
return
|
|
}
|
|
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), tt.wantError)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTrueNASRedacted(t *testing.T) {
|
|
instance := TrueNASInstance{
|
|
ID: "id-1",
|
|
Name: "Home NAS",
|
|
Host: "nas.local",
|
|
APIKey: "api-secret",
|
|
Username: "admin",
|
|
Password: "password-secret",
|
|
Enabled: true,
|
|
}
|
|
|
|
redacted := instance.Redacted()
|
|
|
|
require.Equal(t, trueNASSensitiveMask, redacted.APIKey)
|
|
require.Equal(t, trueNASSensitiveMask, redacted.Password)
|
|
require.Equal(t, instance.Username, redacted.Username)
|
|
require.Equal(t, instance.Host, redacted.Host)
|
|
require.Equal(t, "api-secret", instance.APIKey)
|
|
require.Equal(t, "password-secret", instance.Password)
|
|
}
|
|
|
|
func TestTrueNASPersistenceRoundTripEncrypted(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
cp := NewConfigPersistence(tempDir)
|
|
|
|
instance := NewTrueNASInstance()
|
|
instance.Name = "Main NAS"
|
|
instance.Host = "nas.local"
|
|
instance.Port = 443
|
|
instance.APIKey = "api-key-secret"
|
|
instance.Fingerprint = "abcd"
|
|
instance.InsecureSkipVerify = true
|
|
instances := []TrueNASInstance{instance}
|
|
|
|
require.NoError(t, cp.SaveTrueNASConfig(instances))
|
|
|
|
filePath := filepath.Join(tempDir, "truenas.enc")
|
|
raw, err := os.ReadFile(filePath)
|
|
require.NoError(t, err)
|
|
require.NotEmpty(t, raw)
|
|
|
|
plain, err := json.MarshalIndent(instances, "", " ")
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, plain, raw)
|
|
require.False(t, strings.Contains(string(raw), "api-key-secret"))
|
|
require.False(t, strings.Contains(string(raw), "nas.local"))
|
|
|
|
loaded, err := cp.LoadTrueNASConfig()
|
|
require.NoError(t, err)
|
|
require.Equal(t, instances, loaded)
|
|
}
|
|
|
|
func TestTrueNASLoadConfigMissingFileReturnsEmptySlice(t *testing.T) {
|
|
cp := NewConfigPersistence(t.TempDir())
|
|
|
|
loaded, err := cp.LoadTrueNASConfig()
|
|
require.NoError(t, err)
|
|
require.NotNil(t, loaded)
|
|
require.Empty(t, loaded)
|
|
}
|
|
|
|
func TestTrueNASLoadConfigMigratesPlaintextFile(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
cp := NewConfigPersistence(tempDir)
|
|
|
|
instance := NewTrueNASInstance()
|
|
instance.Host = "nas.local"
|
|
instance.APIKey = "api-key-secret"
|
|
instances := []TrueNASInstance{instance}
|
|
|
|
plain, err := json.Marshal(instances)
|
|
require.NoError(t, err)
|
|
|
|
filePath := filepath.Join(tempDir, "truenas.enc")
|
|
require.NoError(t, os.WriteFile(filePath, plain, 0o600))
|
|
|
|
loaded, err := cp.LoadTrueNASConfig()
|
|
require.NoError(t, err)
|
|
require.Equal(t, instances, loaded)
|
|
|
|
rewritten, err := os.ReadFile(filePath)
|
|
require.NoError(t, err)
|
|
require.False(t, bytes.Equal(rewritten, plain))
|
|
require.False(t, strings.Contains(string(rewritten), "api-key-secret"))
|
|
require.False(t, strings.Contains(string(rewritten), "nas.local"))
|
|
}
|