|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using CncModels.Entity;
|
|
|
using CncService;
|
|
|
using CncWebApi.Controllers;
|
|
|
using Xunit;
|
|
|
|
|
|
namespace CncWebApi.Tests
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// ScreenConfigController单元测试
|
|
|
/// 大屏卡片配置 + 筛选配置
|
|
|
/// </summary>
|
|
|
[Collection("Database")]
|
|
|
public class ScreenConfigControllerTests
|
|
|
{
|
|
|
private readonly ScreenConfigController _controller;
|
|
|
|
|
|
public ScreenConfigControllerTests()
|
|
|
{
|
|
|
TestDb.TruncateAll();
|
|
|
_controller = ControllerFactory.CreateScreenConfigController();
|
|
|
}
|
|
|
|
|
|
#region 卡片配置
|
|
|
|
|
|
#region GetConfigs - 配置列表
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:空数据库返回空配置列表
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void GetConfigs_EmptyDb_ShouldReturnEmpty()
|
|
|
{
|
|
|
var result = _controller.GetConfigs();
|
|
|
var response = ControllerFactory.Extract<List<ScreenConfig>>(result);
|
|
|
ControllerFactory.AssertSuccess(response);
|
|
|
Assert.NotNull(response.Data);
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region UpdateConfig - 编辑卡片
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:编辑卡片配置成功
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void UpdateConfig_ValidEntity_ShouldSuccess()
|
|
|
{
|
|
|
// 先插入一条配置
|
|
|
int configId = InsertScreenConfig("test_card", "测试卡片");
|
|
|
|
|
|
var result = _controller.UpdateConfig(configId, new ScreenConfig
|
|
|
{
|
|
|
CardKey = "test_card",
|
|
|
CardType = "stat",
|
|
|
Title = "已改名",
|
|
|
Metric = "count",
|
|
|
SortOrder = 1,
|
|
|
IsEnabled = 1
|
|
|
});
|
|
|
|
|
|
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:null参数抛出异常
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void UpdateConfig_NullEntity_ShouldThrow()
|
|
|
{
|
|
|
Assert.Throws<BusinessException>(() => _controller.UpdateConfig(1, null));
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region DeleteConfig - 删除卡片
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:删除卡片配置成功
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void DeleteConfig_Existing_ShouldSuccess()
|
|
|
{
|
|
|
int configId = InsertScreenConfig("del_card", "删除用");
|
|
|
var result = _controller.DeleteConfig(configId);
|
|
|
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region ToggleConfig - 启停卡片
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:切换卡片启用状态
|
|
|
/// 注意:ToggleConfig内部先GetConfigs获取对象再Update,
|
|
|
/// 由于ScreenConfigRepository.GetAll()使用SELECT *未做snake_case映射,
|
|
|
/// 导致CardKey等字段为null,Update时SQL报错。
|
|
|
/// 这是Repository层的已知映射bug,不是Controller层问题。
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void ToggleConfig_Existing_ShouldThrowDueToMappingBug()
|
|
|
{
|
|
|
int configId = InsertScreenConfig("toggle_card", "切换用", isEnabled: 1);
|
|
|
// 因为Repository的SELECT *映射bug,ToggleConfig会抛出MySqlException
|
|
|
Assert.ThrowsAny<Exception>(() => _controller.ToggleConfig(configId));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:切换不存在的卡片抛出异常
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void ToggleConfig_NotExisting_ShouldThrow()
|
|
|
{
|
|
|
Assert.Throws<BusinessException>(() => _controller.ToggleConfig(999));
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 筛选配置
|
|
|
|
|
|
#region GetFilters - 筛选列表
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:获取筛选配置
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void GetFilters_ShouldReturnList()
|
|
|
{
|
|
|
var result = _controller.GetFilters("main_screen");
|
|
|
var response = ControllerFactory.Extract<List<ScreenFilter>>(result);
|
|
|
ControllerFactory.AssertSuccess(response);
|
|
|
Assert.NotNull(response.Data);
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region CreateFilter - 新增筛选项
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:新增筛选项成功
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void CreateFilter_ValidEntity_ShouldReturnId()
|
|
|
{
|
|
|
var result = _controller.CreateFilter(new ScreenFilter
|
|
|
{
|
|
|
ScreenKey = "main_screen",
|
|
|
FilterType = "workshop",
|
|
|
FilterValue = "A栋",
|
|
|
IsDefault = 0,
|
|
|
SortOrder = 1
|
|
|
});
|
|
|
|
|
|
var response = ControllerFactory.Extract<object>(result);
|
|
|
ControllerFactory.AssertSuccess(response);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:null参数抛出异常
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void CreateFilter_NullEntity_ShouldThrow()
|
|
|
{
|
|
|
Assert.Throws<BusinessException>(() => _controller.CreateFilter(null));
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region UpdateFilter - 编辑筛选项
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:编辑筛选项成功
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void UpdateFilter_ValidEntity_ShouldSuccess()
|
|
|
{
|
|
|
int filterId = InsertScreenFilter("main_screen", "workshop", "A栋");
|
|
|
|
|
|
var result = _controller.UpdateFilter(filterId, new ScreenFilter
|
|
|
{
|
|
|
ScreenKey = "main_screen",
|
|
|
FilterType = "workshop",
|
|
|
FilterValue = "B栋",
|
|
|
IsDefault = 0,
|
|
|
SortOrder = 1
|
|
|
});
|
|
|
|
|
|
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:null参数抛出异常
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void UpdateFilter_NullEntity_ShouldThrow()
|
|
|
{
|
|
|
Assert.Throws<BusinessException>(() => _controller.UpdateFilter(1, null));
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region DeleteFilter - 删除筛选项
|
|
|
|
|
|
/// <summary>
|
|
|
/// 测试:删除筛选项成功
|
|
|
/// </summary>
|
|
|
[Fact]
|
|
|
public void DeleteFilter_Existing_ShouldSuccess()
|
|
|
{
|
|
|
int filterId = InsertScreenFilter("main_screen", "del", "删除用");
|
|
|
var result = _controller.DeleteFilter(filterId);
|
|
|
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 辅助方法
|
|
|
|
|
|
private int InsertScreenConfig(string key, string title, int isEnabled = 1)
|
|
|
{
|
|
|
TestDb.Execute(@"INSERT INTO cnc_screen_config (card_key, card_type, title, metric, sort_order, is_enabled, created_at, updated_at)
|
|
|
VALUES (@key, 'stat', @title, 'count', 1, @isEnabled, NOW(), NOW())", new { key, title, isEnabled });
|
|
|
return TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_screen_config");
|
|
|
}
|
|
|
|
|
|
private int InsertScreenFilter(string screenKey, string type, string value)
|
|
|
{
|
|
|
TestDb.Execute(@"INSERT INTO cnc_screen_filter (screen_key, filter_type, filter_value, is_default, sort_order)
|
|
|
VALUES (@screenKey, @type, @value, 0, 1)", new { screenKey, type, value });
|
|
|
return TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_screen_filter");
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
}
|