xiangyixiangqin/server/tests/XiangYi.Api.Tests/AdminApi/AdminMemberControllerIntegrationTests.cs
2026-01-02 18:00:49 +08:00

256 lines
9.0 KiB
C#

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;
/// <summary>
/// 后台会员管理控制器集成测试
/// </summary>
public class AdminMemberControllerIntegrationTests : IClassFixture<WebApplicationFactory<IAdminApiMarker>>
{
private readonly WebApplicationFactory<IAdminApiMarker> _factory;
private readonly IAdminMemberService _mockAdminMemberService;
public AdminMemberControllerIntegrationTests(WebApplicationFactory<IAdminApiMarker> factory)
{
_mockAdminMemberService = Substitute.For<IAdminMemberService>();
_factory = factory.WithWebHostBuilder(builder =>
{
builder.UseEnvironment("Testing");
builder.ConfigureServices(services =>
{
services.RemoveAll<IAdminMemberService>();
services.AddSingleton(_mockAdminMemberService);
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = AdminTestAuthHandler.AuthenticationScheme;
options.DefaultChallengeScheme = AdminTestAuthHandler.AuthenticationScheme;
})
.AddScheme<AuthenticationSchemeOptions, AdminTestAuthHandler>(
AdminTestAuthHandler.AuthenticationScheme, options => { });
});
});
}
/// <summary>
/// 测试获取会员列表 - 未授权返回401
/// </summary>
[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);
}
/// <summary>
/// 测试获取会员列表 - 授权后成功
/// </summary>
[Fact]
public async Task GetMemberList_WithAuth_ReturnsSuccess()
{
var expectedResult = new PagedResult<AdminMemberListDto>
{
Items = new List<AdminMemberListDto>
{
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<AdminMemberQueryRequest>())
.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<ApiResponse<PagedResult<AdminMemberListDto>>>(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);
}
/// <summary>
/// 测试获取会员详情 - 成功
/// </summary>
[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<AdminFamilyMemberDto>
{
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<ApiResponse<AdminMemberDetailDto>>(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);
}
/// <summary>
/// 测试会员列表按等级筛选 - 成功
/// </summary>
[Fact]
public async Task GetMemberList_WithLevelFilter_ReturnsFilteredResults()
{
var expectedResult = new PagedResult<AdminMemberListDto>
{
Items = new List<AdminMemberListDto>
{
new AdminMemberListDto
{
MemberId = 1,
MemberLevel = 2,
MemberLevelText = "诚意会员"
}
},
Total = 1,
PageIndex = 1,
PageSize = 20
};
_mockAdminMemberService.GetMemberListAsync(Arg.Is<AdminMemberQueryRequest>(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<ApiResponse<PagedResult<AdminMemberListDto>>>(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));
}
/// <summary>
/// 测试会员列表按关键词搜索 - 成功
/// </summary>
[Fact]
public async Task GetMemberList_WithKeyword_ReturnsFilteredResults()
{
var expectedResult = new PagedResult<AdminMemberListDto>
{
Items = new List<AdminMemberListDto>
{
new AdminMemberListDto
{
MemberId = 1,
XiangQinNo = "123456",
Nickname = "李家长"
}
},
Total = 1,
PageIndex = 1,
PageSize = 20
};
_mockAdminMemberService.GetMemberListAsync(Arg.Is<AdminMemberQueryRequest>(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<ApiResponse<PagedResult<AdminMemberListDto>>>(content,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
Assert.NotNull(result);
Assert.Equal(0, result.Code);
Assert.NotNull(result.Data);
Assert.Single(result.Data.Items);
}
}