添加AlarmService和TemplateService单元测试用例

main
821644@qq.com 3 weeks ago
parent 5b54ca569e
commit f5f8948d71

@ -0,0 +1,286 @@
using Xunit;
using Moq;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Haoliang.Core.Services;
using Haoliang.Models.System;
using Haoliang.Data.Repositories;
namespace Haoliang.Tests;
public class AlarmServiceTests
{
private readonly Mock<IAlarmRepository> _mockAlarmRepository;
private readonly AlarmService _alarmService;
public AlarmServiceTests()
{
_mockAlarmRepository = new Mock<IAlarmRepository>();
_alarmService = new AlarmService(_mockAlarmRepository.Object);
}
[Fact]
public async Task GetAllAlarmsAsync_ReturnsAlarmsFromRepository()
{
var alarms = new List<Alarm>
{
new Alarm { Id = 1, AlarmType = "DeviceOffline", AlarmContent = "Device 1 is offline" },
new Alarm { Id = 2, AlarmType = "DeviceError", AlarmContent = "Device 2 has error" }
};
_mockAlarmRepository.Setup(r => r.GetAllAsync()).ReturnsAsync(alarms);
var result = await _alarmService.GetAllAlarmsAsync();
result.Should().HaveCount(2);
result.Should().BeEquivalentTo(alarms);
}
[Fact]
public async Task GetAlarmByIdAsync_ReturnsAlarm_WhenExists()
{
var alarm = new Alarm { Id = 1, AlarmType = "DeviceOffline", AlarmContent = "Device offline" };
_mockAlarmRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(alarm);
var result = await _alarmService.GetAlarmByIdAsync(1);
result.Should().NotBeNull();
result!.Id.Should().Be(1);
}
[Fact]
public async Task GetAlarmByIdAsync_ReturnsNull_WhenNotExists()
{
_mockAlarmRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((Alarm?)null);
var result = await _alarmService.GetAlarmByIdAsync(999);
result.Should().BeNull();
}
[Fact]
public async Task CreateAlarmAsync_SetsCreatedAtAndOccurrenceTime()
{
var alarm = new Alarm { AlarmType = "DeviceOffline", AlarmContent = "Test alarm" };
_mockAlarmRepository.Setup(r => r.AddAsync(It.IsAny<Alarm>())).Returns(Task.CompletedTask);
_mockAlarmRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var beforeCreate = DateTime.Now;
var result = await _alarmService.CreateAlarmAsync(alarm);
var afterCreate = DateTime.Now;
result.CreatedAt.Should().BeOnOrAfter(beforeCreate);
result.CreatedAt.Should().BeOnOrBefore(afterCreate);
result.OccurrenceTime.Should().BeOnOrAfter(beforeCreate);
result.OccurrenceTime.Should().BeOnOrBefore(afterCreate);
}
[Fact]
public async Task DeleteAlarmAsync_ReturnsTrue_WhenAlarmExists()
{
var alarm = new Alarm { Id = 1 };
_mockAlarmRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(alarm);
_mockAlarmRepository.Setup(r => r.Remove(alarm)).Verifiable();
_mockAlarmRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var result = await _alarmService.DeleteAlarmAsync(1);
result.Should().BeTrue();
}
[Fact]
public async Task DeleteAlarmAsync_ReturnsFalse_WhenAlarmNotExists()
{
_mockAlarmRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((Alarm?)null);
var result = await _alarmService.DeleteAlarmAsync(999);
result.Should().BeFalse();
}
[Fact]
public async Task GetActiveAlarmsAsync_ReturnsUnresolvedAlarms()
{
var activeAlarms = new List<Alarm>
{
new Alarm { Id = 1, IsResolved = false, AlarmType = "DeviceOffline" },
new Alarm { Id = 2, IsResolved = false, AlarmType = "DeviceError" }
};
_mockAlarmRepository.Setup(r => r.GetActiveAlarmsAsync()).ReturnsAsync(activeAlarms);
var result = await _alarmService.GetActiveAlarmsAsync();
result.Should().HaveCount(2);
}
[Fact]
public async Task GetAlarmsByTypeAsync_ReturnsFilteredAlarms()
{
var typeAlarms = new List<Alarm>
{
new Alarm { Id = 1, AlarmType = "DeviceOffline" }
};
_mockAlarmRepository.Setup(r => r.GetAlarmsByTypeAsync("DeviceOffline")).ReturnsAsync(typeAlarms);
var result = await _alarmService.GetAlarmsByTypeAsync(AlarmType.DeviceOffline);
result.Should().HaveCount(1);
}
[Fact]
public async Task GetCriticalAlarmsAsync_ReturnsCriticalAlarms()
{
var criticalAlarms = new List<Alarm>
{
new Alarm { Id = 1, AlarmLevel = "Critical" }
};
_mockAlarmRepository.Setup(r => r.GetAlarmsByLevelAsync("Critical")).ReturnsAsync(criticalAlarms);
var result = await _alarmService.GetCriticalAlarmsAsync();
result.Should().HaveCount(1);
}
}
public class AlarmRuleServiceTests
{
private readonly AlarmRuleService _alarmRuleService;
public AlarmRuleServiceTests()
{
_alarmRuleService = new AlarmRuleService();
}
[Fact]
public async Task GetAllAlarmRulesAsync_ReturnsCreatedRules()
{
await _alarmRuleService.CreateAlarmRuleAsync(new AlarmRule
{
RuleName = "Rule1",
Condition = "Condition1",
AlarmType = "DeviceError",
AlarmLevel = "Low"
});
var result = await _alarmRuleService.GetAllAlarmRulesAsync();
result.Should().NotBeEmpty();
result.Should().HaveCount(1);
}
[Fact]
public async Task CreateAlarmRuleAsync_AddsRule_WithIncrementedId()
{
var rule = new AlarmRule
{
RuleName = "High Temperature",
Condition = "Temperature > 100",
AlarmType = "DeviceError",
AlarmLevel = "Critical",
IsEnabled = true
};
var result = await _alarmRuleService.CreateAlarmRuleAsync(rule);
result.Id.Should().BeGreaterThan(0);
result.CreatedAt.Should().BeCloseTo(DateTime.Now, TimeSpan.FromSeconds(1));
}
[Fact]
public async Task GetAlarmRuleByIdAsync_ReturnsRule_WhenExists()
{
var rule = new AlarmRule
{
RuleName = "High Temperature",
Condition = "Temperature > 100",
AlarmType = "DeviceError",
AlarmLevel = "Critical"
};
var created = await _alarmRuleService.CreateAlarmRuleAsync(rule);
var result = await _alarmRuleService.GetAlarmRuleByIdAsync(created.Id);
result.Should().NotBeNull();
result!.RuleName.Should().Be("High Temperature");
}
[Fact]
public async Task GetAlarmRuleByIdAsync_ReturnsNull_WhenNotExists()
{
var result = await _alarmRuleService.GetAlarmRuleByIdAsync(999);
result.Should().BeNull();
}
[Fact]
public async Task UpdateAlarmRuleAsync_UpdatesRule_WhenExists()
{
var rule = new AlarmRule
{
RuleName = "Original Rule",
Condition = "Original Condition",
AlarmType = "DeviceError",
AlarmLevel = "Low"
};
var created = await _alarmRuleService.CreateAlarmRuleAsync(rule);
var updated = await _alarmRuleService.UpdateAlarmRuleAsync(created.Id, new AlarmRule
{
RuleName = "Updated Rule",
Condition = "Updated Condition",
AlarmType = "DeviceError",
AlarmLevel = "Critical"
});
updated.Should().NotBeNull();
updated!.RuleName.Should().Be("Updated Rule");
updated.AlarmLevel.Should().Be("Critical");
}
[Fact]
public async Task UpdateAlarmRuleAsync_ReturnsNull_WhenNotExists()
{
var result = await _alarmRuleService.UpdateAlarmRuleAsync(999, new AlarmRule());
result.Should().BeNull();
}
[Fact]
public async Task DeleteAlarmRuleAsync_ReturnsTrue_WhenExists()
{
var rule = new AlarmRule { RuleName = "To Delete" };
var created = await _alarmRuleService.CreateAlarmRuleAsync(rule);
var result = await _alarmRuleService.DeleteAlarmRuleAsync(created.Id);
result.Should().BeTrue();
}
[Fact]
public async Task DeleteAlarmRuleAsync_ReturnsFalse_WhenNotExists()
{
var result = await _alarmRuleService.DeleteAlarmRuleAsync(999);
result.Should().BeFalse();
}
[Fact]
public async Task SetAlarmRuleEnabledAsync_EnablesRule()
{
var rule = new AlarmRule { RuleName = "Test Rule", IsEnabled = false };
var created = await _alarmRuleService.CreateAlarmRuleAsync(rule);
await _alarmRuleService.SetAlarmRuleEnabledAsync(created.Id, true);
var updated = await _alarmRuleService.GetAlarmRuleByIdAsync(created.Id);
updated!.IsEnabled.Should().BeTrue();
}
[Fact]
public async Task TestAlarmRuleAsync_Completes()
{
var rule = new AlarmRule { RuleName = "Test Rule" };
var created = await _alarmRuleService.CreateAlarmRuleAsync(rule);
await _alarmRuleService.TestAlarmRuleAsync(created.Id);
}
}

@ -0,0 +1,123 @@
using Xunit;
using Moq;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Haoliang.Core.Services;
using DeviceStatus = Haoliang.Models.Device.DeviceCurrentStatus;
namespace Haoliang.Tests;
public class ProductionCalculatorTests
{
[Fact]
public void CalculateProduction_SameProgram_ReturnsDifference()
{
var current = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 150,
RecordTime = DateTime.Now
};
var last = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 100,
RecordTime = DateTime.Now.AddMinutes(-1)
};
var result = Haoliang.Models.Production.ProductionCalculator.CalculateProduction(current, last);
result.Should().Be(50);
}
[Fact]
public void CalculateProduction_ProgramSwitch_ReturnsCurrentCount()
{
var current = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM002",
CumulativeCount = 50,
RecordTime = DateTime.Now
};
var last = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 100,
RecordTime = DateTime.Now.AddMinutes(-1)
};
var result = Haoliang.Models.Production.ProductionCalculator.CalculateProduction(current, last);
result.Should().Be(50);
}
[Fact]
public void CalculateProduction_NegativeValue_ReturnsZero()
{
var current = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 50,
RecordTime = DateTime.Now
};
var last = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 100,
RecordTime = DateTime.Now.AddMinutes(-1)
};
var result = Haoliang.Models.Production.ProductionCalculator.CalculateProduction(current, last);
result.Should().Be(0);
}
[Fact]
public void CalculateProduction_SameProgramZeroDiff_ReturnsZero()
{
var current = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 100,
RecordTime = DateTime.Now
};
var last = new DeviceStatus
{
DeviceId = 1,
NCProgram = "PROGRAM001",
CumulativeCount = 100,
RecordTime = DateTime.Now.AddMinutes(-1)
};
var result = Haoliang.Models.Production.ProductionCalculator.CalculateProduction(current, last);
result.Should().Be(0);
}
[Fact]
public void IsNewProgram_DifferentPrograms_ReturnsTrue()
{
var result = Haoliang.Models.Production.ProductionCalculator.IsNewProgram("PROGRAM001", "PROGRAM002");
result.Should().BeTrue();
}
[Fact]
public void IsNewProgram_SameProgram_ReturnsFalse()
{
var result = Haoliang.Models.Production.ProductionCalculator.IsNewProgram("PROGRAM001", "PROGRAM001");
result.Should().BeFalse();
}
}

@ -0,0 +1,230 @@
using Xunit;
using Moq;
using FluentAssertions;
using Haoliang.Core.Services;
using Haoliang.Models.Template;
using Haoliang.Data.Repositories;
namespace Haoliang.Tests;
public class TemplateServiceTests
{
private readonly Mock<ITemplateRepository> _mockTemplateRepository;
private readonly TemplateService _templateService;
public TemplateServiceTests()
{
_mockTemplateRepository = new Mock<ITemplateRepository>();
_templateService = new TemplateService(_mockTemplateRepository.Object);
}
[Fact]
public async Task GetAllTemplatesAsync_ReturnsTemplatesFromRepository()
{
var templates = new List<CNCBrandTemplate>
{
new CNCBrandTemplate { Id = 1, BrandName = "Fanuc", Description = "Fanuc CNC" },
new CNCBrandTemplate { Id = 2, BrandName = "Mitsubishi", Description = "Mitsubishi CNC" }
};
_mockTemplateRepository.Setup(r => r.GetAllAsync()).ReturnsAsync(templates);
var result = await _templateService.GetAllTemplatesAsync();
result.Should().HaveCount(2);
result.Should().BeEquivalentTo(templates);
}
[Fact]
public async Task GetTemplateByIdAsync_ReturnsTemplate_WhenExists()
{
var template = new CNCBrandTemplate { Id = 1, BrandName = "Fanuc", Description = "Fanuc CNC" };
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(template);
var result = await _templateService.GetTemplateByIdAsync(1);
result.Should().NotBeNull();
result!.BrandName.Should().Be("Fanuc");
}
[Fact]
public async Task GetTemplateByIdAsync_ReturnsNull_WhenNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.GetTemplateByIdAsync(999);
result.Should().BeNull();
}
[Fact]
public async Task CreateTemplateAsync_SetsCreatedAtUpdatedAtAndIsEnabled()
{
var template = new CNCBrandTemplate { BrandName = "NewBrand", Description = "New CNC" };
_mockTemplateRepository.Setup(r => r.AddAsync(It.IsAny<CNCBrandTemplate>())).Returns(Task.CompletedTask);
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var beforeCreate = DateTime.Now;
var result = await _templateService.CreateTemplateAsync(template);
var afterCreate = DateTime.Now;
result.CreatedAt.Should().BeOnOrAfter(beforeCreate);
result.CreatedAt.Should().BeOnOrBefore(afterCreate);
result.UpdatedAt.Should().BeOnOrAfter(beforeCreate);
result.UpdatedAt.Should().BeOnOrBefore(afterCreate);
result.IsEnabled.Should().BeTrue();
}
[Fact]
public async Task UpdateTemplateAsync_UpdatesTemplate_WhenExists()
{
var existing = new CNCBrandTemplate { Id = 1, BrandName = "Original", Description = "Original Desc" };
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(existing);
_mockTemplateRepository.Setup(r => r.Update(It.IsAny<CNCBrandTemplate>())).Verifiable();
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var updated = await _templateService.UpdateTemplateAsync(1, new CNCBrandTemplate
{
BrandName = "Updated",
Description = "Updated Desc"
});
updated.Should().NotBeNull();
updated!.BrandName.Should().Be("Updated");
updated.Description.Should().Be("Updated Desc");
}
[Fact]
public async Task UpdateTemplateAsync_ReturnsNull_WhenNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.UpdateTemplateAsync(999, new CNCBrandTemplate());
result.Should().BeNull();
}
[Fact]
public async Task DeleteTemplateAsync_ReturnsTrue_WhenTemplateExists()
{
var template = new CNCBrandTemplate { Id = 1 };
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(template);
_mockTemplateRepository.Setup(r => r.Remove(template)).Verifiable();
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var result = await _templateService.DeleteTemplateAsync(1);
result.Should().BeTrue();
}
[Fact]
public async Task DeleteTemplateAsync_ReturnsFalse_WhenTemplateNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.DeleteTemplateAsync(999);
result.Should().BeFalse();
}
[Fact]
public async Task EnableTemplateAsync_CallsUpdateTemplateEnabled()
{
_mockTemplateRepository.Setup(r => r.UpdateTemplateEnabledAsync(1, true)).Returns(Task.CompletedTask);
var result = await _templateService.EnableTemplateAsync(1);
result.Should().BeTrue();
_mockTemplateRepository.Verify(r => r.UpdateTemplateEnabledAsync(1, true), Times.Once);
}
[Fact]
public async Task DisableTemplateAsync_CallsUpdateTemplateEnabled()
{
_mockTemplateRepository.Setup(r => r.UpdateTemplateEnabledAsync(1, false)).Returns(Task.CompletedTask);
var result = await _templateService.DisableTemplateAsync(1);
result.Should().BeTrue();
_mockTemplateRepository.Verify(r => r.UpdateTemplateEnabledAsync(1, false), Times.Once);
}
[Fact]
public async Task CloneTemplateAsync_CreatesCopyWithNewName()
{
var original = new CNCBrandTemplate
{
Id = 1,
BrandName = "Original",
Description = "Original Description",
FieldMappings = new List<TemplateFieldMapping>
{
new TemplateFieldMapping { SourceFieldPath = "tag1", StandardFieldId = "Status" }
}
};
_mockTemplateRepository.Setup(r => r.GetByIdAsync(1)).ReturnsAsync(original);
_mockTemplateRepository.Setup(r => r.AddAsync(It.IsAny<CNCBrandTemplate>())).Returns(Task.CompletedTask);
_mockTemplateRepository.Setup(r => r.SaveAsync()).ReturnsAsync(1);
var result = await _templateService.CloneTemplateAsync(1, "ClonedTemplate");
result.Should().NotBeNull();
result!.BrandName.Should().Be("ClonedTemplate");
result.Description.Should().Be("Original Description (Cloned)");
result.FieldMappings.Should().HaveCount(1);
result.IsEnabled.Should().BeFalse();
}
[Fact]
public async Task CloneTemplateAsync_ReturnsNull_WhenOriginalNotExists()
{
_mockTemplateRepository.Setup(r => r.GetByIdAsync(999)).ReturnsAsync((CNCBrandTemplate?)null);
var result = await _templateService.CloneTemplateAsync(999, "NewName");
result.Should().BeNull();
}
[Fact]
public async Task GetTemplatesByBrandAsync_ReturnsMatchingTemplates()
{
var templates = new List<CNCBrandTemplate>
{
new CNCBrandTemplate { Id = 1, BrandName = "Fanuc" }
};
_mockTemplateRepository.Setup(r => r.FindAsync(t => t.BrandName == "Fanuc")).ReturnsAsync(templates);
var result = await _templateService.GetTemplatesByBrandAsync("Fanuc");
result.Should().HaveCount(1);
}
[Fact]
public async Task GetActiveTemplatesAsync_ReturnsEnabledTemplates()
{
var activeTemplates = new List<CNCBrandTemplate>
{
new CNCBrandTemplate { Id = 1, BrandName = "Fanuc", IsEnabled = true }
};
_mockTemplateRepository.Setup(r => r.GetEnabledTemplatesAsync()).ReturnsAsync(activeTemplates);
var result = await _templateService.GetActiveTemplatesAsync();
result.Should().HaveCount(1);
}
[Fact]
public async Task ValidateTemplateAsync_ReturnsTrue()
{
var template = new CNCBrandTemplate { BrandName = "Test", Description = "Test" };
var result = await _templateService.ValidateTemplateAsync(template);
result.Should().BeTrue();
}
[Fact]
public async Task TestTemplateAsync_Completes()
{
await _templateService.TestTemplateAsync(1);
}
}
Loading…
Cancel
Save