using System.Net; using System.Net.Http.Json; using Hua.Todo.HttpApi.AspNetCore.CloudSync.Services; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Xunit; namespace Hua.Todo.Host.Tests.CloudSync; /// /// CloudSyncProxyMiddleware 行为集成测试。 /// 验证云同步路径代理转发、无 URL 时返回 503。 /// settings 端点已迁移至 DynamicApi(/api/cloudSyncProxySettings),不在本测试覆盖范围。 /// public class CloudSyncProxyMiddlewareTests : IDisposable { private readonly WebApplication _app; private readonly HttpClient _client; public CloudSyncProxyMiddlewareTests() { var builder = WebApplication.CreateBuilder(); builder.WebHost.UseUrls("http://127.0.0.1:0"); builder.Services.AddCloudSyncProxy(); var app = builder.Build(); app.UseCloudSyncProxy(); _app = app; _app.StartAsync().GetAwaiter().GetResult(); _client = new HttpClient { BaseAddress = new Uri(_app.Urls.First()) }; } [Fact] public async Task Probe_NoCloudSyncUrl_Returns503() { var response = await _client.PostAsJsonAsync("/api/cloud-sync/probe", new { targetUrl = "http://localhost:5173" }); Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Contains("cloud sync server URL not configured", content); } [Fact] public async Task AuthLogin_NoCloudSyncUrl_Returns503() { var response = await _client.PostAsJsonAsync("/api/auth/login", new { username = "admin", password = "123456" }); Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); } [Fact] public async Task Tasks_NoCloudSyncUrl_Returns503() { var response = await _client.GetAsync("/api/tasks/"); Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); } [Fact] public async Task Tasks_WithoutTrailingSlash_NoCloudSyncUrl_Returns503() { var response = await _client.PostAsJsonAsync("/api/tasks", new { }); Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); } [Fact] public async Task SecurityPolicy_NoCloudSyncUrl_Returns503() { var response = await _client.GetAsync("/api/security/policy"); Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); } [Fact] public async Task Sync_NoCloudSyncUrl_Returns503() { var response = await _client.PostAsJsonAsync("/api/sync/", new { }); Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); } public void Dispose() { _client.Dispose(); _app.StopAsync().GetAwaiter().GetResult(); _app.DisposeAsync().GetAwaiter().GetResult(); } }