using System.Collections.Generic; using System.Linq; using CncModels.Dto; using CncModels.Dto.Brand; using CncService; using CncWebApi.Controllers; using Xunit; namespace CncWebApi.Tests { /// /// BrandController单元测试 /// 品牌CRUD + 复制 + 启停 + 标准字段 /// [Collection("Database")] public class BrandControllerTests { private readonly BrandController _controller; public BrandControllerTests() { TestDb.TruncateAll(); _controller = ControllerFactory.CreateBrandController(); } #region GetList - 品牌列表 /// /// 测试:获取品牌列表,种子数据包含FANUC /// [Fact] public void GetList_ShouldReturnBrandList() { // Act var result = _controller.GetList(); // Assert var response = ControllerFactory.Extract>(result); ControllerFactory.AssertSuccess(response); Assert.NotNull(response.Data); Assert.Single(response.Data); // 种子数据只有FANUC Assert.Equal("FANUC", response.Data[0].BrandName); } /// /// 测试:新增品牌后列表数量增加 /// [Fact] public void GetList_AfterCreate_ShouldHaveTwoBrands() { // Arrange - 新增一个品牌 _controller.Create(new CreateBrandRequest { BrandName = "Siemens", DeviceField = "device", TagsPath = "tags" }); // Act var result = _controller.GetList(); // Assert var response = ControllerFactory.Extract>(result); Assert.Equal(2, response.Data.Count); } #endregion #region GetById - 品牌详情 /// /// 测试:获取FANUC品牌详情 /// [Fact] public void GetById_ExistingBrand_ShouldReturnDetail() { // Act var result = _controller.GetById(1); // Assert var response = ControllerFactory.Extract(result); ControllerFactory.AssertSuccess(response); Assert.NotNull(response.Data); Assert.Equal("FANUC", response.Data.BrandName); Assert.NotNull(response.Data.Mappings); } /// /// 测试:获取不存在的品牌抛出异常 /// [Fact] public void GetById_NotExisting_ShouldThrowBusinessException() { // Act & Assert var ex = Assert.Throws(() => _controller.GetById(999)); Assert.Equal("品牌不存在", ex.Message); } #endregion #region Create - 新增品牌 /// /// 测试:新增品牌成功 /// [Fact] public void Create_ValidRequest_ShouldReturnNewId() { // Arrange var request = new CreateBrandRequest { BrandName = "Mitsubishi", DeviceField = "device", TagsPath = "tags" }; // Act var result = _controller.Create(request); // Assert var response = ControllerFactory.Extract(result); ControllerFactory.AssertSuccess(response); Assert.NotNull(response.Data); } /// /// 测试:新增重复品牌名抛出异常 /// [Fact] public void Create_DuplicateName_ShouldThrowBusinessException() { // Arrange - FANUC已存在于种子数据 var request = new CreateBrandRequest { BrandName = "FANUC", DeviceField = "device", TagsPath = "tags" }; // Act & Assert var ex = Assert.Throws(() => _controller.Create(request)); Assert.Equal("品牌名称已存在", ex.Message); } #endregion #region Update - 编辑品牌 /// /// 测试:编辑品牌名称成功 /// [Fact] public void Update_ValidRequest_ShouldSuccess() { // Arrange var request = new UpdateBrandRequest { BrandName = "FANUC-Updated", DeviceField = "device", TagsPath = "tags" }; // Act var result = _controller.Update(1, request); // Assert var response = ControllerFactory.Extract(result); ControllerFactory.AssertSuccess(response); // 验证修改后名称 var detail = ControllerFactory.Extract(_controller.GetById(1)); Assert.Equal("FANUC-Updated", detail.Data.BrandName); } /// /// 测试:编辑不存在的品牌抛出异常 /// [Fact] public void Update_NotExisting_ShouldThrowBusinessException() { var request = new UpdateBrandRequest { BrandName = "Test", DeviceField = "d", TagsPath = "t" }; Assert.Throws(() => _controller.Update(999, request)); } #endregion #region Delete - 删除品牌 /// /// 测试:删除品牌成功 /// [Fact] public void Delete_ExistingBrand_ShouldSuccess() { // 先新增一个品牌(避免删除种子FANUC) var createResult = _controller.Create(new CreateBrandRequest { BrandName = "ToDelete", DeviceField = "d", TagsPath = "t" }); // 获取新品牌ID int newId = TestDb.QuerySingle("SELECT MAX(id) FROM cnc_brand"); // Act var result = _controller.Delete(newId); // Assert ControllerFactory.AssertSuccess(ControllerFactory.Extract(result)); // 删除后列表只剩FANUC var list = ControllerFactory.Extract>(_controller.GetList()); Assert.Single(list.Data); } /// /// 测试:删除不存在的品牌抛出异常 /// [Fact] public void Delete_NotExisting_ShouldThrowBusinessException() { Assert.Throws(() => _controller.Delete(999)); } #endregion #region Copy - 复制品牌 /// /// 测试:复制FANUC品牌成功 /// [Fact] public void Copy_ExistingBrand_ShouldReturnNewId() { // Act var result = _controller.Copy(1); // Assert var response = ControllerFactory.Extract(result); ControllerFactory.AssertSuccess(response); // 列表应有两项 var list = ControllerFactory.Extract>(_controller.GetList()); Assert.Equal(2, list.Data.Count); } /// /// 测试:复制不存在的品牌抛出异常 /// [Fact] public void Copy_NotExisting_ShouldThrowBusinessException() { Assert.Throws(() => _controller.Copy(999)); } #endregion #region ToggleEnabled - 启停品牌 /// /// 测试:切换品牌启用状态成功 /// [Fact] public void ToggleEnabled_ExistingBrand_ShouldSuccess() { // Act var result = _controller.ToggleEnabled(1); // Assert ControllerFactory.AssertSuccess(ControllerFactory.Extract(result)); } /// /// 测试:切换不存在的品牌不会抛异常(Service层不检查存在性,返回0行受影响) /// [Fact] public void ToggleEnabled_NotExisting_ShouldNotThrow() { // 不存在的ID,Service层执行UPDATE但影响0行,不抛异常 var result = _controller.ToggleEnabled(999); Assert.NotNull(result); } #endregion #region GetStandardFields - 标准字段列表 /// /// 测试:获取标准字段列表返回非空 /// [Fact] public void GetStandardFields_ShouldReturnFields() { // Act var result = _controller.GetStandardFields(); // Assert var response = ControllerFactory.Extract>(result); ControllerFactory.AssertSuccess(response); Assert.NotNull(response.Data); } #endregion } }