Files
cc-connect/agent/iflow/iflow_integration_test.go
T
2026-06-02 23:14:41 +08:00

95 lines
2.3 KiB
Go

package iflow
import (
"context"
"fmt"
"os"
"os/exec"
"strings"
"testing"
"time"
"github.com/chenhg5/cc-connect/core"
)
func TestIFlowSessionIntegration(t *testing.T) {
if os.Getenv("IFLOW_INTEGRATION") == "" {
t.Skip("set IFLOW_INTEGRATION=1 to run")
}
if _, err := exec.LookPath("iflow"); err != nil {
t.Skip("iflow CLI not found in PATH")
}
a, err := New(map[string]any{"work_dir": "/tmp"})
if err != nil {
t.Fatalf("New: %v", err)
}
sess, err := a.StartSession(context.Background(), "")
if err != nil {
t.Fatalf("StartSession: %v", err)
}
defer sess.Close()
if err := sess.Send("Reply exactly READY", nil, nil); err != nil {
t.Fatalf("Send #1: %v", err)
}
res1 := waitForResult(t, sess.Events())
if !strings.Contains(strings.ToUpper(res1.Content), "READY") {
t.Fatalf("unexpected first result: %q", res1.Content)
}
sid := sess.CurrentSessionID()
if sid == "" {
t.Fatal("expected session id after first send")
}
if err := sess.Send("Reply exactly RESUMED", nil, nil); err != nil {
t.Fatalf("Send #2: %v", err)
}
res2 := waitForResult(t, sess.Events())
if !strings.Contains(strings.ToUpper(res2.Content), "RESUMED") {
t.Fatalf("unexpected second result: %q", res2.Content)
}
if sid2 := sess.CurrentSessionID(); sid2 != sid {
t.Fatalf("session id changed: %q -> %q", sid, sid2)
}
resumed, err := a.StartSession(context.Background(), sid)
if err != nil {
t.Fatalf("StartSession resume: %v", err)
}
defer resumed.Close()
if err := resumed.Send("Reply exactly CONTINUED", nil, nil); err != nil {
t.Fatalf("Send resume: %v", err)
}
res3 := waitForResult(t, resumed.Events())
if !strings.Contains(strings.ToUpper(res3.Content), "CONTINUED") {
t.Fatalf("unexpected resumed result: %q", res3.Content)
}
if sid3 := resumed.CurrentSessionID(); sid3 != sid {
t.Fatalf("resumed session id mismatch: want %q, got %q", sid, sid3)
}
}
func waitForResult(t *testing.T, ch <-chan core.Event) core.Event {
t.Helper()
timeout := time.After(90 * time.Second)
for {
select {
case ev, ok := <-ch:
if !ok {
t.Fatal("events channel closed")
}
switch ev.Type {
case core.EventError:
t.Fatalf("event error: %v", ev.Error)
case core.EventResult:
fmt.Printf("[RESULT] sid=%s content=%s\n", ev.SessionID, ev.Content)
return ev
}
case <-timeout:
t.Fatal("timeout waiting for result")
}
}
}