iop/apps/node/internal/adapters/cli/antigravity_print_blackbox_test.go

157 lines
3.7 KiB
Go

package cli_test
import (
"context"
"os"
"path/filepath"
"strings"
"testing"
"go.uber.org/zap"
clipkg "iop/apps/node/internal/adapters/cli"
"iop/apps/node/internal/adapters/cli/internal/testutil"
noderuntime "iop/apps/node/internal/runtime"
"iop/packages/go/config"
)
func TestCLIExecuteAntigravityPrintResumesLogicalSession(t *testing.T) {
testutil.RequireUnixShell(t)
agy := writeFakeAgy(t, `#!/usr/bin/env sh
log_file=""
conversation=""
prompt=""
while [ "$#" -gt 0 ]; do
case "$1" in
--log-file)
log_file="$2"
shift 2
;;
--conversation)
conversation="$2"
shift 2
;;
--print-timeout)
shift 2
;;
--dangerously-skip-permissions|--print)
shift
;;
*)
prompt="$1"
shift
;;
esac
done
if [ -z "$log_file" ]; then
echo "missing --log-file" >&2
exit 9
fi
if [ -z "$conversation" ]; then
printf 'I0000 server.go:747] Created conversation 11111111-2222-3333-4444-555555555555\n' >> "$log_file"
printf 'reply:first:%s\n' "$prompt"
else
printf 'I0000 printmode.go:71] Print mode: starting (promptLength=1, model="", conversationID="%s")\n' "$conversation" >> "$log_file"
printf 'reply:resume:%s:%s\n' "$conversation" "$prompt"
fi
`)
cfg := config.CLIConf{
Enabled: true,
Profiles: map[string]config.CLIProfileConf{
"antigravity": {
Command: agy,
Args: []string{
"--dangerously-skip-permissions",
"--print-timeout",
"10m",
"--print",
},
Mode: "antigravity-print",
ResumeArgs: []string{
"--dangerously-skip-permissions",
"--print-timeout",
"10m",
"--conversation",
},
},
},
}
c := clipkg.New(cfg, zap.NewNop())
ctx := context.Background()
first := &testutil.FakeSink{}
if err := c.Execute(ctx, noderuntime.ExecutionSpec{
RunID: "run-1",
Target: "antigravity",
SessionID: "session-a",
Input: map[string]any{"prompt": "first"},
}, first); err != nil {
t.Fatalf("first execute: %v", err)
}
if combined := testutil.CollectDeltas(first.Events()); !strings.Contains(combined, "reply:first:first") {
t.Fatalf("first execute output: %q", combined)
}
second := &testutil.FakeSink{}
if err := c.Execute(ctx, noderuntime.ExecutionSpec{
RunID: "run-2",
Target: "antigravity",
SessionID: "session-a",
Input: map[string]any{"prompt": "second"},
}, second); err != nil {
t.Fatalf("second execute: %v", err)
}
if combined := testutil.CollectDeltas(second.Events()); !strings.Contains(combined, "reply:resume:11111111-2222-3333-4444-555555555555:second") {
t.Fatalf("second execute output: %q", combined)
}
}
func TestCLIExecuteAntigravityPrint_MissingResumeArgsErrors(t *testing.T) {
testutil.RequireUnixShell(t)
agy := writeFakeAgy(t, `#!/usr/bin/env sh
echo "should not be called when resume_args is missing" >&2
exit 42
`)
cfg := config.CLIConf{
Enabled: true,
Profiles: map[string]config.CLIProfileConf{
"antigravity": {
Command: agy,
Args: []string{"--print"},
Mode: "antigravity-print",
ResumeArgs: nil,
},
},
}
c := clipkg.New(cfg, zap.NewNop())
err := c.Execute(context.Background(), noderuntime.ExecutionSpec{
RunID: "run-1",
Target: "antigravity",
SessionID: "session-a",
Input: map[string]any{"prompt": "first"},
}, &testutil.FakeSink{})
if err == nil {
t.Fatalf("expected error due to missing resume_args, got nil")
}
if !strings.Contains(err.Error(), "resume_args") {
t.Fatalf("expected error to mention resume_args, got: %v", err)
}
}
func writeFakeAgy(t *testing.T, script string) string {
t.Helper()
dir := t.TempDir()
path := filepath.Join(dir, "agy")
if err := os.WriteFile(path, []byte(script), 0o755); err != nil {
t.Fatalf("write fake agy: %v", err)
}
return path
}