75 lines
2.4 KiB
Go
75 lines
2.4 KiB
Go
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)
|
|
}
|