Files
osmedeus/internal/executor/platform_test.go
T
j3ssie 0269cf4e26 feat: update Next.js build assets and add cloud setup E2E tests
- Update Next.js generated chunk hashes and build IDs reflecting latest dashboard build
- Update CSS stylesheet references in workflow upload page metadata
- Add comprehensive cloud setup E2E test suite (cloud_setup_test.go) with SSH password/key auth, post-command variable expansion, and Ansible integration
- Fix API priority levels to include 'medium' priority in test coverage
- Add agent-sdk test workflows (minimal, config, codex, multi-agent, session variants)
- Update E2E test utilities with runCLIInBase helper for multi-step cloud config tests
- Fix stderr/stdout capture in dependencies_target_types_test assertions
2026-04-04 13:57:34 +08:00

202 lines
5.5 KiB
Go

package executor
import (
"runtime"
"testing"
"github.com/j3ssie/osmedeus/v5/internal/config"
"github.com/j3ssie/osmedeus/v5/internal/core"
"github.com/j3ssie/osmedeus/v5/internal/template"
)
func TestDetectDocker(t *testing.T) {
result := DetectDocker()
// On a non-Docker environment, this should be false
t.Logf("DetectDocker() = %v", result)
// This is primarily a smoke test - we just verify it doesn't panic
}
func TestDetectKubernetes(t *testing.T) {
result := DetectKubernetes()
// On a non-Kubernetes environment, this should be false
t.Logf("DetectKubernetes() = %v", result)
// This is primarily a smoke test - we just verify it doesn't panic
}
func TestDetectCloudProvider(t *testing.T) {
result := DetectCloudProvider()
t.Logf("DetectCloudProvider() = %s", result)
// On a local machine, this should be "on-prem"
// This is primarily a smoke test - we just verify it doesn't panic
}
func TestPlatformVariables(t *testing.T) {
// Verify that runtime.GOOS and runtime.GOARCH return expected values
t.Logf("runtime.GOOS = %s", runtime.GOOS)
t.Logf("runtime.GOARCH = %s", runtime.GOARCH)
// Verify they are not empty
if runtime.GOOS == "" {
t.Error("runtime.GOOS is empty")
}
if runtime.GOARCH == "" {
t.Error("runtime.GOARCH is empty")
}
}
func TestPlatformVariablesInjection(t *testing.T) {
// Create a minimal config
cfg := &config.Config{
BaseFolder: "/tmp",
BinariesPath: "/tmp/bin",
DataPath: "/tmp/data",
WorkspacesPath: "/tmp/workspaces",
}
// Create execution context
execCtx := core.NewExecutionContext("test-workflow", core.KindModule, "test-run-uuid", "example.com")
// Create executor and inject variables
e := NewExecutor()
params := map[string]string{
"target": "example.com",
}
e.injectBuiltinVariables(cfg, params, execCtx)
// Verify platform variables are set
tests := []struct {
name string
expected interface{}
}{
{"PlatformOS", runtime.GOOS},
{"PlatformArch", runtime.GOARCH},
{"PlatformInDocker", DetectDocker()},
{"PlatformInKubernetes", DetectKubernetes()},
{"PlatformCloudProvider", DetectCloudProvider()},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
val, ok := execCtx.GetVariable(tt.name)
if !ok {
t.Errorf("variable %s not found in execution context", tt.name)
return
}
if val != tt.expected {
t.Errorf("variable %s = %v, expected %v", tt.name, val, tt.expected)
}
t.Logf("%s = %v", tt.name, val)
})
}
// Verify variables are in GetVariables() output
allVars := execCtx.GetVariables()
for _, tt := range tests {
if _, ok := allVars[tt.name]; !ok {
t.Errorf("variable %s not found in GetVariables() output", tt.name)
}
}
}
func TestPlatformVariablesTemplateRendering(t *testing.T) {
// Create a minimal config
cfg := &config.Config{
BaseFolder: "/tmp",
BinariesPath: "/tmp/bin",
DataPath: "/tmp/data",
WorkspacesPath: "/tmp/workspaces",
}
// Create execution context
execCtx := core.NewExecutionContext("test-workflow", core.KindModule, "test-run-uuid", "example.com")
// Create executor and inject variables
e := NewExecutor()
params := map[string]string{
"target": "example.com",
}
e.injectBuiltinVariables(cfg, params, execCtx)
// Create template engine and test rendering
engine := template.NewEngine()
vars := execCtx.GetVariables()
// Debug: print all variables
t.Logf("Total variables: %d", len(vars))
for k, v := range vars {
if k == "PlatformOS" || k == "PlatformArch" || k == "PlatformInDocker" || k == "PlatformInKubernetes" || k == "PlatformCloudProvider" {
t.Logf("Variable %s = %v (type: %T)", k, v, v)
}
}
tests := []struct {
template string
expected string
}{
{"echo {{PlatformOS}}", "echo " + runtime.GOOS},
{"echo {{PlatformArch}}", "echo " + runtime.GOARCH},
{"echo {{PlatformInDocker}}", "echo false"},
{"echo {{PlatformInKubernetes}}", "echo false"},
{"echo {{PlatformCloudProvider}}", "echo " + DetectCloudProvider()},
}
for _, tt := range tests {
t.Run(tt.template, func(t *testing.T) {
result, err := engine.Render(tt.template, vars)
if err != nil {
t.Errorf("error rendering template %q: %v", tt.template, err)
return
}
if result != tt.expected {
t.Errorf("render(%q) = %q, expected %q", tt.template, result, tt.expected)
}
t.Logf("render(%q) = %q", tt.template, result)
})
}
}
func TestPlatformVariablesWithStepDispatcher(t *testing.T) {
// Create a minimal config
cfg := &config.Config{
BaseFolder: "/tmp",
BinariesPath: "/tmp/bin",
DataPath: "/tmp/data",
WorkspacesPath: "/tmp/workspaces",
}
// Create execution context
execCtx := core.NewExecutionContext("test-workflow", core.KindModule, "test-run-uuid", "example.com")
// Create executor and inject variables
e := NewExecutor()
params := map[string]string{
"target": "example.com",
}
e.injectBuiltinVariables(cfg, params, execCtx)
// Get the step dispatcher
dispatcher := NewStepDispatcher()
// Create a test step
step := &core.Step{
Name: "test-platform-step",
Type: core.StepTypeBash,
Command: "echo {{PlatformOS}} {{PlatformArch}}",
}
// Get the template engine from dispatcher and render
vars := execCtx.GetVariables()
engine := dispatcher.GetTemplateEngine()
result, err := engine.Render(step.Command, vars)
if err != nil {
t.Fatalf("Failed to render command: %v", err)
}
expected := "echo " + runtime.GOOS + " " + runtime.GOARCH
if result != expected {
t.Errorf("Rendered command = %q, expected %q", result, expected)
}
t.Logf("Rendered command: %q", result)
}