using System.Net; using System.Net.Http.Json; using System.Text.Json; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using NSubstitute; using Xunit; using XiangYi.AdminApi; using XiangYi.Application.DTOs.Requests; using XiangYi.Application.DTOs.Responses; using XiangYi.Application.Interfaces; namespace XiangYi.Api.Tests.AdminApi; /// /// 后台举报管理控制器集成测试 /// public class AdminReportControllerIntegrationTests : IClassFixture> { private readonly WebApplicationFactory _factory; private readonly IAdminReportService _mockAdminReportService; public AdminReportControllerIntegrationTests(WebApplicationFactory factory) { _mockAdminReportService = Substitute.For(); _factory = factory.WithWebHostBuilder(builder => { builder.UseEnvironment("Testing"); builder.ConfigureServices(services => { services.RemoveAll(); services.AddSingleton(_mockAdminReportService); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = AdminTestAuthHandler.AuthenticationScheme; options.DefaultChallengeScheme = AdminTestAuthHandler.AuthenticationScheme; }) .AddScheme( AdminTestAuthHandler.AuthenticationScheme, options => { }); }); }); } /// /// 测试获取举报列表 - 未授权返回401 /// [Fact] public async Task GetReportList_WithoutAuth_ReturnsUnauthorized() { var client = _factory.CreateClient(); var response = await client.GetAsync("/api/admin/reports"); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } /// /// 测试获取举报列表 - 授权后成功 /// [Fact] public async Task GetReportList_WithAuth_ReturnsSuccess() { var expectedResult = new PagedResult { Items = new List { new AdminReportListDto { ReportId = 1, ReporterId = 100, ReporterXiangQinNo = "123456", ReporterNickname = "举报人", ReportedUserId = 200, ReportedUserXiangQinNo = "654321", ReportedUserNickname = "被举报人", ReportType = 1, ReportTypeText = "用户", Reason = "虚假资料", Status = 0, StatusText = "待处理", CreateTime = DateTime.Now.AddHours(-1) } }, Total = 1, PageIndex = 1, PageSize = 20 }; _mockAdminReportService.GetReportListAsync(Arg.Any()) .Returns(Task.FromResult(expectedResult)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.GetAsync("/api/admin/reports"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize>>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); Assert.NotNull(result.Data); Assert.Single(result.Data.Items); Assert.Equal("待处理", result.Data.Items[0].StatusText); } /// /// 测试获取举报详情 - 成功 /// [Fact] public async Task GetReportDetail_WithAuth_ReturnsSuccess() { var expectedResult = new AdminReportDetailDto { ReportId = 1, Reporter = new AdminReportUserDto { UserId = 100, XiangQinNo = "123456", Nickname = "举报人", Status = 1, StatusText = "正常" }, ReportedUser = new AdminReportUserDto { UserId = 200, XiangQinNo = "654321", Nickname = "被举报人", Status = 1, StatusText = "正常" }, ReportType = 1, ReportTypeText = "用户", Reason = "虚假资料", Description = "该用户资料与实际不符", EvidenceUrls = new List { "https://example.com/evidence1.jpg" }, Status = 0, StatusText = "待处理", CreateTime = DateTime.Now.AddHours(-1) }; _mockAdminReportService.GetReportDetailAsync(1) .Returns(Task.FromResult(expectedResult)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.GetAsync("/api/admin/reports/1"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); Assert.NotNull(result.Data); Assert.Equal(expectedResult.ReportId, result.Data.ReportId); Assert.NotNull(result.Data.Reporter); Assert.NotNull(result.Data.ReportedUser); } /// /// 测试处理举报 - 成功 /// [Fact] public async Task HandleReport_WithAuth_ReturnsSuccess() { _mockAdminReportService.HandleReportAsync(1, 1, Arg.Any()) .Returns(Task.FromResult(true)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var request = new AdminHandleReportRequest { HandleResult = "已核实,对被举报人进行警告处理", IsPunish = true, PunishmentType = 1, IsWarnReporter = false }; var response = await client.PostAsJsonAsync("/api/admin/reports/1/handle", request); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); } /// /// 测试忽略举报 - 成功 /// [Fact] public async Task IgnoreReport_WithAuth_ReturnsSuccess() { _mockAdminReportService.IgnoreReportAsync(1, 1, "证据不足") .Returns(Task.FromResult(true)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.PostAsJsonAsync("/api/admin/reports/1/ignore", "证据不足"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); } /// /// 测试处理举报并处罚被举报人 - 禁言处理 /// [Fact] public async Task HandleReport_WithMutePunishment_ReturnsSuccess() { _mockAdminReportService.HandleReportAsync(1, 1, Arg.Any()) .Returns(Task.FromResult(true)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var request = new AdminHandleReportRequest { HandleResult = "已核实,对被举报人进行禁言处理", IsPunish = true, PunishmentType = 2, PunishmentDays = 7, IsWarnReporter = false }; var response = await client.PostAsJsonAsync("/api/admin/reports/1/handle", request); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); } /// /// 测试处理举报并警告举报人 - 恶意举报 /// [Fact] public async Task HandleReport_WithReporterWarning_ReturnsSuccess() { _mockAdminReportService.HandleReportAsync(1, 1, Arg.Any()) .Returns(Task.FromResult(true)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var request = new AdminHandleReportRequest { HandleResult = "经核实为恶意举报", IsPunish = false, IsWarnReporter = true, ReporterWarningReason = "恶意举报,请勿滥用举报功能" }; var response = await client.PostAsJsonAsync("/api/admin/reports/1/handle", request); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); } /// /// 测试举报列表按状态筛选 - 成功 /// [Fact] public async Task GetReportList_WithStatusFilter_ReturnsFilteredResults() { var expectedResult = new PagedResult { Items = new List { new AdminReportListDto { ReportId = 1, Status = 0, StatusText = "待处理" } }, Total = 1, PageIndex = 1, PageSize = 20 }; _mockAdminReportService.GetReportListAsync(Arg.Is(r => r.Status == 0)) .Returns(Task.FromResult(expectedResult)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.GetAsync("/api/admin/reports?status=0"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize>>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Assert.NotNull(result); Assert.Equal(0, result.Code); Assert.NotNull(result.Data); Assert.All(result.Data.Items, item => Assert.Equal(0, item.Status)); } }