Files
osmedeus/internal/core/override_test.go
T
j3ssie f5840272c5 feat: add run cancellation, event enhancements, and performance optimizations
Major features:
- Add run registry for tracking active runs with PID management
- Add API-based run cancellation with process termination
- Add event trigger input vars syntax for multi-variable extraction
- Add filter_functions with utility function support in triggers
- Add event envelope injection for full event context in workflows
- Add write coordinator for batched database operations

API improvements:
- Add logout endpoint and diffs endpoints for assets/vulnerabilities
- Add step-results listing endpoint
- Update schedule model with target, workspace, params fields
- Change run_id to run_uuid across API responses

Performance:
- Add compiled JS program caching for 60-80% faster loop conditions
- Add parallel shard rendering for 20-40% faster workflow startup
- Add memory-mapped I/O for large file line counting
- Add efficient output buffer combining in runners
- Add mtime-based cache invalidation for workflow loader

Other changes:
- Rename trigger field from trigger to triggers in workflow YAML
- Disable pongo2 HTML autoescape for shell command templates
- Update JWT expiration default to 1440 minutes (1 day)
- Change CORS default to reflect-origin for credentials support
- Add source_type field to events (run, eval, api)
- Skip copying core Unix tools to external-binaries
2026-01-24 01:11:33 +08:00

223 lines
4.9 KiB
Go

package core
import (
"testing"
"github.com/goccy/go-yaml"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestParamOverrideUnmarshalYAML(t *testing.T) {
tests := []struct {
name string
input string
wantDefault any
wantType *string
wantReq *bool
wantGen *string
wantErr bool
}{
{
name: "shorthand string",
input: `"hello"`,
wantDefault: "hello",
},
{
name: "shorthand bool true",
input: `true`,
wantDefault: true,
},
{
name: "shorthand bool false",
input: `false`,
wantDefault: false,
},
{
name: "shorthand int",
input: `42`,
wantDefault: 42,
},
{
name: "shorthand float",
input: `3.14`,
wantDefault: 3.14,
},
{
name: "shorthand nil",
input: `null`,
wantDefault: nil,
},
{
name: "verbose default only",
input: `default: "verbose-value"`,
wantDefault: "verbose-value",
},
{
name: "verbose with type",
input: "default: \"value\"\ntype: \"string\"",
wantDefault: "value",
wantType: ptr("string"),
},
{
name: "verbose with required",
input: "default: \"value\"\nrequired: true",
wantDefault: "value",
wantReq: ptr(true),
},
{
name: "verbose with generator",
input: "default: \"value\"\ngenerator: \"uuid()\"",
wantDefault: "value",
wantGen: ptr("uuid()"),
},
{
name: "verbose full struct",
input: "default: \"full\"\ntype: \"string\"\nrequired: true\ngenerator: \"gen()\"",
wantDefault: "full",
wantType: ptr("string"),
wantReq: ptr(true),
wantGen: ptr("gen()"),
},
{
name: "verbose bool default",
input: `default: false`,
wantDefault: false,
},
{
name: "verbose int default",
input: `default: 100`,
wantDefault: 100,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var p ParamOverride
err := yaml.Unmarshal([]byte(tt.input), &p)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
assert.Equal(t, tt.wantDefault, p.Default)
assert.Equal(t, tt.wantType, p.Type)
assert.Equal(t, tt.wantReq, p.Required)
assert.Equal(t, tt.wantGen, p.Generator)
})
}
}
func TestParamOverrideMapUnmarshalYAML(t *testing.T) {
tests := []struct {
name string
input string
want map[string]*ParamOverride
wantErr bool
}{
{
name: "mixed shorthand and verbose",
input: `
param-a: "shorthand-value"
param-b:
default: "verbose-value"
type: "string"
param-c: false
param-d: 42
`,
want: map[string]*ParamOverride{
"param-a": {Default: "shorthand-value"},
"param-b": {Default: "verbose-value", Type: ptr("string")},
"param-c": {Default: false},
"param-d": {Default: 42},
},
},
{
name: "all shorthand",
input: `
name: "test"
enabled: true
count: 5
`,
want: map[string]*ParamOverride{
"name": {Default: "test"},
"enabled": {Default: true},
"count": {Default: 5},
},
},
{
name: "all verbose",
input: `
param-a:
default: "value-a"
required: true
param-b:
default: "value-b"
generator: "gen()"
`,
want: map[string]*ParamOverride{
"param-a": {Default: "value-a", Required: ptr(true)},
"param-b": {Default: "value-b", Generator: ptr("gen()")},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var result map[string]*ParamOverride
err := yaml.Unmarshal([]byte(tt.input), &result)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, len(tt.want), len(result))
for k, want := range tt.want {
got, ok := result[k]
require.True(t, ok, "missing key %s", k)
assert.Equal(t, want.Default, got.Default, "key %s: Default mismatch", k)
assert.Equal(t, want.Type, got.Type, "key %s: Type mismatch", k)
assert.Equal(t, want.Required, got.Required, "key %s: Required mismatch", k)
assert.Equal(t, want.Generator, got.Generator, "key %s: Generator mismatch", k)
}
})
}
}
func TestWorkflowOverrideParamsUnmarshalYAML(t *testing.T) {
input := `
params:
param-a: "shorthand"
param-b:
default: "verbose"
type: "string"
steps:
mode: append
`
var override WorkflowOverride
err := yaml.Unmarshal([]byte(input), &override)
require.NoError(t, err)
require.NotNil(t, override.Params)
require.Len(t, override.Params, 2)
assert.Equal(t, "shorthand", override.Params["param-a"].Default)
assert.Equal(t, "verbose", override.Params["param-b"].Default)
require.NotNil(t, override.Params["param-b"].Type)
assert.Equal(t, "string", *override.Params["param-b"].Type)
require.NotNil(t, override.Steps)
assert.Equal(t, OverrideModeAppend, override.Steps.Mode)
}
// ptr is a helper to create a pointer to a value
func ptr[T any](v T) *T {
return &v
}