JR-023: correct the missing-dependency logs, and test them
🏗️ Build Plugin / build (push) Successful in 29s
Latest Release / latest-release (push) Successful in 39s
🧪 Test Plugin / test (push) Successful in 26s

Both failure paths still told admins the overlay was "falling back to patching
index.html on disk". JR-021 deleted that fallback, so the message was false --
and it was false in the worst place, since an admin reads it precisely when
debugging a missing overlay and would go hunting for a patch that no longer
exists. They now name the install URL and say the overlay is disabled while
every other feature is unaffected. The not-found case is a Warning, not
Information: a headline feature being off should not sit among startup chatter.

UT-012..015 cover the branch. The File Transformation assembly is genuinely
absent from the test host, so TryRegister exercises its real not-found path
rather than a seam invented for the test. UT-015 pins that a null payload
returns empty rather than throwing -- this callback runs inside another
plugin's request path on every page served, so throwing would break the web
client itself, not just JRay's overlay.

Making those runnable needed the test project to reference Jellyfin.Controller
and Jellyfin.Model without the plugin's ExcludeAssets=runtime. My earlier claim
that DisableTransitiveFrameworkReferences alone sufficed was too narrow: it
drops the demand for the web *framework*, but ILogger and MediaBrowser.Common
live in the excluded assets, so anything past dependency-free logic failed at
run time with FileNotFoundException. Both settings are needed, and the register
now says so.

Second mutation check: downgrading the warning to Information fails UT-013 and
nothing else. Source restored and re-verified.

JR-023 reaches Done for the detection half. The config-page banner stays T4 --
verifiable only against a live server.

TRACES: UT-012, UT-013, UT-014, UT-015 | JR-023

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 09:18:40 +02:00
co-authored by Claude Opus 5
parent 0fafa84158
commit 2926740d03
5 changed files with 165 additions and 28 deletions
@@ -23,9 +23,10 @@ namespace Jellyfin.Plugin.JRay.Services;
/// <c>AssemblyLoadContext</c> from the real one, which is precisely the failure
/// the reflection integration exists to avoid.
///
/// This is the mechanism JR-021 requires, but it does not by itself satisfy
/// JR-021 — that requirement is a prohibition, and it stays unmet while
/// <see cref="WebClientPatchService"/> can still write to disk.
/// This is the only route by which JRay reaches the web client. There is no
/// on-disk fallback (JR-021), so when registration fails the overlay is simply
/// disabled — which is why both failure paths log a warning naming the missing
/// plugin rather than quietly degrading.
/// </remarks>
// TRACES: JR-020, JR-023 | PR-004
public static class FileTransformationRegistration
@@ -72,7 +73,12 @@ public static class FileTransformationRegistration
var registerMethod = ResolveRegisterMethod();
if (registerMethod is null)
{
logger.LogInformation("JRay: File Transformation plugin not found; falling back to patching index.html on disk.");
logger.LogWarning(
"JRay: the File Transformation plugin was not found, so the pause overlay is "
+ "disabled. JRay does not modify index.html on disk and has no fallback. "
+ "Install it from {ManifestUrl} to enable the overlay; every other JRay "
+ "feature is unaffected.",
ManifestUrl);
return false;
}
@@ -84,7 +90,11 @@ public static class FileTransformationRegistration
}
catch (Exception ex) when (ex is TargetInvocationException or InvalidOperationException or JsonException or MissingMethodException)
{
logger.LogWarning(ex, "JRay: failed to register with the File Transformation plugin; falling back to patching index.html on disk.");
logger.LogWarning(
ex,
"JRay: the File Transformation plugin is present but registration failed, so the "
+ "pause overlay is disabled. JRay does not modify index.html on disk and has no "
+ "fallback. Every other JRay feature is unaffected.");
return false;
}
}