Files
sanderling/internal/runner/log_step_test.go
T
pj f59b7eab82 feat(runner): say what each step did in the step log
One line per step carried only an index and a node count. It now names the
screen, the action, its target and the typed value, the last through the
same redaction the trace and the prompt use. Emitted after the apply so the
line reports what actually happened, skip reason included.
2026-08-19 18:37:55 +05:30

60 lines
1.8 KiB
Go

package runner
import (
"bytes"
"log/slog"
"strings"
"testing"
"github.com/priyanshujain/sanderling/internal/verifier"
)
func logStepLine(t *testing.T, action verifier.Action, treeJSON string) string {
t.Helper()
var buffer bytes.Buffer
logger := slog.New(slog.NewTextHandler(&buffer, nil))
logStep(logger, 7, "LoginScreen", 42, action, nil, "", mustParseTree(t, treeJSON))
return buffer.String()
}
func TestLogStepNamesTheActionItsTargetAndTheTypedValue(t *testing.T) {
line := logStepLine(t, typeInto("id:LoginEmail"), iosLoginTreeJSON)
for _, want := range []string{
"index=7", "screen=LoginScreen", "nodes=42",
"action=InputText", "target=id:LoginEmail", typedCredential,
} {
if !strings.Contains(line, want) {
t.Errorf("step log = %q, want it to carry %q", line, want)
}
}
}
func TestLogStepRedactsTheTypedValueOfASecureField(t *testing.T) {
line := logStepLine(t, typeInto("id:LoginPassword"), iosLoginTreeJSON)
if strings.Contains(line, typedCredential) {
t.Errorf("step log = %q, want the typed credential withheld", line)
}
if !strings.Contains(line, verifier.RedactedInputText) {
t.Errorf("step log = %q, want %q", line, verifier.RedactedInputText)
}
if !strings.Contains(line, "target=id:LoginPassword") {
t.Errorf("step log = %q, want it to still name the field typed into", line)
}
}
func TestLogStepReportsAStepThatActedOnNothing(t *testing.T) {
var buffer bytes.Buffer
logger := slog.New(slog.NewTextHandler(&buffer, nil))
logStep(logger, 3, "", 0, verifier.Action{}, verifier.ErrNoAction, actionSkippedNoActionProduced, nil)
line := buffer.String()
if !strings.Contains(line, "action=none") {
t.Errorf("step log = %q, want action=none", line)
}
if !strings.Contains(line, "skipped="+string(actionSkippedNoActionProduced)) {
t.Errorf("step log = %q, want the skip reason", line)
}
}