31dd19d6395d10ee6632bb2afcf1947f33eff3dd
braney
  Sat Sep 12 16:03:40 2026 -0700
docent: ten regression tests for hgTrackUi, refs #38252

Four scripts here already touched hgTrackUi in passing (rm37389, rm37489,
rm38126, rm38272).  These are about the page itself: the superTrack
configuration page, composite and subtrack configuration, filters, the color
override, the parent link, and two bad-input paths.

rm20460  the color override is offered on a genePred track and not on a
chain track, which is the type restriction 6d78a8e2d72 added
rm32263  a composite child's page names its container, and the link reaches
the container's own configuration page
rm34651  the density-graph options div is densGraphOptions<track> and the
old shared id is gone
rm35906  Clear filters survives a submit: the cart comes back on All, which
is what the button only appeared to do before
rm36484  the filterComposite select has no stray <br> inside it
rm36668  both the rearrangement and density-graph checkboxes on, submitted
together, does not crash hgTracks
rm36917  the superTrack page's Hide all / Show all / Apply to all controls,
and Show all leaving no child hidden
rm37130  under noParentConfig both filters are on the jaspar child page and
neither is on the parent
rm37282  Hide all greys the superTrack's own dropdown, and a child's Hide
does not force the container back to show
rm37743  a dup_1_refGene request with nothing in the cart errAborts with a
message naming it, instead of taking a SIGSEGV

All ten are assertion-only.  make test is 67 of 67 green: the suite went from
57 scripts to 67 for 14 extra seconds, 10m32s in total, because hgTrackUi draws
no image and most of these never leave it.

README.txt gains the four things the batch settled.  No track image means rows:
is unavailable and a positive text: is mandatory, since a crash hands the
browser an empty document where every noText: passes.  Most hgTrackUi bugs ARE
the markup, so naming the id or class the commit changed is the right check
here, unlike on hgTracks.  A cart round trip is the only way to tell a control
that works from one that looks right.  And Docent cannot pick an option from a
select, so a visibility goes in through the URL and a button is clicked wherever
one exists.

Two candidates were rejected: #38192's missing-track message is live but the
ticket is still Reviewing, and #37840's "add db= to links" is not true of every
link on the page today, so a blanket assertion would fail for a reason that is
not a bug.

diff --git src/hg/utils/docent/tests/regress/rm36668.docent.yaml src/hg/utils/docent/tests/regress/rm36668.docent.yaml
new file mode 100644
index 00000000000..92fee092843
--- /dev/null
+++ src/hg/utils/docent/tests/regress/rm36668.docent.yaml
@@ -0,0 +1,58 @@
+# #36668 -- hgTracks crashed when a track had both the rearrangement graph and the density
+# graph turned on.  The reporter's path was a blat search, which makes a custom track, then
+# the track's settings page, both checkboxes, Submit.  The stack ended in
+# wigLeftAxisLabels(), where tg->wigCartData is NULL under snake mode:
+#
+#     lines[1] = wigCart->yLineMark;
+#
+# ba2a019284c settles which one wins rather than making the wiggle path survive a NULL:
+#
+#     // the density graph and the rearrangement graph can't both be on at once.
+#     // if we're wiggling, undo snake mode and use the standard wiggle path.
+#     if (doSnake && checkIfWiggling(cart, track))
+#         doSnake = FALSE;
+#
+# The two settings are ordinary cart booleans, <track>.doSnake and <track>.doWiggle, so any
+# chain track offers both checkboxes and reaches the same code.  chainHs1 is used here
+# rather than a blat custom track: a blat run would put a test of hgBlat in front of a test
+# of hgTracks, and the crash is in neither.
+#
+# The checkboxes are clicked on the settings page and the page is submitted, which is the
+# gesture the ticket describes -- hgTrackUi writes both variables in one request, which is
+# the combination that crashed.  What comes back has to be a browser image: the crash gave
+# an error page with no image at all, so the row list is the assertion and noText: alone
+# would have passed on it.
+proof:
+  - "assertion-only 2026-09-12 -- written from the ticket and from ba2a019284c, after the fix shipped"
+
+target: genome-test
+db: hg38
+position: chr17:43044295-43125364
+reset: true
+fast: true
+steps:
+  # The visibility is set on the way in, because hgTrackUi's own display-mode control is a
+  # dropdown and Docent has no verb that picks an option from one.
+  - goto: "/cgi-bin/hgTrackUi?db=hg38&c=chr17&g=chainHs1&chainHs1=pack"
+  - expect:
+      has:
+        - 'input[name="chainHs1.doSnake"]'
+        - 'input[name="chainHs1.doWiggle"]'
+      text: "Chain"
+
+  - click: 'input[name="chainHs1.doSnake"]'
+  - click: 'input[name="chainHs1.doWiggle"]'
+  - click: '#Submit'
+
+  - expect:
+      rows: [ruler, chainHs1]
+      noText: "wigLeftAxisLabels"
+      url: "hgTracks"
+
+  # And the settings really are both on, which is the whole premise: a click that missed
+  # its checkbox would leave this script asserting that an ordinary chain track draws.
+  - goto: "/cgi-bin/hgTrackUi?db=hg38&c=chr17&g=chainHs1"
+  - expect:
+      has:
+        - 'input[name="chainHs1.doSnake"]:checked'
+        - 'input[name="chainHs1.doWiggle"]:checked'