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/BrandControllerTests.cs

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