mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-17 05:07:23 +08:00
### What problem does this PR solve? - Tools management - Pregel engine wrapper for better usage - UT race - Coding style ### Type of change - [x] Refactoring
202 lines
4.9 KiB
Go
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"])
|
|
}
|
|
}
|