mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-02-13 15:34:59 -05:00
185 lines
4.6 KiB
Go
185 lines
4.6 KiB
Go
package template
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// TestExtensionManager is the main test suite for ExtensionManager
|
|
func TestExtensionManager(t *testing.T) {
|
|
// Create temporary directory for tests
|
|
tmpDir, err := os.MkdirTemp("", "fabric-ext-test-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
// Create test extension config
|
|
testConfig := filepath.Join(tmpDir, "test-extension.yaml")
|
|
testScript := filepath.Join(tmpDir, "test-script.sh")
|
|
|
|
// Create test script
|
|
scriptContent := `#!/bin/bash
|
|
if [ "$1" = "echo" ]; then
|
|
echo "Hello, $2!"
|
|
fi`
|
|
|
|
err = os.WriteFile(testScript, []byte(scriptContent), 0755)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create test script: %v", err)
|
|
}
|
|
|
|
// Create test config
|
|
configContent := `name: test-extension
|
|
executable: ` + testScript + `
|
|
type: executable
|
|
timeout: 30s
|
|
description: "Test extension"
|
|
version: "1.0.0"
|
|
operations:
|
|
echo:
|
|
cmd_template: "{{executable}} echo {{1}}"
|
|
`
|
|
|
|
err = os.WriteFile(testConfig, []byte(configContent), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create test config: %v", err)
|
|
}
|
|
|
|
// Initialize manager
|
|
manager := NewExtensionManager(tmpDir)
|
|
|
|
// Test cases
|
|
t.Run("RegisterExtension", func(t *testing.T) {
|
|
err := manager.RegisterExtension(testConfig)
|
|
if err != nil {
|
|
t.Errorf("Failed to register extension: %v", err)
|
|
}
|
|
})
|
|
|
|
t.Run("ListExtensions", func(t *testing.T) {
|
|
err := manager.ListExtensions()
|
|
if err != nil {
|
|
t.Errorf("Failed to list extensions: %v", err)
|
|
}
|
|
// Note: Output validation would require capturing stdout
|
|
})
|
|
|
|
t.Run("ProcessExtension", func(t *testing.T) {
|
|
output, err := manager.ProcessExtension("test-extension", "echo", "World")
|
|
if err != nil {
|
|
t.Errorf("Failed to process extension: %v", err)
|
|
}
|
|
expected := "Hello, World!\n"
|
|
if output != expected {
|
|
t.Errorf("Expected output %q, got %q", expected, output)
|
|
}
|
|
})
|
|
|
|
t.Run("RemoveExtension", func(t *testing.T) {
|
|
err := manager.RemoveExtension("test-extension")
|
|
if err != nil {
|
|
t.Errorf("Failed to remove extension: %v", err)
|
|
}
|
|
|
|
// Verify extension is removed by trying to process it
|
|
_, err = manager.ProcessExtension("test-extension", "echo", "World")
|
|
if err == nil {
|
|
t.Error("Expected error processing removed extension, got nil")
|
|
}
|
|
})
|
|
}
|
|
|
|
// TestExtensionManagerErrors tests error cases
|
|
func TestExtensionManagerErrors(t *testing.T) {
|
|
tmpDir, err := os.MkdirTemp("", "fabric-ext-test-errors-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
manager := NewExtensionManager(tmpDir)
|
|
|
|
t.Run("RegisterNonexistentConfig", func(t *testing.T) {
|
|
err := manager.RegisterExtension("/nonexistent/config.yaml")
|
|
if err == nil {
|
|
t.Error("Expected error registering nonexistent config, got nil")
|
|
}
|
|
})
|
|
|
|
t.Run("ProcessNonexistentExtension", func(t *testing.T) {
|
|
_, err := manager.ProcessExtension("nonexistent", "echo", "test")
|
|
if err == nil {
|
|
t.Error("Expected error processing nonexistent extension, got nil")
|
|
}
|
|
})
|
|
|
|
t.Run("RemoveNonexistentExtension", func(t *testing.T) {
|
|
err := manager.RemoveExtension("nonexistent")
|
|
if err == nil {
|
|
t.Error("Expected error removing nonexistent extension, got nil")
|
|
}
|
|
})
|
|
}
|
|
|
|
// TestExtensionManagerWithInvalidConfig tests handling of invalid configurations
|
|
func TestExtensionManagerWithInvalidConfig(t *testing.T) {
|
|
tmpDir, err := os.MkdirTemp("", "fabric-ext-test-invalid-*")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create temp directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
invalidConfig := filepath.Join(tmpDir, "invalid-extension.yaml")
|
|
|
|
// Test cases with different invalid configurations
|
|
testCases := []struct {
|
|
name string
|
|
config string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "MissingExecutable",
|
|
config: `name: invalid-extension
|
|
type: executable
|
|
timeout: 30s`,
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "InvalidTimeout",
|
|
config: `name: invalid-extension
|
|
executable: /bin/echo
|
|
type: executable
|
|
timeout: invalid`,
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "EmptyName",
|
|
config: `name: ""
|
|
executable: /bin/echo
|
|
type: executable
|
|
timeout: 30s`,
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
manager := NewExtensionManager(tmpDir)
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
err := os.WriteFile(invalidConfig, []byte(tc.config), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create invalid config file: %v", err)
|
|
}
|
|
|
|
err = manager.RegisterExtension(invalidConfig)
|
|
if tc.wantErr && err == nil {
|
|
t.Error("Expected error registering invalid config, got nil")
|
|
} else if !tc.wantErr && err != nil {
|
|
t.Errorf("Unexpected error registering config: %v", err)
|
|
}
|
|
})
|
|
}
|
|
}
|