Files
sanderling/internal/runner/navigation_trace_test.go
T
pj 577993b540 test(runner): retire the scaffolding the package grew by copying
Four consolidations, no assertion changed and the same 217 tests passing:

harness gains run and tryRun, retiring 68 copies of context.WithTimeout plus
Run(ctx, Options{}) plus an error check. The seven sites whose error check said
something specific keep their own wording.

mock.FailurePlan retires six wrapper drivers that were the same seven-line
method with a different error constant. The three that need more than an error
on call N stay.

traceStepLine absorbs the 15 local trace-line declarations and readTraceLines is
now the only reader. No local copy disagreed with internal/trace about a JSON
tag. Three raw readers stay on purpose: one decodes a real trace.Step, one
snapshots bytes, one asserts on raw JSON text.

One embeddable base carries the five V8-path methods the five web fakes each
redeclared.
2026-08-22 21:39:22 +05:30

52 lines
1.6 KiB
Go

package runner
import (
"context"
"testing"
"time"
"github.com/priyanshujain/sanderling/internal/driver"
mockdriver "github.com/priyanshujain/sanderling/internal/driver/mock"
)
// navigatingDriver reports one navigation per step, the way a page that submits
// a form or reloads does.
type navigatingDriver struct {
*mockdriver.Driver
url string
}
func (d *navigatingDriver) Navigations(context.Context) ([]driver.Navigation, error) {
return []driver.Navigation{{URL: d.url, UnixMillis: 1700000000000}}, nil
}
// A run whose app replaced its own document has to say so on the step it
// happened. Without it the trace shows a generator repeating one action and no
// reason for it, and an analysis cannot tell that from a seed that chose badly.
func TestRunner_TheTraceRecordsThatThePageNavigated(t *testing.T) {
state := newHarness(t)
const url = "http://127.0.0.1/index.html?"
navigating := &navigatingDriver{Driver: state.mock, url: url}
state.run(t, Options{Duration: 100 * time.Millisecond, MaxSteps: 3, Driver: navigating})
if err := state.writer.Close(); err != nil {
t.Fatalf("close trace: %v", err)
}
recorded := 0
for _, step := range readTraceLines(t, state.writer.Directory()) {
for _, navigation := range step.Navigations {
recorded++
if navigation.URL != url {
t.Errorf("step %d records navigation to %q, want %q", step.Step, navigation.URL, url)
}
if navigation.UnixMillis == 0 {
t.Errorf("step %d records a navigation with no timestamp", step.Step)
}
}
}
if recorded == 0 {
t.Fatal("the page navigated on every step and the trace holds no record of it")
}
}