f963b73576b5c69915366893da7dfa6afe633456
braney
  Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892

tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.

DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.

The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.

Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.

diff --git src/hg/utils/docent/tests/selftest.docent.yaml src/hg/utils/docent/tests/selftest.docent.yaml
new file mode 100644
index 00000000000..1aa5e4f1d11
--- /dev/null
+++ src/hg/utils/docent/tests/selftest.docent.yaml
@@ -0,0 +1,30 @@
+# Docent self-test: session -> expect -> loadSession, in one run.
+#
+# Not part of `make test` in the kent tree: it drives a real server over the
+# network and needs the shared Playwright install. Run it by hand:
+#
+#     cd kent/src/hg/utils/docent/tests && make test
+#
+# It passes silently and exits 0. Any failure is an `expect:` step, which names
+# what it wanted and what was actually drawn, and exits 1.
+target: genome-test
+db: hg38
+position: chr7:155799529-155812871
+reset: true
+fast: true
+steps:
+  - go: chr7:155799529-155812871
+  - hide: all
+  - track: {mane: pack}
+
+  # session: writes the whole cart at this step, and expect: agrees with it.
+  - session: saved
+  - expect: {rows: [ruler, mane], exact: true, height: 2000, noRows: [clinvarMain]}
+
+  # Move somewhere else, so a restore has something to undo.
+  - track: {clinvar: pack}
+  - expect: {rows: [clinvarMain], noText: "Too Long"}
+
+  # loadSession: from the local file puts the earlier state back exactly.
+  - loadSession: {file: saved}
+  - expect: {rows: [ruler, mane], exact: true, noRows: [clinvarMain]}