You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/tests/CncWebApi.Tests/SettingsControllerTests.cs

246 lines
7.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections.Generic;
using CncModels.Constants;
using CncModels.Dto;
using CncModels.Dto.Settings;
using CncService;
using CncWebApi.Controllers;
using Xunit;
namespace CncWebApi.Tests
{
/// <summary>
/// SettingsController单元测试
/// 系统配置CRUD + 车间管理CRUD + 修改密码
/// </summary>
[Collection("Database")]
public class SettingsControllerTests
{
private readonly SettingsController _controller;
public SettingsControllerTests()
{
TestDb.TruncateAll();
_controller = ControllerFactory.CreateSettingsController();
}
#region 系统配置
#region GetSysConfigList - 配置列表
/// <summary>
/// 测试获取系统配置列表种子数据有admin_username和admin_password_hash
/// </summary>
[Fact]
public void GetSysConfigList_ShouldReturnConfigs()
{
var result = _controller.GetSysConfigList();
var response = ControllerFactory.Extract<List<SysConfigListItem>>(result);
ControllerFactory.AssertSuccess(response);
Assert.NotNull(response.Data);
Assert.True(response.Data.Count >= 2); // 至少有username和password_hash
}
#endregion
#region UpdateSysConfig - 编辑配置
/// <summary>
/// 测试:更新配置值成功
/// </summary>
[Fact]
public void UpdateSysConfig_ValidRequest_ShouldSuccess()
{
// 获取第一个配置ID
var list = ControllerFactory.Extract<List<SysConfigListItem>>(_controller.GetSysConfigList());
int configId = list.Data[0].Id;
var result = _controller.UpdateSysConfig(configId, new UpdateSysConfigRequest { ConfigValue = "new_value" });
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
}
/// <summary>
/// 测试请求为null时抛出异常
/// </summary>
[Fact]
public void UpdateSysConfig_NullRequest_ShouldThrow()
{
var ex = Assert.Throws<BusinessException>(() => _controller.UpdateSysConfig(1, null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
#endregion
#region ChangePassword - 修改密码
/// <summary>
/// 测试:修改密码成功
/// </summary>
[Fact]
public void ChangePassword_ValidRequest_ShouldSuccess()
{
// 设置真实密码哈希
TestDb.SetRealPasswordHash("old_password");
var result = _controller.ChangePassword(new ChangePasswordRequest
{
OldPassword = "old_password",
NewPassword = "new_password123"
});
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
// 验证密码哈希已更新
var newHash = TestDb.QuerySingle<string>("SELECT config_value FROM cnc_sys_config WHERE config_key = 'admin_password_hash'");
Assert.True(BCrypt.Net.BCrypt.Verify("new_password123", newHash));
}
/// <summary>
/// 测试请求为null时抛出异常
/// </summary>
[Fact]
public void ChangePassword_NullRequest_ShouldThrow()
{
Assert.Throws<BusinessException>(() => _controller.ChangePassword(null));
}
#endregion
#endregion
#region 车间管理
#region GetWorkshopList - 车间列表
/// <summary>
/// 测试车间列表返回种子数据A栋、B栋
/// </summary>
[Fact]
public void GetWorkshopList_ShouldReturnSeedData()
{
var result = _controller.GetWorkshopList(null);
var response = ControllerFactory.Extract<List<WorkshopListItem>>(result);
ControllerFactory.AssertSuccess(response);
Assert.Equal(2, response.Data.Count); // A栋、B栋
}
/// <summary>
/// 测试:关键字搜索车间
/// </summary>
[Fact]
public void GetWorkshopList_WithKeyword_ShouldFilter()
{
var result = _controller.GetWorkshopList("A");
var response = ControllerFactory.Extract<List<WorkshopListItem>>(result);
Assert.Single(response.Data);
Assert.Equal("A栋", response.Data[0].Name);
}
#endregion
#region CreateWorkshop - 新增车间
/// <summary>
/// 测试:新增车间成功
/// </summary>
[Fact]
public void CreateWorkshop_ValidRequest_ShouldReturnId()
{
var result = _controller.CreateWorkshop(new CreateWorkshopRequest { Name = "C栋", SortOrder = 3 });
var response = ControllerFactory.Extract<object>(result);
ControllerFactory.AssertSuccess(response);
}
/// <summary>
/// 测试:重复车间名抛出异常
/// </summary>
[Fact]
public void CreateWorkshop_DuplicateName_ShouldThrow()
{
Assert.Throws<BusinessException>(() =>
_controller.CreateWorkshop(new CreateWorkshopRequest { Name = "A栋", SortOrder = 1 }));
}
#endregion
#region UpdateWorkshop - 编辑车间
/// <summary>
/// 测试:编辑车间名称
/// </summary>
[Fact]
public void UpdateWorkshop_ValidRequest_ShouldSuccess()
{
var result = _controller.UpdateWorkshop(1, new UpdateWorkshopRequest { Name = "A栋改名", SortOrder = 1 });
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
var list = ControllerFactory.Extract<List<WorkshopListItem>>(_controller.GetWorkshopList(null));
Assert.Contains(list.Data, w => w.Name == "A栋改名");
}
/// <summary>
/// 测试:编辑不存在的车间抛出异常
/// </summary>
[Fact]
public void UpdateWorkshop_NotExisting_ShouldThrow()
{
Assert.Throws<BusinessException>(() =>
_controller.UpdateWorkshop(999, new UpdateWorkshopRequest { Name = "测试", SortOrder = 1 }));
}
#endregion
#region DeleteWorkshop - 删除车间
/// <summary>
/// 测试:删除车间成功
/// </summary>
[Fact]
public void DeleteWorkshop_Existing_ShouldSuccess()
{
// 新增一个车间来删除
_controller.CreateWorkshop(new CreateWorkshopRequest { Name = "删除用", SortOrder = 99 });
int id = TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_workshop");
var result = _controller.DeleteWorkshop(id);
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
}
/// <summary>
/// 测试删除不存在的车间不抛异常Service层影响0行
/// </summary>
[Fact]
public void DeleteWorkshop_NotExisting_ShouldNotThrow()
{
var result = _controller.DeleteWorkshop(999);
Assert.NotNull(result);
}
#endregion
#region ToggleWorkshop - 启停车间
/// <summary>
/// 测试:切换车间启用状态
/// </summary>
[Fact]
public void ToggleWorkshop_ShouldSuccess()
{
var result = _controller.ToggleWorkshop(1);
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
}
/// <summary>
/// 测试切换不存在的车间不抛异常Service层影响0行
/// </summary>
[Fact]
public void ToggleWorkshop_NotExisting_ShouldNotThrow()
{
var result = _controller.ToggleWorkshop(999);
Assert.NotNull(result);
}
#endregion
#endregion
}
}