更新客户端适配性问题
build-winui / winui (push) Has been cancelled

This commit is contained in:
2026-06-28 08:56:45 +08:00
parent 962a2f2143
commit f00124c1c0
21 changed files with 428 additions and 63 deletions
@@ -168,6 +168,12 @@ public sealed class FeedbackServiceTests
Assert.AreEqual(signature, FeedbackSubmissionService.Sign("1760000000", "abc123", new string('a', 64), "{\"ok\":true}"));
}
[TestMethod]
public void FeedbackSubmissionUsesUnifiedManagementEndpoint()
{
Assert.AreEqual("https://update.ymhut.cn/", FeedbackSubmissionService.Endpoint);
}
[TestMethod]
public void FeedbackStatusResponseParsesExtendedServerFields()
{
@@ -109,6 +109,7 @@ public sealed class RemoteMediaCatalogTests
Assert.AreEqual("data.cover", source.ResolvedKey);
Assert.AreEqual("image", source.MediaType);
Assert.AreEqual(source.ResolvedUrl, source.EffectiveApiUrl);
Assert.AreEqual(source.ApiUrl, source.RefreshApiUrl);
Assert.IsTrue(source.IsAvailable);
}
@@ -121,6 +121,29 @@ public sealed class RemoteMediaResolverTests
Assert.AreEqual(".mp3", result.SuggestedExtension);
}
[TestMethod]
public async Task CacheBustsEachRefreshAndDisablesHttpCaches()
{
var observed = new List<ObservedRequest>();
var resolver = CreateResolver(request =>
{
observed.Add(ObservedRequest.From(request));
return Text(HttpStatusCode.OK, string.Empty, "image/jpeg");
});
await resolver.ResolveMediaAsync("https://example.test/random", RemoteMediaKind.Image);
await resolver.ResolveMediaAsync("https://example.test/random", RemoteMediaKind.Image);
var randomRequests = observed.Where(item => item.Uri.AbsolutePath == "/random").ToArray();
Assert.IsTrue(randomRequests.Length >= 4);
Assert.AreNotEqual(randomRequests[0].Uri.Query, randomRequests[2].Uri.Query);
Assert.IsTrue(randomRequests.All(item => item.NoCache));
Assert.IsTrue(randomRequests.All(item => item.NoStore));
Assert.IsTrue(randomRequests.All(item => item.MaxAge == TimeSpan.Zero));
Assert.IsTrue(randomRequests.All(item => item.PragmaNoCache));
Assert.IsTrue(randomRequests.All(item => item.IfModifiedSince == DateTimeOffset.UnixEpoch));
}
private static RemoteMediaResolver CreateResolver(Func<HttpRequestMessage, HttpResponseMessage> responseFactory)
{
return new RemoteMediaResolver(() => new StubHttpHandler(responseFactory));
@@ -150,4 +173,22 @@ public sealed class RemoteMediaResolverTests
return Task.FromResult(response);
}
}
private sealed record ObservedRequest(
Uri Uri,
bool NoCache,
bool NoStore,
TimeSpan? MaxAge,
bool PragmaNoCache,
DateTimeOffset? IfModifiedSince)
{
public static ObservedRequest From(HttpRequestMessage request)
=> new(
request.RequestUri!,
request.Headers.CacheControl?.NoCache == true,
request.Headers.CacheControl?.NoStore == true,
request.Headers.CacheControl?.MaxAge,
request.Headers.Pragma.Any(value => string.Equals(value.Name, "no-cache", StringComparison.OrdinalIgnoreCase)),
request.Headers.IfModifiedSince);
}
}