92a67ef6

By: Michael Lynch <git@mtlynch.io>

Consolidate media service tests into table-driven tests

Merge the three near-identical publish tests (image, animated image,
video) into one TestServicePublishesMedia table that selects the publish
method per row via a method expression. Drop error-path rows that
repeated identical shared logic across media types: all three publish
methods funnel into the same unexported publish() and
classifyProcessingError(), so each error path now has one row (plus the
video-specific too-long translation).

Merge the three Delete tests into one TestServiceDelete table covering
file-variant deletion per media type, not-found error translation, and
the no-purge-on-file-deletion-failure guarantee. The store-sentinel
leak check now runs as a general assertion on every row.

Also simplify mockProcessor to a single processErr field and remove its
calledProcess* fields, which no test asserted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 2s 18s 18s 20s 2s
Eval 14s 33s 33s 48s 0s
Build 35s 1m27s 2m32s 3m08s 1m22s
Suite 2s 2m19s 3m06s 3m08s 1m25s

Timeline

0s10s20s30s40s50s1m1m10s2m50s3m