Files
ragflow/internal/harness/graph/managed/managed_test.go
Yingfeng 706e0d2d06 Refactor harness framework (#16271)
### What problem does this PR solve?

- Tools management
- Pregel engine wrapper for better usage
- UT race
- Coding style

### Type of change

- [x] Refactoring
2026-06-23 20:18:04 +08:00

314 lines
7.1 KiB
Go

// Package managed tests managed value functionality.
package managed
import (
"testing"
)
func TestIsManagedValue(t *testing.T) {
isLastStep := NewIsLastStep()
if !IsManagedValue(isLastStep) {
t.Error("IsLastStep should be a managed value")
}
if IsManagedValue("not a managed value") {
t.Error("String should not be a managed value")
}
if IsManagedValue(nil) {
t.Error("Nil should not be a managed value")
}
}
func TestManagedValueSpec(t *testing.T) {
spec := NewManagedValueSpec(
"TestValue",
func() ManagedValue { return NewIsLastStep() },
"default",
)
if spec.Name != "TestValue" {
t.Errorf("Expected name 'TestValue', got '%s'", spec.Name)
}
if spec.Default != "default" {
t.Errorf("Expected default 'default', got '%v'", spec.Default)
}
if spec.Factory == nil {
t.Error("Factory should not be nil")
}
}
func TestIsManagedValueSpec(t *testing.T) {
spec := NewManagedValueSpec(
"TestValue",
func() ManagedValue { return NewIsLastStep() },
nil,
)
if !IsManagedValueSpec(spec) {
t.Error("ManagedValueSpec should be recognized")
}
if IsManagedValueSpec("not a spec") {
t.Error("String should not be a managed value spec")
}
}
func TestIsValueManaged(t *testing.T) {
isLastStep := NewIsLastStep()
spec := NewManagedValueSpec("test", func() ManagedValue { return NewIsLastStep() }, nil)
tests := []struct {
name string
value interface{}
expected bool
}{
{"IsLastStep", isLastStep, true},
{"Spec", spec, true},
{"String", "test", false},
{"Nil", nil, false},
{"Number", 42, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if result := IsValueManaged(tt.value); result != tt.expected {
t.Errorf("IsValueManaged(%v) = %v, expected %v", tt.value, result, tt.expected)
}
})
}
}
func TestGetManagedValueName(t *testing.T) {
isLastStep := NewIsLastStep()
spec := NewManagedValueSpec("CustomSpec", func() ManagedValue { return NewIsLastStep() }, nil)
tests := []struct {
name string
value interface{}
expected string
}{
{"IsLastStep", isLastStep, "IsLastStep"},
{"Spec", spec, "CustomSpec"},
{"Nil", nil, ""},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if result := GetManagedValueName(tt.value); result != tt.expected {
t.Errorf("GetManagedValueName(%v) = %v, expected %v", tt.value, result, tt.expected)
}
})
}
}
func TestCurrentStep(t *testing.T) {
currentStep := NewCurrentStep()
// Test default value
if currentStep.Value != 0 {
t.Errorf("Expected initial value 0, got %d", currentStep.Value)
}
// Test Name
if currentStep.Name() != "CurrentStep" {
t.Errorf("Expected name 'CurrentStep', got '%s'", currentStep.Name())
}
// Test Set
currentStep.Set(5)
if currentStep.Value != 5 {
t.Errorf("Expected value 5 after Set, got %d", currentStep.Value)
}
// Test Increment
currentStep.Increment()
if currentStep.Value != 6 {
t.Errorf("Expected value 6 after Increment, got %d", currentStep.Value)
}
// Test Copy
copied := currentStep.Copy().(*CurrentStep)
if copied.Value != 6 {
t.Errorf("Expected copied value 6, got %d", copied.Value)
}
// Verify they are independent
currentStep.Value = 10
if copied.Value != 6 {
t.Errorf("Copied value should remain 6, got %d", copied.Value)
}
}
func TestConfigValue(t *testing.T) {
configValue := NewConfigValue("api_key", "default_key")
// Test with empty scratchpad
val, err := configValue.Get(nil)
if err != nil {
t.Errorf("Get should not error on empty scratchpad: %v", err)
}
if val != "default_key" {
t.Errorf("Expected default value 'default_key', got '%v'", val)
}
// Test with scratchpad containing configurable
scratchpad := map[string]interface{}{
"configurable": map[string]interface{}{
"api_key": "custom_key",
},
}
val, err = configValue.Get(scratchpad)
if err != nil {
t.Errorf("Get should not error: %v", err)
}
if val != "custom_key" {
t.Errorf("Expected value 'custom_key', got '%v'", val)
}
// Test Name
name := configValue.Name()
expectedName := "ConfigValue[api_key]"
if name != expectedName {
t.Errorf("Expected name '%s', got '%s'", expectedName, name)
}
// Test Copy
copied := configValue.Copy().(*ConfigValue)
if copied.Key != "api_key" {
t.Errorf("Expected copied key 'api_key', got '%s'", copied.Key)
}
}
func TestTaskID(t *testing.T) {
taskID := NewTaskID()
// Test default value
if taskID.Value != "" {
t.Errorf("Expected empty string, got '%s'", taskID.Value)
}
// Test with scratchpad containing task_id
scratchpad := map[string]interface{}{
"task_id": "task-123",
}
val, err := taskID.Get(scratchpad)
if err != nil {
t.Errorf("Get should not error: %v", err)
}
if val != "task-123" {
t.Errorf("Expected value 'task-123', got '%v'", val)
}
// Test Name
if taskID.Name() != "TaskID" {
t.Errorf("Expected name 'TaskID', got '%s'", taskID.Name())
}
}
func TestNodeName(t *testing.T) {
nodeName := NewNodeName()
// Test default value
if nodeName.Value != "" {
t.Errorf("Expected empty string, got '%s'", nodeName.Value)
}
// Test with scratchpad containing node_name
scratchpad := map[string]interface{}{
"node_name": "agent_node",
}
val, err := nodeName.Get(scratchpad)
if err != nil {
t.Errorf("Get should not error: %v", err)
}
if val != "agent_node" {
t.Errorf("Expected value 'agent_node', got '%v'", val)
}
// Test Name
if nodeName.Name() != "NodeName" {
t.Errorf("Expected name 'NodeName', got '%s'", nodeName.Name())
}
}
func TestManagedValueGetValue(t *testing.T) {
spec := NewManagedValueSpec(
"TestValue",
func() ManagedValue {
mv := NewCurrentStep()
mv.Value = 42
return mv
},
"default",
)
// Test with empty scratchpad - should return default
val := spec.GetValue(nil)
if val != "default" {
t.Errorf("Expected default value 'default', got '%v'", val)
}
// Test Create
mv := spec.Create()
if mv == nil {
t.Error("Create should return a managed value")
}
currentStep, ok := mv.(*CurrentStep)
if !ok {
t.Error("Create should return a CurrentStep")
}
if currentStep.Value != 42 {
t.Errorf("Expected value 42, got %d", currentStep.Value)
}
}
type TestStruct struct {
ManagedField ManagedValue
SpecField *ManagedValueSpec
NormalField string
NilField interface{}
}
func TestExtractManagedValues(t *testing.T) {
testStruct := TestStruct{
ManagedField: NewIsLastStep(),
SpecField: NewManagedValueSpec("test", func() ManagedValue { return NewCurrentStep() }, nil),
NormalField: "normal",
NilField: nil,
}
values := ExtractManagedValues(&testStruct)
if len(values) != 1 {
t.Errorf("Expected 1 managed value, got %d", len(values))
}
if values[0].Name() != "IsLastStep" {
t.Errorf("Expected IsLastStep, got %s", values[0].Name())
}
}
func TestExtractManagedValueSpecs(t *testing.T) {
testStruct := TestStruct{
ManagedField: NewIsLastStep(),
SpecField: NewManagedValueSpec("test", func() ManagedValue { return NewCurrentStep() }, nil),
NormalField: "normal",
NilField: nil,
}
specs := ExtractManagedValueSpecs(&testStruct)
if len(specs) != 1 {
t.Errorf("Expected 1 managed value spec, got %d", len(specs))
}
if specs[0].Name != "test" {
t.Errorf("Expected name 'test', got %s", specs[0].Name)
}
}