Files
osmedeus/internal/functions/ssh_functions_test.go
T
j3ssie baac7a016a feat: add worker management, hooks support, and db cleanup enhancements
- Add worker eval command for distributed function execution with Redis hooks registration
- Add worker set command to update worker fields (alias, public-ip, ssh-enabled, ssh-keys-path)
- Enhance worker status with JSON output, search filtering, and column selection (--columns, --exclude-columns, --search)
- Add --keep-setting flag to install base/validate commands to preserve osm-settings.yaml after base installation
- Fix binary installation in Nix: replace CopyInstalledBinaryToFolder with SymlinkInstalledBinaryToFolder
- Add --clean-ws flag to db clean command for removing workspace data
- Add HooksEnabled field to Run records when creating runs from CLI and API
- Add comprehensive test coverage for hook execution (pre/post hooks, execution order, failure handling)
- Add test coverage for worker commands (eval, set, status with JSON) and db clean operations
- Improve usage documentation for worker subcommands and db operations
2026-02-15 10:47:44 +07:00

294 lines
6.7 KiB
Go

package functions
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// --- ssh_exec input validation tests ---
func TestSSHExec_EmptyHost(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_exec("", "whoami")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, "", result)
}
func TestSSHExec_UndefinedHost(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_exec(undefined, "whoami")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, "", result)
}
func TestSSHExec_EmptyCommand(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_exec("10.0.0.1", "")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, "", result)
}
func TestSSHExec_UndefinedCommand(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_exec("10.0.0.1")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, "", result)
}
func TestSSHExec_NoArgs(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_exec()`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, "", result)
}
// --- ssh_rsync input validation tests ---
func TestSSHRsync_EmptyHost(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_rsync("", "/tmp/src", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSSHRsync_UndefinedHost(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_rsync(undefined, "/tmp/src", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSSHRsync_EmptySrc(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_rsync("10.0.0.1", "", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSSHRsync_EmptyDest(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_rsync("10.0.0.1", "/tmp/src", "")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSSHRsync_NoArgs(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`ssh_rsync()`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
// --- parseSSHConfig tests ---
func TestSSHExec_DefaultUserAndPort(t *testing.T) {
// When only host and command are provided, defaults should be used (user=root, port=22)
// This will fail to connect but validates that defaults don't cause panics
registry := NewRegistry()
result, err := registry.Execute(
`ssh_exec("192.0.2.1", "echo test")`,
map[string]interface{}{},
)
require.NoError(t, err)
// Connection to unreachable host will fail, returns empty string
assert.Equal(t, "", result)
}
// --- sync_from_master input validation tests ---
func TestSyncFromMaster_EmptySrc(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_master("", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSyncFromMaster_EmptyDest(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_master("/tmp/src", "")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSyncFromMaster_NoArgs(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_master()`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
// --- sync_from_worker input validation tests ---
func TestSyncFromWorker_EmptyIdentifier(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_worker("", "10.0.0.2", "/tmp/src", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSyncFromWorker_EmptySrc(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_worker("worker-1", "10.0.0.2", "", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSyncFromWorker_EmptyDest(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_worker("worker-1", "10.0.0.2", "/tmp/src", "")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSyncFromWorker_NoArgs(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_worker()`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestSyncFromWorker_NoHost(t *testing.T) {
// No SSH hooks registered and no explicit IP -> no host resolved
registry := NewRegistry()
result, err := registry.Execute(
`sync_from_worker("worker-1", "", "/tmp/src", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
// --- rsync_to_worker input validation tests ---
func TestRsyncToWorker_EmptyIdentifier(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`rsync_to_worker("", "10.0.0.2", "/tmp/src", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestRsyncToWorker_EmptySrc(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`rsync_to_worker("worker-1", "10.0.0.2", "", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestRsyncToWorker_EmptyDest(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`rsync_to_worker("worker-1", "10.0.0.2", "/tmp/src", "")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestRsyncToWorker_NoArgs(t *testing.T) {
registry := NewRegistry()
result, err := registry.Execute(
`rsync_to_worker()`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
func TestRsyncToWorker_NoHost(t *testing.T) {
// No SSH hooks registered and no explicit IP -> no host resolved
registry := NewRegistry()
result, err := registry.Execute(
`rsync_to_worker("worker-1", "", "/tmp/src", "/tmp/dest")`,
map[string]interface{}{},
)
require.NoError(t, err)
assert.Equal(t, false, result)
}
// NOTE: Integration tests for ssh_exec, ssh_rsync, and sync functions against
// a real SSH server are in the e2e test suite (test-e2e-ssh). Unit tests here
// only validate input validation since connecting to a real host would be slow/flaky.