feat(template-engine): persist IsMesReportable on alarm update; IsMesReportableOverride on SetAlarmOverrideAsync

Claude-Session: https://claude.ai/code/session_01Y5ef34iUUMjmwnMpL9xgmB
This commit is contained in:
Joseph Doherty
2026-09-11 09:56:54 -04:00
parent 30a23458e9
commit af10af1573
4 changed files with 160 additions and 1 deletions
@@ -220,6 +220,101 @@ public class InstanceServiceTests
Assert.Contains("locked", result.Error, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public async Task SetAlarmOverrideAsync_StoresIsMesReportableOverride()
{
var instance = new Instance("Inst1") { Id = 1, TemplateId = 1 };
_repoMock.Setup(r => r.GetInstanceByIdAsync(1, It.IsAny<CancellationToken>()))
.ReturnsAsync(instance);
_repoMock.Setup(r => r.GetAllTemplatesAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(new List<Template>
{
TemplateWithAlarms(1, new TemplateAlarm("HighTemp") { Id = 10, IsLocked = false })
});
_repoMock.Setup(r => r.GetAlarmOverrideAsync(1, "HighTemp", It.IsAny<CancellationToken>()))
.ReturnsAsync((InstanceAlarmOverride?)null);
_repoMock.Setup(r => r.SaveChangesAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(1);
InstanceAlarmOverride? added = null;
_repoMock.Setup(r => r.AddInstanceAlarmOverrideAsync(
It.IsAny<InstanceAlarmOverride>(), It.IsAny<CancellationToken>()))
.Callback<InstanceAlarmOverride, CancellationToken>((o, _) => added = o);
var result = await _sut.SetAlarmOverrideAsync(
1, "HighTemp", "{}", null, "admin", isMesReportableOverride: true);
Assert.True(result.IsSuccess);
Assert.NotNull(added);
Assert.True(added!.IsMesReportableOverride);
Assert.True(result.Value.IsMesReportableOverride);
}
[Fact]
public async Task SetAlarmOverrideAsync_NullIsMesReportableOverride_ClearsExistingOverride()
{
var instance = new Instance("Inst1") { Id = 1, TemplateId = 1 };
_repoMock.Setup(r => r.GetInstanceByIdAsync(1, It.IsAny<CancellationToken>()))
.ReturnsAsync(instance);
_repoMock.Setup(r => r.GetAllTemplatesAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(new List<Template>
{
TemplateWithAlarms(1, new TemplateAlarm("HighTemp") { Id = 10, IsLocked = false })
});
var existingOverride = new InstanceAlarmOverride("HighTemp")
{
Id = 5,
InstanceId = 1,
IsMesReportableOverride = true
};
_repoMock.Setup(r => r.GetAlarmOverrideAsync(1, "HighTemp", It.IsAny<CancellationToken>()))
.ReturnsAsync(existingOverride);
_repoMock.Setup(r => r.SaveChangesAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(1);
var result = await _sut.SetAlarmOverrideAsync(
1, "HighTemp", "{}", null, "admin", isMesReportableOverride: null);
Assert.True(result.IsSuccess);
Assert.Null(existingOverride.IsMesReportableOverride);
Assert.Null(result.Value.IsMesReportableOverride);
_repoMock.Verify(r => r.UpdateInstanceAlarmOverrideAsync(
It.Is<InstanceAlarmOverride>(o => o.IsMesReportableOverride == null),
It.IsAny<CancellationToken>()), Times.Once);
}
[Fact]
public async Task SetAlarmOverrideAsync_UpdatesIsMesReportableOverrideOnExisting()
{
var instance = new Instance("Inst1") { Id = 1, TemplateId = 1 };
_repoMock.Setup(r => r.GetInstanceByIdAsync(1, It.IsAny<CancellationToken>()))
.ReturnsAsync(instance);
_repoMock.Setup(r => r.GetAllTemplatesAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(new List<Template>
{
TemplateWithAlarms(1, new TemplateAlarm("HighTemp") { Id = 10, IsLocked = false })
});
var existingOverride = new InstanceAlarmOverride("HighTemp")
{
Id = 5,
InstanceId = 1,
IsMesReportableOverride = null
};
_repoMock.Setup(r => r.GetAlarmOverrideAsync(1, "HighTemp", It.IsAny<CancellationToken>()))
.ReturnsAsync(existingOverride);
_repoMock.Setup(r => r.SaveChangesAsync(It.IsAny<CancellationToken>()))
.ReturnsAsync(1);
var result = await _sut.SetAlarmOverrideAsync(
1, "HighTemp", "{}", 3, "admin", isMesReportableOverride: false);
Assert.True(result.IsSuccess);
Assert.False(existingOverride.IsMesReportableOverride);
Assert.Equal(3, existingOverride.PriorityLevelOverride);
}
[Fact]
public async Task Enable_ExistingInstance_SetsEnabled()
{