feat: import agents_and_robots platform as unibots (Matrix-out, unibus transport)
Reemplaza el scaffold del echobot por la plataforma completa de bots traida desde ~/DataProyects/Github/agents_and_robots tras la operacion Matrix-out: los bots ya no hablan por Matrix sino por el bus unibus (modelo todo-rooms + E2E via shell/transportunibus sobre github.com/enmanuel/unibus/pkg/client). - go.mod: replace de unibus -> ../unibus y de fn-registry -> ../../../.. (paths relativos reajustados a la nueva ubicacion dentro de fn_registry). - app.md: bump a 0.2.0, descripcion + arquitectura + comandos + gotchas reales. - modulo Go conservado como github.com/enmanuel/agents (sin reescribir imports). agents_and_robots queda archivado como museo de la era Matrix.
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package skills
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestExecutor(t *testing.T) {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
// Create a simple bash script
|
||||
scriptPath := filepath.Join(tmpDir, "test.sh")
|
||||
scriptContent := `#!/bin/bash
|
||||
echo "Hello from script"
|
||||
echo "Args: $@"
|
||||
`
|
||||
if err := os.WriteFile(scriptPath, []byte(scriptContent), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create a script that times out
|
||||
timeoutScriptPath := filepath.Join(tmpDir, "timeout.sh")
|
||||
timeoutContent := `#!/bin/bash
|
||||
sleep 10
|
||||
`
|
||||
if err := os.WriteFile(timeoutScriptPath, []byte(timeoutContent), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create a failing script
|
||||
failScriptPath := filepath.Join(tmpDir, "fail.sh")
|
||||
failContent := `#!/bin/bash
|
||||
exit 1
|
||||
`
|
||||
if err := os.WriteFile(failScriptPath, []byte(failContent), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
executor := NewExecutor([]string{"bash", "sh"}, 2*time.Second)
|
||||
|
||||
// Test successful execution
|
||||
t.Run("successful_execution", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
output, err := executor.Run(ctx, scriptPath, []string{"arg1", "arg2"})
|
||||
if err != nil {
|
||||
t.Fatalf("Run failed: %v", err)
|
||||
}
|
||||
|
||||
if !strings.Contains(output, "Hello from script") {
|
||||
t.Errorf("expected 'Hello from script' in output, got: %q", output)
|
||||
}
|
||||
|
||||
if !strings.Contains(output, "Args: arg1 arg2") {
|
||||
t.Errorf("expected 'Args: arg1 arg2' in output, got: %q", output)
|
||||
}
|
||||
})
|
||||
|
||||
// Test timeout
|
||||
t.Run("timeout", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
_, err := executor.Run(ctx, timeoutScriptPath, nil)
|
||||
if err == nil {
|
||||
t.Error("expected timeout error")
|
||||
}
|
||||
|
||||
if !strings.Contains(err.Error(), "timeout") {
|
||||
t.Errorf("expected timeout error, got: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
// Test script failure
|
||||
t.Run("script_failure", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
_, err := executor.Run(ctx, failScriptPath, nil)
|
||||
if err == nil {
|
||||
t.Error("expected script failure error")
|
||||
}
|
||||
})
|
||||
|
||||
// Test disallowed interpreter
|
||||
t.Run("disallowed_interpreter", func(t *testing.T) {
|
||||
pyScriptPath := filepath.Join(tmpDir, "test.py")
|
||||
pyContent := `#!/usr/bin/env python3
|
||||
print("hello")
|
||||
`
|
||||
if err := os.WriteFile(pyScriptPath, []byte(pyContent), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
_, err := executor.Run(ctx, pyScriptPath, nil)
|
||||
if err == nil {
|
||||
t.Error("expected error for disallowed interpreter")
|
||||
}
|
||||
|
||||
if !strings.Contains(err.Error(), "not allowed") {
|
||||
t.Errorf("expected 'not allowed' error, got: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
// Test allowed python interpreter
|
||||
t.Run("allowed_python", func(t *testing.T) {
|
||||
pyExecutor := NewExecutor([]string{"python3"}, 2*time.Second)
|
||||
|
||||
pyScriptPath := filepath.Join(tmpDir, "hello.py")
|
||||
pyContent := `#!/usr/bin/env python3
|
||||
print("Hello from Python")
|
||||
`
|
||||
if err := os.WriteFile(pyScriptPath, []byte(pyContent), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
output, err := pyExecutor.Run(ctx, pyScriptPath, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Run failed: %v", err)
|
||||
}
|
||||
|
||||
if !strings.Contains(output, "Hello from Python") {
|
||||
t.Errorf("expected 'Hello from Python' in output, got: %q", output)
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user