e128682fd48d974c0eaa74366087d2be47080bf5
braney
  Fri Sep 4 11:43:52 2026 -0700
docent: add make preflight, which checks the fixtures a test suite does not own

A Docent test that loads a saved session or attaches a hub depends on something
outside the tree, and the failure when that thing goes away is silent rather
than loud. A session that has been renamed or deleted is not an error: hgTracks
answers HTTP 200 with a page titled "Very Early Error" whose body reads "Could
not find session NAME for user USER", the page carries no track image, and every
noText: assertion on it passes. The run goes green having tested nothing.
Verified both ways: a bogus session name passes a test whose only check is
noText:, and fails once the script also asserts noText: "Could not find
session".

preflight.js reads the fixtures out of the scripts themselves -- loadSession:,
hub:, addHub:, addCustomTrack: url:, and hubUrl= inside a goto: -- so the list
cannot drift from what the scripts actually use. It needs no browser, runs in a
couple of seconds, and exits non-zero if anything is unreachable, which is what
lets a nightly run tell "the fixtures are gone" from "a bug came back".

Checking it against the sessions cited by the tickets in #38252 found four that
do not exist on genome-test because they were saved on the RR or on beta, and
corrected one I had wrongly called missing: session names store a dash as %2D,
so a MySQL LIKE with a literal dash misses them. The HTTP check has no such
problem, which is a reason to prefer it over a query against namedSessionDb.

refs #37892 #38252

diff --git src/hg/utils/docent/tests/regress/makefile src/hg/utils/docent/tests/regress/makefile
index 8b039cbe243..5d6f4edf8b8 100644
--- src/hg/utils/docent/tests/regress/makefile
+++ src/hg/utils/docent/tests/regress/makefile
@@ -12,16 +12,18 @@
 #     make test T=rm36382     # just one
 #     make derive             # the derivation alone, for the scripts with a baseline
 #
 # Naming: rm<ticket>.docent.yaml, so the ticket is the filename. Every script says in its
 # first lines which ticket it is, what the symptom was, and what the assertion would
 # catch -- a regression test whose comment does not name the bug is unmaintainable, since
 # the next reader cannot tell a deliberate assertion from an accident.
 #
 # These assert the FIXED behavior and were never watched to fail on a buggy build, so the
 # assertions are deliberately tight: `exact:` and `noRows:` rather than a bare `rows:`,
 # and `noText:` on the exact error string the ticket quoted. A loose assertion here is
 # indistinguishable from no test at all.
 
 DOCENT = ../../docent.js
 
+PREFLIGHT = ../preflight.js
+
 include ../docentTest.mk