using System.Web.Http;
using System.Web.Http.Results;
using CncModels.Dto;
using CncRepository.Impl;
using CncRepository.Impl.Dashboard;
using CncRepository.Impl.Log;
using CncRepository.Interface;
using CncService.Impl;
using CncService.Interface;
using CncWebApi.Controllers;
using Xunit;
namespace CncWebApi.Tests
{
///
/// Controller工厂 —— 创建Controller实例用于单元测试
/// 直接实例化Controller,不经过HTTP管线(跳过JwtAuthFilter等过滤器)
/// 所有Repository/Service使用cnc_test真实数据库
///
public static class ControllerFactory
{
private static readonly string _conn = TestDb.ConnectionString;
private const string _jwtSecret = "test-jwt-secret-key-for-unit-testing-2024";
#region Repository 创建
private static ISysConfigRepository SysConfigRepo() => new SysConfigRepository(_conn);
private static IBrandRepository BrandRepo() => new BrandRepository(_conn);
private static IBrandFieldMappingRepository BrandFieldMappingRepo() => new BrandFieldMappingRepository(_conn);
private static ICollectAddressRepository CollectAddressRepo() => new CollectAddressRepository(_conn);
private static IMachineRepository MachineRepo() => new MachineRepository(_conn);
private static IWorkerRepository WorkerRepo() => new WorkerRepository(_conn);
private static IWorkerMachineRepository WorkerMachineRepo() => new WorkerMachineRepository(_conn);
private static IWorkshopRepository WorkshopRepo() => new WorkshopRepository(_conn);
private static IAlertRepository AlertRepo() => new AlertRepository(_conn);
private static IDailyProductionRepository DailyProductionRepo() => new DailyProductionRepository(_conn);
private static IProductionSegmentRepository ProductionSegmentRepo() => new ProductionSegmentRepository(_conn);
private static IProductionAdjustmentRepository ProductionAdjustmentRepo() => new ProductionAdjustmentRepository(_conn);
private static IScreenConfigRepository ScreenConfigRepo() => new ScreenConfigRepository(_conn);
private static IScreenFilterRepository ScreenFilterRepo() => new ScreenFilterRepository(_conn);
private static IDashboardRepository DashboardRepo() => new DashboardRepository(_conn);
private static ICollectorHeartbeatRepository HeartbeatRepo() => new CollectorHeartbeatRepository(_conn);
private static ISystemLogRepository SystemLogRepo() => new SystemLogRepository(_conn);
#endregion
#region Service 创建
private static IAuthService CreateAuthService() => new AuthService(SysConfigRepo(), _jwtSecret);
private static IDashboardService CreateDashboardService() => new DashboardService(DashboardRepo(), HeartbeatRepo());
private static IMachineService CreateMachineService() => new MachineService(MachineRepo(), CollectAddressRepo(), WorkerMachineRepo(), BrandRepo());
private static IBrandService CreateBrandService() => new BrandService(BrandRepo(), BrandFieldMappingRepo(), CollectAddressRepo());
private static ICollectAddressService CreateCollectAddressService() => new CollectAddressService(CollectAddressRepo(), MachineRepo(), BrandRepo());
private static IWorkerService CreateWorkerService() => new WorkerService(WorkerRepo(), WorkerMachineRepo(), MachineRepo());
private static IProductionService CreateProductionService() => new ProductionService(DailyProductionRepo(), ProductionSegmentRepo(), ProductionAdjustmentRepo());
private static IAlertService CreateAlertService() => new AlertService(AlertRepo());
private static IWorkshopService CreateWorkshopService() => new WorkshopService(WorkshopRepo());
private static IScreenService CreateScreenService() => new ScreenService(ScreenConfigRepo(), ScreenFilterRepo(), WorkshopRepo());
private static ISystemLogService CreateSystemLogService() => new SystemLogService(SystemLogRepo());
#endregion
#region Controller 创建
/// 创建AuthController(无JWT过滤)
public static AuthController CreateAuthController() => new AuthController(CreateAuthService());
/// 创建HealthController(无依赖)
public static HealthController CreateHealthController() => new HealthController();
/// 创建BrandController
public static BrandController CreateBrandController() => new BrandController(CreateBrandService());
/// 创建MachineController
public static MachineController CreateMachineController() => new MachineController(CreateMachineService());
/// 创建CollectAddressController
public static CollectAddressController CreateCollectAddressController() => new CollectAddressController(CreateCollectAddressService());
/// 创建WorkerController
public static WorkerController CreateWorkerController() => new WorkerController(CreateWorkerService());
/// 创建DashboardController
public static DashboardController CreateDashboardController() => new DashboardController(CreateDashboardService());
/// 创建SettingsController(系统配置+车间管理)
public static SettingsController CreateSettingsController() => new SettingsController(SysConfigRepo(), CreateWorkshopService());
/// 创建ProductionController
public static ProductionController CreateProductionController() => new ProductionController(CreateProductionService());
/// 创建AlertController
public static AlertController CreateAlertController() => new AlertController(CreateAlertService());
/// 创建LogController
public static LogController CreateLogController() => new LogController(CreateSystemLogService(), ProductionAdjustmentRepo());
/// 创建ScreenConfigController
public static ScreenConfigController CreateScreenConfigController() => new ScreenConfigController(CreateScreenService());
/// 创建ScreenController(大屏,无JWT过滤)
public static ScreenController CreateScreenController() => new ScreenController(CreateDashboardService(), CreateScreenService(), SysConfigRepo());
/// 创建OptionController
public static OptionController CreateOptionController() => new OptionController(
CreateWorkshopService(), CreateBrandService(), CreateMachineService(),
CreateWorkerService(), CreateCollectAddressService());
#endregion
#region 测试辅助方法
///
/// 从IHttpActionResult中提取ApiResponse<T>内容
/// Controller返回Ok(ApiResponse<T>.Success(data)),实际类型是OkNegotiatedContentResult<ApiResponse<T>>
///
public static ApiResponse Extract(IHttpActionResult result)
{
var okResult = result as OkNegotiatedContentResult>;
Assert.NotNull(okResult);
return okResult.Content;
}
///
/// 验证ApiResponse成功:Code=0, Message="success"
///
public static void AssertSuccess(ApiResponse response)
{
Assert.Equal(0, response.Code);
Assert.Equal("success", response.Message);
}
#endregion
}
}