Files
ragflow/internal/harness/graph/pregel/read_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

202 lines
4.9 KiB
Go

package pregel
import (
"context"
"testing"
"ragflow/internal/harness/graph/channels"
)
// ---- ChannelRead tests ----
// TestNewChannelRead_Defaults verifies default selector and transformer.
func TestNewChannelRead_Defaults(t *testing.T) {
reg := channels.NewRegistry()
cr := NewChannelRead(reg)
if cr == nil {
t.Fatal("expected non-nil ChannelRead")
}
_, ok := cr.selector.(*AllChannelsSelector)
if !ok {
t.Error("expected default AllChannelsSelector")
}
_, ok = cr.transformer.(*IdentityTransformer)
if !ok {
t.Error("expected default IdentityTransformer")
}
}
// TestChannelRead_WithOptions verifies option application.
func TestChannelRead_WithOptions(t *testing.T) {
reg := channels.NewRegistry()
cr := NewChannelRead(reg,
WithSelector(NewSpecificChannelsSelector("a")),
WithTransformer(NewMappingTransformer(map[string]string{"a": "b"})),
)
if cr == nil {
t.Fatal("expected non-nil")
}
}
// TestChannelRead_Read verifies reading from registered channels.
func TestChannelRead_Read(t *testing.T) {
reg := channels.NewRegistry()
ch := channels.NewLastValue("")
ch.SetKey("greeting")
ch.Update([]any{"hello"})
reg.Register("greeting", ch)
cr := NewChannelRead(reg)
values, err := cr.Read(context.Background())
if err != nil {
t.Fatalf("Read: %v", err)
}
if values["greeting"] != "hello" {
t.Errorf("expected 'hello', got %v", values["greeting"])
}
}
// TestChannelRead_EmptyRegistry verifies reading empty registry.
func TestChannelRead_EmptyRegistry(t *testing.T) {
reg := channels.NewRegistry()
cr := NewChannelRead(reg)
values, err := cr.Read(context.Background())
if err != nil {
t.Fatalf("Read: %v", err)
}
if len(values) != 0 {
t.Errorf("expected empty map, got %d entries", len(values))
}
}
// ---- Selectors ----
// TestAllChannelsSelector verifies selecting all registered channels.
func TestAllChannelsSelector(t *testing.T) {
reg := channels.NewRegistry()
ch1 := channels.NewLastValue("")
ch1.SetKey("a")
ch1.Update([]any{1})
ch2 := channels.NewLastValue("")
ch2.SetKey("b")
ch2.Update([]any{2})
reg.Register("a", ch1)
reg.Register("b", ch2)
sel := &AllChannelsSelector{}
names, err := sel.Select(reg)
if err != nil {
t.Fatalf("Select: %v", err)
}
if len(names) < 2 {
t.Errorf("expected at least 2 channel names, got %d", len(names))
}
}
// TestSpecificChannelsSelector verifies selecting specific channels.
func TestSpecificChannelsSelector(t *testing.T) {
reg := channels.NewRegistry()
ch1 := channels.NewLastValue("")
ch1.SetKey("target")
ch1.Update([]any{"data"})
ch2 := channels.NewLastValue("")
ch2.SetKey("other")
reg.Register("target", ch1)
reg.Register("other", ch2)
sel := NewSpecificChannelsSelector("target")
names, err := sel.Select(reg)
if err != nil {
t.Fatalf("Select: %v", err)
}
if len(names) != 1 || names[0] != "target" {
t.Errorf("expected ['target'], got %v", names)
}
}
// TestAvailableChannelsSelector verifies selecting available channels.
func TestAvailableChannelsSelector(t *testing.T) {
reg := channels.NewRegistry()
ch := channels.NewLastValue("")
ch.SetKey("active")
ch.Update([]any{"data"})
reg.Register("active", ch)
sel := &AvailableChannelsSelector{}
names, err := sel.Select(reg)
if err != nil {
t.Fatalf("Select: %v", err)
}
if len(names) == 0 {
t.Error("expected at least 1 available channel")
}
}
// TestPrefixChannelsSelector verifies prefix-based selection.
func TestPrefixChannelsSelector(t *testing.T) {
reg := channels.NewRegistry()
ch := channels.NewLastValue("")
ch.SetKey("pre_alpha")
ch.Update([]any{1})
reg.Register("pre_alpha", ch)
sel := NewPrefixChannelsSelector("pre_")
names, err := sel.Select(reg)
if err != nil {
t.Fatalf("Select: %v", err)
}
if len(names) == 0 {
t.Error("expected at least 1 prefixed channel")
}
}
// ---- Transformers ----
// TestIdentityTransformer verifies passthrough behavior.
func TestIdentityTransformer(t *testing.T) {
tf := &IdentityTransformer{}
input := map[string]any{"key": "value"}
result, err := tf.Transform(input)
if err != nil {
t.Fatalf("Transform: %v", err)
}
if result["key"] != "value" {
t.Errorf("expected 'value', got %v", result["key"])
}
}
// TestMappingTransformer verifies key mapping.
func TestMappingTransformer(t *testing.T) {
tf := NewMappingTransformer(map[string]string{"old": "new"})
input := map[string]any{"old": "data"}
result, err := tf.Transform(input)
if err != nil {
t.Fatalf("Transform: %v", err)
}
if result["new"] != "data" {
t.Errorf("expected 'data' under key 'new', got key=%v", result)
}
}
// TestFilterTransformer verifies filtering.
func TestFilterTransformer(t *testing.T) {
tf := NewFilterTransformer("keep")
input := map[string]any{"keep": "val", "remove": "ignored"}
result, err := tf.Transform(input)
if err != nil {
t.Fatalf("Transform: %v", err)
}
if _, ok := result["remove"]; ok {
t.Error("expected 'remove' to be filtered out")
}
if result["keep"] != "val" {
t.Errorf("expected 'val', got %v", result["keep"])
}
}