using System;
using CncModels.Constants;
using CncModels.Dto;
using CncModels.Dto.Production;
using CncService;
using CncService.Impl;
using Xunit;
namespace CncService.Tests
{
///
/// ProductionService 产量管理测试
/// 测试场景:查询、日汇总、日期范围总产量、产量修正、参数校验
///
[Collection("Database")]
public class ProductionServiceTests : IDisposable
{
private readonly ProductionService _service;
public ProductionServiceTests()
{
TestDb.TruncateAll();
_service = ServiceFactory.CreateProductionService();
}
public void Dispose()
{
TestDb.TruncateAll();
}
// ======== GetList ========
[Fact]
public void GetList_无数据_返回空列表()
{
var result = _service.GetList(new ProductionQuery { Page = 1, PageSize = 20 });
Assert.NotNull(result);
Assert.Equal(0, result.Total);
}
[Fact]
public void GetList_查询参数为null_抛出BadRequest异常()
{
var ex = Assert.Throws(() => _service.GetList(null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
[Fact]
public void GetList_有产量数据_返回分页结果()
{
// 插入机床+日产量数据
TestDb.Execute(@"INSERT INTO cnc_collect_address (name, url, brand_id, collect_interval, is_enabled, created_at, updated_at)
VALUES ('测试地址', 'http://test', 1, 30, 1, NOW(), NOW())");
TestDb.Execute(@"INSERT INTO cnc_machine (device_code, name, workshop_id, collect_address_id, ip_address, brand_id, is_enabled, created_at, updated_at)
VALUES ('M001', '机床1', 1, 1, '0.0.0.0', 1, 1, NOW(), NOW())");
TestDb.Execute(@"INSERT INTO cnc_daily_production (machine_id, production_date, program_name, total_quantity, created_at, updated_at)
VALUES (1, CURDATE(), 'O0001', 100, NOW(), NOW())");
var result = _service.GetList(new ProductionQuery { Page = 1, PageSize = 20 });
Assert.Equal(1, result.Total);
}
// ======== GetSummary ========
[Fact]
public void GetSummary_今日无产量_返回0()
{
var summary = _service.GetSummary(null, null, null, null, null);
Assert.NotNull(summary);
Assert.Equal(0, summary.TotalQuantity);
}
[Fact]
public void GetSummary_指定日期有产量_返回正确数量()
{
TestDb.Execute(@"INSERT INTO cnc_collect_address (name, url, brand_id, collect_interval, is_enabled, created_at, updated_at)
VALUES ('测试地址', 'http://test', 1, 30, 1, NOW(), NOW())");
TestDb.Execute(@"INSERT INTO cnc_machine (device_code, name, workshop_id, collect_address_id, ip_address, brand_id, is_enabled, created_at, updated_at)
VALUES ('M001', '机床1', 1, 1, '0.0.0.0', 1, 1, NOW(), NOW())");
TestDb.Execute(@"INSERT INTO cnc_daily_production (machine_id, production_date, program_name, total_quantity, created_at, updated_at)
VALUES (1, CURDATE(), 'O0001', 150, NOW(), NOW())");
var summary = _service.GetSummary(DateTime.Today, null, null, null, null);
Assert.Equal(150, summary.TotalQuantity);
}
// ======== GetTotalByDateRange ========
[Fact]
public void GetTotalByDateRange_范围内无数据_返回0()
{
var total = _service.GetTotalByDateRange(
new DateTime(2020, 1, 1),
new DateTime(2020, 1, 31),
null);
Assert.Equal(0m, total);
}
// ======== Adjust ========
[Fact]
public void Adjust_正常修正_返回true()
{
var result = _service.Adjust(new ProductionAdjustRequest
{
TargetTable = "cnc_daily_production",
TargetId = 1,
FieldName = "total_quantity",
NewValue = "200",
Reason = "数据修正测试"
});
Assert.True(result);
}
[Fact]
public void Adjust_请求为null_抛出BadRequest异常()
{
var ex = Assert.Throws(() => _service.Adjust(null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
[Fact]
public void Adjust_修正记录已插入数据库()
{
_service.Adjust(new ProductionAdjustRequest
{
TargetTable = "cnc_daily_production",
TargetId = 1,
FieldName = "total_quantity",
NewValue = "200",
Reason = "测试原因"
});
var count = TestDb.QuerySingle("SELECT COUNT(*) FROM cnc_production_adjustment");
Assert.Equal(1, count);
}
}
}