feat(transport): carry IsMesReportable / IsMesReportableOverride through bundles (round-trip guard extended)

Claude-Session: https://claude.ai/code/session_01Y5ef34iUUMjmwnMpL9xgmB
This commit is contained in:
Joseph Doherty
2026-09-11 10:00:00 -04:00
parent af10af1573
commit 43973d34de
8 changed files with 178 additions and 7 deletions
@@ -396,6 +396,53 @@ public sealed class ArtifactDiffTests
ChangeFor(item, "Alarms.A"); // OnTriggerScriptName diverged — previously missed.
}
[Fact]
public void CompareTemplate_AlarmIsMesReportableChange_IsModified()
{
var existing = MakeTemplate("T1");
existing.Alarms.Add(new TemplateAlarm("A")
{
TriggerType = AlarmTriggerType.RangeViolation,
IsMesReportable = false,
});
var incoming = MakeTemplateDto("T1", alarms:
[
// every other alarm field identical; only IsMesReportable differs.
new TemplateAlarmDto("A", null, 0, AlarmTriggerType.RangeViolation, null, false, null,
IsMesReportable: true),
]);
var item = _diff.CompareTemplate(incoming, existing);
Assert.Equal(ConflictKind.Modified, item.Kind);
ChangeFor(item, "Alarms.A"); // IsMesReportable diverged.
}
[Fact]
public void CompareInstance_AlarmOverrideIsMesReportableChange_IsModified()
{
var existing = new Instance("inst-1") { State = InstanceState.Enabled };
existing.AlarmOverrides.Add(new InstanceAlarmOverride("HiAlarm")
{
TriggerConfigurationOverride = "{\"hi\":90}",
PriorityLevelOverride = 7,
IsMesReportableOverride = null,
});
var dto = MakeInstanceDto("inst-1", state: InstanceState.Enabled, alarmOverrides:
[
// identical apart from the MES-reportable override.
new InstanceAlarmOverrideDto("HiAlarm", "{\"hi\":90}", 7, IsMesReportableOverride: false),
]);
var item = _diff.CompareInstance(dto, existing);
Assert.Equal(ConflictKind.Modified, item.Kind);
var modified = ChangeFor(item, "AlarmOverrides.HiAlarm");
Assert.Equal("<modified>", modified.GetProperty("oldValue").GetString());
Assert.Equal("<modified>", modified.GetProperty("newValue").GetString());
}
// ============ M8: CompareSite ============
[Fact]
@@ -699,7 +746,8 @@ public sealed class ArtifactDiffTests
string template = "Tmpl",
string site = "site-a",
InstanceState state = InstanceState.Enabled,
IReadOnlyList<InstanceAttributeOverrideDto>? attributeOverrides = null) =>
IReadOnlyList<InstanceAttributeOverrideDto>? attributeOverrides = null,
IReadOnlyList<InstanceAlarmOverrideDto>? alarmOverrides = null) =>
new(
UniqueName: uniqueName,
TemplateName: template,
@@ -707,7 +755,7 @@ public sealed class ArtifactDiffTests
AreaName: null,
State: state,
AttributeOverrides: attributeOverrides ?? Array.Empty<InstanceAttributeOverrideDto>(),
AlarmOverrides: Array.Empty<InstanceAlarmOverrideDto>(),
AlarmOverrides: alarmOverrides ?? Array.Empty<InstanceAlarmOverrideDto>(),
NativeAlarmSourceOverrides: Array.Empty<InstanceNativeAlarmSourceOverrideDto>(),
ConnectionBindings: Array.Empty<InstanceConnectionBindingDto>());
}