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 AdminOrderControllerIntegrationTests : IClassFixture>
{
private readonly WebApplicationFactory _factory;
private readonly IAdminOrderService _mockAdminOrderService;
public AdminOrderControllerIntegrationTests(WebApplicationFactory factory)
{
_mockAdminOrderService = Substitute.For();
_factory = factory.WithWebHostBuilder(builder =>
{
builder.UseEnvironment("Testing");
builder.ConfigureServices(services =>
{
services.RemoveAll();
services.AddSingleton(_mockAdminOrderService);
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = AdminTestAuthHandler.AuthenticationScheme;
options.DefaultChallengeScheme = AdminTestAuthHandler.AuthenticationScheme;
})
.AddScheme(
AdminTestAuthHandler.AuthenticationScheme, options => { });
});
});
}
///
/// 测试获取订单列表 - 未授权返回401
///
[Fact]
public async Task GetOrderList_WithoutAuth_ReturnsUnauthorized()
{
var client = _factory.CreateClient();
var response = await client.GetAsync("/api/admin/orders");
Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
}
///
/// 测试获取订单列表 - 授权后成功
///
[Fact]
public async Task GetOrderList_WithAuth_ReturnsSuccess()
{
var expectedResult = new PagedResult
{
Items = new List
{
new AdminOrderListDto
{
OrderId = 1,
OrderNo = "ORD202312310001",
UserId = 100,
XiangQinNo = "123456",
Nickname = "测试用户",
OrderType = 1,
OrderTypeText = "会员",
ProductName = "不限时会员",
Amount = 1299,
PayAmount = 1299,
Status = 2,
StatusText = "已支付",
PayTime = DateTime.Now.AddHours(-1),
CreateTime = DateTime.Now.AddHours(-2)
}
},
Total = 1,
PageIndex = 1,
PageSize = 20
};
_mockAdminOrderService.GetOrderListAsync(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/orders");
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("ORD202312310001", result.Data.Items[0].OrderNo);
}
///
/// 测试获取订单详情 - 成功
///
[Fact]
public async Task GetOrderDetail_WithAuth_ReturnsSuccess()
{
var expectedResult = new AdminOrderDetailDto
{
OrderId = 1,
OrderNo = "ORD202312310001",
UserId = 100,
XiangQinNo = "123456",
Nickname = "测试用户",
OrderType = 1,
OrderTypeText = "会员",
ProductName = "不限时会员",
Amount = 1299,
PayAmount = 1299,
Status = 2,
StatusText = "已支付",
PayType = 1,
PayTypeText = "微信支付",
TransactionId = "wx123456789"
};
_mockAdminOrderService.GetOrderDetailAsync(1)
.Returns(Task.FromResult(expectedResult));
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
var response = await client.GetAsync("/api/admin/orders/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.OrderId, result.Data.OrderId);
Assert.Equal(expectedResult.OrderNo, result.Data.OrderNo);
}
///
/// 测试订单退款 - 成功
///
[Fact]
public async Task RefundOrder_WithAuth_ReturnsSuccess()
{
var expectedResult = new AdminOrderRefundResponse
{
Success = true,
Message = "退款成功",
RefundId = "refund123456"
};
_mockAdminOrderService.RefundOrderAsync(1, Arg.Any(), 1)
.Returns(Task.FromResult(expectedResult));
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
var request = new AdminOrderRefundRequest { Reason = "用户申请退款" };
var response = await client.PostAsJsonAsync("/api/admin/orders/1/refund", 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);
Assert.NotNull(result.Data);
Assert.True(result.Data.Success);
}
///
/// 测试获取订单统计 - 成功
///
[Fact]
public async Task GetOrderStatistics_WithAuth_ReturnsSuccess()
{
var expectedResult = new AdminOrderStatisticsDto
{
TotalOrders = 1000,
TodayOrders = 50,
WeekOrders = 200,
MonthOrders = 800,
PaidOrders = 900,
TotalIncome = 500000,
TodayIncome = 25000,
WeekIncome = 100000,
MonthIncome = 400000,
RefundedOrders = 10,
RefundedAmount = 5000
};
_mockAdminOrderService.GetOrderStatisticsAsync()
.Returns(Task.FromResult(expectedResult));
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
var response = await client.GetAsync("/api/admin/orders/statistics");
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.TotalOrders, result.Data.TotalOrders);
Assert.Equal(expectedResult.TotalIncome, result.Data.TotalIncome);
}
///
/// 测试订单列表按状态筛选 - 成功
///
[Fact]
public async Task GetOrderList_WithStatusFilter_ReturnsFilteredResults()
{
var expectedResult = new PagedResult
{
Items = new List
{
new AdminOrderListDto
{
OrderId = 1,
OrderNo = "ORD202312310001",
Status = 2,
StatusText = "已支付"
}
},
Total = 1,
PageIndex = 1,
PageSize = 20
};
_mockAdminOrderService.GetOrderListAsync(Arg.Is(r => r.Status == 2))
.Returns(Task.FromResult(expectedResult));
var client = _factory.CreateClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer admin-token-1");
var response = await client.GetAsync("/api/admin/orders?status=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.Status));
}
}