feat(native-alarms): optional MesReportable column in the native-source override CSV import (ScadaBridge#102 item 4)

CLI import no longer has to reset MES overrides to inherit; a legacy 4-column file
still parses and the Central UI import keeps the stored flag for it.

Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
This commit is contained in:
Joseph Doherty
2026-11-09 15:31:11 -05:00
parent b540d8ac2c
commit 62fe1e685d
7 changed files with 126 additions and 27 deletions
@@ -84,6 +84,24 @@ public class InstanceConfigureNativeAlarmCsvImportTests
Assert.Null(pump.Filter);
}
/// <summary>Gitea #102: the MesReportable column flows through the import rows.</summary>
[Fact]
public void MesColumn_FlowsThroughToImportRows()
{
var csv = "SourceName,Connection,SourceReference,Filter,MesReportable\n"
+ "BoilerAlarms,,,,true\n"
+ "PumpAlarms,,,,\n";
var parsed = NativeAlarmSourceOverrideCsvParser.Parse(csv);
var outcome = InstanceConfigure.BuildNativeAlarmSourceCsvImport(parsed, Sources());
Assert.False(outcome.HasErrors);
Assert.True(outcome.Rows[0].HasMesColumn);
Assert.True(outcome.Rows[0].MesReportable);
Assert.True(outcome.Rows[1].HasMesColumn);
Assert.Null(outcome.Rows[1].MesReportable);
}
/// <summary>Verifies that a row with all fields blank is marked as a clear.</summary>
[Fact]
public void AllBlankRow_IsMarkedAsClear()
@@ -154,4 +154,47 @@ public class NativeAlarmSourceOverrideCsvParserTests
Assert.Empty(result.Errors);
Assert.Single(result.Rows);
}
/// <summary>Gitea #102: the optional MesReportable column parses blank/true/false.</summary>
[Fact]
public void Parse_MesReportableColumn_ParsesTriState()
{
const string csv =
"SourceName,Connection,SourceReference,Filter,MesReportable\n" +
"A,,,,true\n" +
"B,,,,FALSE\n" +
"C,,,,\n";
var result = NativeAlarmSourceOverrideCsvParser.Parse(csv);
Assert.Empty(result.Errors);
Assert.All(result.Rows, r => Assert.True(r.HasMesColumn));
Assert.True(result.Rows[0].MesReportable);
Assert.False(result.Rows[1].MesReportable);
Assert.Null(result.Rows[2].MesReportable);
}
/// <summary>Gitea #102: a legacy 4-column file still parses and reports no MES column.</summary>
[Fact]
public void Parse_FourColumnFile_HasNoMesColumn()
{
var result = NativeAlarmSourceOverrideCsvParser.Parse(
"SourceName,Connection,SourceReference,Filter\nA,,,\n");
Assert.Empty(result.Errors);
var row = Assert.Single(result.Rows);
Assert.False(row.HasMesColumn);
Assert.Null(row.MesReportable);
}
/// <summary>Gitea #102: an unparseable MesReportable value is a line error.</summary>
[Fact]
public void Parse_InvalidMesReportable_ReportsLineError()
{
var result = NativeAlarmSourceOverrideCsvParser.Parse(
"SourceName,Connection,SourceReference,Filter,MesReportable\nA,,,,maybe\n");
Assert.Empty(result.Rows);
Assert.Contains(result.Errors, e => e.Contains("Line 2") && e.Contains("MesReportable"));
}
}