package exec_test import ( "context" "encoding/json" "fmt" "os" "path/filepath" "testing" "time" iexec "github.com/mathiasbq/supervisor/internal/exec" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func fakeVerifierClaude(t *testing.T, verdict iexec.Verdict) string { t.Helper() data, err := json.Marshal(verdict) require.NoError(t, err) dir := t.TempDir() script := filepath.Join(dir, "claude") content := fmt.Sprintf("#!/bin/sh\necho '%s'\n", string(data)) require.NoError(t, os.WriteFile(script, []byte(content), 0755)) return script } func TestVerifierAccepts(t *testing.T) { claude := fakeVerifierClaude(t, iexec.Verdict{Accept: true, Feedback: ""}) v := iexec.NewVerifier(claude, "claude-sonnet-4-6", 5*time.Second) verdict, err := v.Verify(context.Background(), "skill rules", "do the task", iexec.Result{ Status: "pass", Phase: "review", Skill: "review", Message: "ok", }) require.NoError(t, err) assert.True(t, verdict.Accept) assert.Empty(t, verdict.Feedback) } func TestVerifierEscalates(t *testing.T) { claude := fakeVerifierClaude(t, iexec.Verdict{Accept: false, Feedback: "missing line references"}) v := iexec.NewVerifier(claude, "claude-sonnet-4-6", 5*time.Second) verdict, err := v.Verify(context.Background(), "skill rules", "do the task", iexec.Result{ Status: "pass", Phase: "review", Skill: "review", Message: "incomplete", }) require.NoError(t, err) assert.False(t, verdict.Accept) assert.Equal(t, "missing line references", verdict.Feedback) } func TestVerifierErrorOnUnparsableOutput(t *testing.T) { dir := t.TempDir() script := filepath.Join(dir, "claude") require.NoError(t, os.WriteFile(script, []byte("#!/bin/sh\necho 'not json'\n"), 0755)) v := iexec.NewVerifier(script, "claude-sonnet-4-6", 5*time.Second) _, err := v.Verify(context.Background(), "rules", "task", iexec.Result{ Status: "pass", Phase: "review", Skill: "review", Message: "ok", }) assert.Error(t, err) } func TestVerifierErrorOnNonZeroExit(t *testing.T) { dir := t.TempDir() script := filepath.Join(dir, "claude") require.NoError(t, os.WriteFile(script, []byte("#!/bin/sh\nexit 1\n"), 0755)) v := iexec.NewVerifier(script, "claude-sonnet-4-6", 5*time.Second) _, err := v.Verify(context.Background(), "rules", "task", iexec.Result{ Status: "pass", Phase: "review", Skill: "review", Message: "ok", }) assert.Error(t, err) }