Pulse/internal/ai/tools/control_docker_helpers_test.go
rcourtman defe298ddd Refactor: AI provider and executor multi-tenancy support
- Updated AI providers and tests for context/tenant awareness
- Refactored tool executor for multi-tenant state handling
- Added new tests for Docker control and update tools
2026-01-22 16:51:45 +00:00

130 lines
3.7 KiB
Go

package tools
import (
"testing"
"github.com/rcourtman/pulse-go-rewrite/internal/agentexec"
"github.com/rcourtman/pulse-go-rewrite/internal/models"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestResolveDockerContainer(t *testing.T) {
t.Run("NoStateProvider", func(t *testing.T) {
exec := NewPulseToolExecutor(ExecutorConfig{})
_, _, err := exec.resolveDockerContainer("web", "")
require.Error(t, err)
assert.Contains(t, err.Error(), "state provider not available")
})
t.Run("HostMatch", func(t *testing.T) {
state := models.StateSnapshot{
DockerHosts: []models.DockerHost{
{
ID: "host1",
Hostname: "dock1",
Containers: []models.DockerContainer{
{ID: "abc123", Name: "web"},
},
},
},
}
exec := NewPulseToolExecutor(ExecutorConfig{StateProvider: &mockStateProvider{state: state}})
container, host, err := exec.resolveDockerContainer("web", "dock1")
require.NoError(t, err)
assert.Equal(t, "web", container.Name)
assert.Equal(t, "host1", host.ID)
})
t.Run("HostNotFound", func(t *testing.T) {
state := models.StateSnapshot{
DockerHosts: []models.DockerHost{
{
ID: "host1",
Hostname: "dock1",
Containers: []models.DockerContainer{
{ID: "abc123", Name: "web"},
},
},
},
}
exec := NewPulseToolExecutor(ExecutorConfig{StateProvider: &mockStateProvider{state: state}})
_, _, err := exec.resolveDockerContainer("web", "missing")
require.Error(t, err)
assert.Contains(t, err.Error(), "not found on host")
})
t.Run("MultipleHosts", func(t *testing.T) {
state := models.StateSnapshot{
DockerHosts: []models.DockerHost{
{
ID: "host1",
DisplayName: "Dock One",
Containers: []models.DockerContainer{
{ID: "abcdef", Name: "web"},
},
},
{
ID: "host2",
DisplayName: "Dock Two",
Containers: []models.DockerContainer{
{ID: "abc999", Name: "web"},
},
},
},
}
exec := NewPulseToolExecutor(ExecutorConfig{StateProvider: &mockStateProvider{state: state}})
_, _, err := exec.resolveDockerContainer("web", "")
require.Error(t, err)
assert.Contains(t, err.Error(), "multiple Docker hosts")
assert.Contains(t, err.Error(), "Dock One")
})
t.Run("IDPrefixMatch", func(t *testing.T) {
state := models.StateSnapshot{
DockerHosts: []models.DockerHost{
{
ID: "host1",
Hostname: "dock1",
Containers: []models.DockerContainer{
{ID: "abcdef", Name: "web"},
},
},
},
}
exec := NewPulseToolExecutor(ExecutorConfig{StateProvider: &mockStateProvider{state: state}})
container, _, err := exec.resolveDockerContainer("abc", "")
require.NoError(t, err)
assert.Equal(t, "abcdef", container.ID)
})
}
func TestGetAgentHostnameForDockerHost(t *testing.T) {
t.Run("NoAgentServer", func(t *testing.T) {
exec := NewPulseToolExecutor(ExecutorConfig{})
host := &models.DockerHost{Hostname: "dock1"}
assert.Equal(t, "dock1", exec.getAgentHostnameForDockerHost(host))
})
t.Run("AgentIDMatch", func(t *testing.T) {
agentSrv := &mockAgentServer{agents: []agentexec.ConnectedAgent{
{AgentID: "agent1", Hostname: "node1"},
}}
exec := NewPulseToolExecutor(ExecutorConfig{AgentServer: agentSrv})
host := &models.DockerHost{AgentID: "agent1", Hostname: "dock1"}
assert.Equal(t, "node1", exec.getAgentHostnameForDockerHost(host))
})
t.Run("FallbackHostname", func(t *testing.T) {
agentSrv := &mockAgentServer{agents: []agentexec.ConnectedAgent{
{AgentID: "agent2", Hostname: "node2"},
}}
exec := NewPulseToolExecutor(ExecutorConfig{AgentServer: agentSrv})
host := &models.DockerHost{AgentID: "agent1", Hostname: "dock1"}
assert.Equal(t, "dock1", exec.getAgentHostnameForDockerHost(host))
})
}