7aba31f14aed7f2620e4746b54f9569a5c93e1ad
braney
  Sat Sep 12 15:07:34 2026 -0700
docent: ten regression tests for quickLift, on hgTracks and on hgc, refs #38252

Fourteen scripts here already lift something -- they are the ones that call
`convert: {quicklift: true}` -- so these take the parts of the lift that had no
test.  Five read the lifted image and five read a details page:

rm38032  the target keeps the source's track order.  First use of `ordered:`,
which was added to expect: for this bug
rm38042  a ClinVar CNV running past the chains quickLift loads is clipped
rather than dropped, so the spanned-item merge still has it
rm37646  a lolly composite subtrack lifts, and its map boxes still carry its
own track name -- the string the stale pop pointer clobbered
rm36048  the spanned-item merge still works on a lifted DECIPHER track
rm37815  "Hide all default tracks on the target" hides all six of hs1's own
tracks and keeps the lifted one
rm36059  a lifted GENCODE Versions item gives the real details page, in
destination coordinates, with no "Can't start query"
rm36370  a lifted knownGene click renders GeneReviews and Methods, the two
sections the ticket says were missing
rm36125  a lifted RefSeq item's page, and its Predicted Protein link
returning SHH's peptide instead of a blank page
rm36942  the Alignment Differences description, reached from a difference
item: the four colors and the figure
rm38146  the same page with a GenArk assembly as the SOURCE, down to the base
alignment that reads query bases out of a two bit file

All ten are assertion-only: every fix shipped long ago.  make test is 57 of 57
green in 10m18s, up from 7m34s -- each script costs a convert, about 17 seconds,
because no URL builds a quickLift hub.

README.txt gains what the batch cost.  A lifted row and map box carry a per-run
hub_<n>_ prefix, so rows: matches by suffix and a has: selector must use a
substring.  Never assert a count an otto reload can move: rm38042 and rm36048
both read the merged-item box and leave its count (45 for ClinVar today) to a
comment.  And a details page prints the track's own labels whether or not it
worked, so each hgc assertion names something only the fixed page has.

Three candidates were rejected: #38033's "(N items could not be lifted)" label
is only in the drawn image and the page JSON, where no expect: check reaches it;
#37970 needs a broadPeak track and hg38 has none; #37974's center-label drag is
pixels.

diff --git src/hg/utils/docent/tests/regress/README.txt src/hg/utils/docent/tests/regress/README.txt
index 5ad966e8844..df58a6e4934 100644
--- src/hg/utils/docent/tests/regress/README.txt
+++ src/hg/utils/docent/tests/regress/README.txt
@@ -137,15 +137,49 @@
 buttons, where the title changes with the mode and would otherwise be a second, free
 assertion -- it is not available.
 
 **Multi-region is reachable from the URL, and the dialog is not.** `virtModeType=`,
 `multiRegionsBedInput=` (the textarea's own cart variable, newlines as %0A),
 `singleAltHaploId=`, `virtWinFull=on` and `<composite>.hideEmptySubtracks=on` all work on
 a `goto:`, which is how nine of the ten set their state -- Docent has no verb that types
 into an arbitrary field, so the textarea and the alt-haplotype input cannot be filled.
 What still needs the real dialog is anything the page's JavaScript decides: rm29452's
 disabled radio and its status line are invisible to curl, because the server sends the
 same HTML on a build with the bug and a build without it.
 
 `virtWinFull=on` is worth knowing for a third reason: without it a region change lands
 zoomed in on one region, so a second region is off screen and a script cannot tell a
 region that failed to resolve from one that is merely not in view.
+
+Ten more for quickLift, five on hgTracks and five on hgc
+----------------------------------------------------------
+
+rm36048, rm36059, rm36125, rm36370, rm36942, rm37646, rm37815, rm38032, rm38042 and
+rm38146 are one batch, written 2026-09-12. Fourteen scripts here already lifted something
+(they are the ones that call `convert: {quicklift: true}`); these add the parts of the
+lift that had no test: the order tracks come out in, an item bigger than the chains
+quickLift loads, the spanned-item merge, a lolly subtrack, the hide-target-defaults
+checkbox, and five details pages -- GENCODE archive, hgGene, NCBI RefSeq, the Alignment
+Differences description, and the same page with a GenArk assembly as the SOURCE.
+
+Each one costs a convert, which is about 17 seconds: hgConvert plus a hub build plus the
+click through to the browser. Budget for that before adding more.
+
+Three things worth reusing from them:
+
+**The lift is set up through the UI and read from the map.** There is no URL that makes a
+quickLift hub, so every script here does `convert:` then `open: lift`. What comes back
+carries a per-run `hub_<n>_` prefix on every row id and every map box, so `rows:` matches
+by suffix and a `has:` selector has to use a substring (`area[href*="clinvarSubLolly"]`),
+never an exact id.
+
+**Do not assert a count that a data update can move.** rm38042 and rm36048 both read the
+spanned-item merge box, and the tooltip on it counts the items merged -- 45 for ClinVar on
+2026-09-12. That number is reloaded by an otto cron every month. Both scripts assert that
+the box is THERE (`area[data-tooltip^="Merged "]`) and leave the count to a comment, so a
+red morning is news about quickLift rather than about ClinVar.
+
+**A details page carries the track's own labels, so name something else.** rm36125 asserts
+SHH's N-terminal peptide, rm36059 a UniProtKB section, rm36370 two section headings that
+were missing, rm38146 the query sequence read out of a two bit file. Each of those is
+absent from the page the ticket was filed about and present on the fixed one; the track
+name and longLabel are on both.