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 AdminMemberControllerIntegrationTests : IClassFixture> { private readonly WebApplicationFactory _factory; private readonly IAdminMemberService _mockAdminMemberService; public AdminMemberControllerIntegrationTests(WebApplicationFactory factory) { _mockAdminMemberService = Substitute.For(); _factory = factory.WithWebHostBuilder(builder => { builder.UseEnvironment("Testing"); builder.ConfigureServices(services => { services.RemoveAll(); services.AddSingleton(_mockAdminMemberService); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = AdminTestAuthHandler.AuthenticationScheme; options.DefaultChallengeScheme = AdminTestAuthHandler.AuthenticationScheme; }) .AddScheme( AdminTestAuthHandler.AuthenticationScheme, options => { }); }); }); } /// /// 测试获取会员列表 - 未授权返回401 /// [Fact] public async Task GetMemberList_WithoutAuth_ReturnsUnauthorized() { var client = _factory.CreateClient(); var response = await client.GetAsync("/api/admin/members"); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } /// /// 测试获取会员列表 - 授权后成功 /// [Fact] public async Task GetMemberList_WithAuth_ReturnsSuccess() { var expectedResult = new PagedResult { Items = new List { new AdminMemberListDto { MemberId = 1, UserId = 100, XiangQinNo = "123456", Nickname = "测试用户", MemberLevel = 1, MemberLevelText = "不限时会员", OrderId = 1, OrderNo = "ORD202312310001", StartTime = DateTime.Now.AddDays(-30), ExpireTime = null, Status = 1, StatusText = "生效中", FamilyBindCount = 0 } }, Total = 1, PageIndex = 1, PageSize = 20 }; _mockAdminMemberService.GetMemberListAsync(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/members"); 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].MemberLevelText); } /// /// 测试获取会员详情 - 成功 /// [Fact] public async Task GetMemberDetail_WithAuth_ReturnsSuccess() { var expectedResult = new AdminMemberDetailDto { MemberId = 1, UserId = 100, XiangQinNo = "123456", Nickname = "测试用户", MemberLevel = 3, MemberLevelText = "家庭版会员", OrderId = 1, OrderNo = "ORD202312310001", OrderAmount = 2999, PayTime = DateTime.Now.AddDays(-30), StartTime = DateTime.Now.AddDays(-30), ExpireTime = null, Status = 1, StatusText = "生效中", FamilyMembers = new List { new AdminFamilyMemberDto { BindId = 1, UserId = 101, XiangQinNo = "123457", Nickname = "家庭成员1", BindTime = DateTime.Now.AddDays(-20) } } }; _mockAdminMemberService.GetMemberDetailAsync(1) .Returns(Task.FromResult(expectedResult)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.GetAsync("/api/admin/members/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.MemberId, result.Data.MemberId); Assert.Equal("家庭版会员", result.Data.MemberLevelText); Assert.NotNull(result.Data.FamilyMembers); Assert.Single(result.Data.FamilyMembers); } /// /// 测试会员列表按等级筛选 - 成功 /// [Fact] public async Task GetMemberList_WithLevelFilter_ReturnsFilteredResults() { var expectedResult = new PagedResult { Items = new List { new AdminMemberListDto { MemberId = 1, MemberLevel = 2, MemberLevelText = "诚意会员" } }, Total = 1, PageIndex = 1, PageSize = 20 }; _mockAdminMemberService.GetMemberListAsync(Arg.Is(r => r.MemberLevel == 2)) .Returns(Task.FromResult(expectedResult)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.GetAsync("/api/admin/members?memberLevel=2"); 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(2, item.MemberLevel)); } /// /// 测试会员列表按关键词搜索 - 成功 /// [Fact] public async Task GetMemberList_WithKeyword_ReturnsFilteredResults() { var expectedResult = new PagedResult { Items = new List { new AdminMemberListDto { MemberId = 1, XiangQinNo = "123456", Nickname = "李家长" } }, Total = 1, PageIndex = 1, PageSize = 20 }; _mockAdminMemberService.GetMemberListAsync(Arg.Is(r => r.Keyword == "李")) .Returns(Task.FromResult(expectedResult)); var client = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1"); var response = await client.GetAsync("/api/admin/members?keyword=李"); 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); } }