Pulse/internal/config/docker_metadata_test.go
rcourtman ed78509f92 Fix flaky tests and improve coverage across alerts, api, and config packages
- Fix deadlock and race conditions in internal/alerts
- Add comprehensive error path tests for internal/config
- Fix 401 handling in internal/api
- Fix Docker Swarm task filtering test logic
2026-01-03 18:36:17 +00:00

147 lines
3.9 KiB
Go

package config
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestNewDockerMetadataStore(t *testing.T) {
tempDir := t.TempDir()
store := NewDockerMetadataStore(tempDir, nil)
assert.NotNil(t, store)
assert.Empty(t, store.GetAll())
assert.Empty(t, store.GetAllHostMetadata())
}
func TestDockerMetadataStore_Container_CRUD(t *testing.T) {
tempDir := t.TempDir()
store := NewDockerMetadataStore(tempDir, nil)
id := "container1"
meta := &DockerMetadata{
ID: id,
Description: "Test Container",
}
err := store.Set(id, meta)
require.NoError(t, err)
readMeta := store.Get(id)
assert.Equal(t, meta.Description, readMeta.Description)
store2 := NewDockerMetadataStore(tempDir, nil)
assert.Equal(t, meta.Description, store2.Get(id).Description)
err = store.Delete(id)
require.NoError(t, err)
assert.Nil(t, store.Get(id))
}
func TestDockerMetadataStore_Host_CRUD(t *testing.T) {
tempDir := t.TempDir()
store := NewDockerMetadataStore(tempDir, nil)
id := "host1"
meta := &DockerHostMetadata{
CustomDisplayName: "My Host",
}
err := store.SetHostMetadata(id, meta)
require.NoError(t, err)
readMeta := store.GetHostMetadata(id)
assert.Equal(t, "My Host", readMeta.CustomDisplayName)
store2 := NewDockerMetadataStore(tempDir, nil)
assert.Equal(t, "My Host", store2.GetHostMetadata(id).CustomDisplayName)
// Delete by setting empty/nil
err = store.SetHostMetadata(id, nil)
require.NoError(t, err)
assert.Nil(t, store.GetHostMetadata(id))
}
func TestDockerMetadataStore_Set_NilContainer(t *testing.T) {
store := NewDockerMetadataStore(t.TempDir(), nil)
err := store.Set("id", nil)
assert.Error(t, err)
}
func TestDockerMetadataStore_ReplaceAll(t *testing.T) {
tempDir := t.TempDir()
store := NewDockerMetadataStore(tempDir, nil)
newMeta := map[string]*DockerMetadata{
"c1": {Description: "C1", Tags: nil},
}
err := store.ReplaceAll(newMeta)
require.NoError(t, err)
assert.Equal(t, "C1", store.Get("c1").Description)
assert.NotNil(t, store.Get("c1").Tags)
}
func TestDockerMetadataStore_Load_Legacy(t *testing.T) {
tempDir := t.TempDir()
filePath := filepath.Join(tempDir, "docker_metadata.json")
// Legacy format: Top level map is containers
legacyContent := `{"c1": {"id": "c1", "description": "Legacy"}}`
require.NoError(t, os.WriteFile(filePath, []byte(legacyContent), 0644))
store := NewDockerMetadataStore(tempDir, nil)
assert.Equal(t, "Legacy", store.Get("c1").Description)
// Save should upgrade format
err := store.Set("c2", &DockerMetadata{ID: "c2", Description: "New"})
require.NoError(t, err)
// Check file content for "containers" key
content, err := os.ReadFile(filePath)
require.NoError(t, err)
assert.Contains(t, string(content), `"containers"`)
}
func TestDockerMetadataStore_Load_Versioned(t *testing.T) {
tempDir := t.TempDir()
filePath := filepath.Join(tempDir, "docker_metadata.json")
content := `{
"containers": {"c1": {"id": "c1"}},
"hosts": {"h1": {"customDisplayName": "H1"}}
}`
require.NoError(t, os.WriteFile(filePath, []byte(content), 0644))
store := NewDockerMetadataStore(tempDir, nil)
assert.NotNil(t, store.Get("c1"))
assert.NotNil(t, store.GetHostMetadata("h1"))
}
func TestDockerMetadataStore_Load_Error(t *testing.T) {
tempDir := t.TempDir()
filePath := filepath.Join(tempDir, "docker_metadata.json")
require.NoError(t, os.WriteFile(filePath, []byte("{invalid"), 0644))
store := NewDockerMetadataStore(tempDir, nil)
assert.NotNil(t, store)
err := store.Load()
assert.Error(t, err)
}
func TestDockerMetadataStore_Save_Error(t *testing.T) {
tempDir := t.TempDir()
badPath := filepath.Join(tempDir, "file")
require.NoError(t, os.WriteFile(badPath, []byte("content"), 0644))
store := NewDockerMetadataStore(tempDir, nil)
store.dataPath = badPath // hack
err := store.Set("c1", &DockerMetadata{ID: "c1"})
assert.Error(t, err)
}