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.

286 lines
8.8 KiB
C#

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);
}
}