using Xunit; using LehrerApp.WebUntis; namespace LehrerApp.WebUntis.Tests; public sealed class WebUntisLessonAbsenceParserTests { [Fact] public void Parse_UebernimmtAlleFelderUndZweistelligesJahr() { const string report = "\uFEFFSchüler*innen\tDatum\tFehlstd.\tUnentsch. Fehlstd.\tFehlmin.\tUnentsch. Fehlmin.\tZeit\tAbwesenheitsgrund\tENr\tErledigt\tAbwesenheit zählt\r\n" + "Erika Mustermann\t09.12.25\t1\t1\t45\t45\t09:40-10:25\tKrank\t(185120)\t09.12.25\ttrue\r\n"; var absence = Assert.Single(WebUntisLessonAbsenceParser.Parse(report)); Assert.Equal("Erika Mustermann", absence.StudentName); Assert.Equal(20251209, absence.Date); Assert.Equal(1, absence.AbsentPeriods); Assert.Equal(1, absence.UnexcusedAbsentPeriods); Assert.Equal(45, absence.AbsentMinutes); Assert.Equal(45, absence.UnexcusedAbsentMinutes); Assert.Equal(940, absence.StartTime); Assert.Equal(1025, absence.EndTime); Assert.Equal("Krank", absence.Reason); Assert.Equal(185120, absence.ExternKey); Assert.True(absence.ExternKeyInParentheses); Assert.Equal("09.12.25", absence.HandledOn); Assert.True(absence.Counts); } [Fact] public void Parse_AkzeptiertExterneSchuelerkennungOhneKlammern() { const string report = "Schüler*innen\tDatum\tFehlstd.\tUnentsch. Fehlstd.\tFehlmin.\tUnentsch. Fehlmin.\tZeit\tAbwesenheitsgrund\tENr\tErledigt\tAbwesenheit zählt\r\n" + "Max Muster\t27.01.26\t1\t0\t45\t0\t10:25-11:10\t\t178156\t\tfalse\r\n"; var absence = Assert.Single(WebUntisLessonAbsenceParser.Parse(report)); Assert.Equal(178156, absence.ExternKey); Assert.False(absence.ExternKeyInParentheses); Assert.Null(absence.Reason); Assert.Null(absence.HandledOn); Assert.False(absence.Counts); } [Fact] public void Parse_LehntUngueltigesDatumAb() { const string report = "Schüler*innen\tDatum\tFehlstd.\tUnentsch. Fehlstd.\tFehlmin.\tUnentsch. Fehlmin.\tZeit\tAbwesenheitsgrund\tENr\tErledigt\tAbwesenheit zählt\r\n" + "Max Muster\tkein-datum\t1\t0\t45\t0\t10:25-11:10\t\t178156\t\tfalse\r\n"; Assert.Throws(() => WebUntisLessonAbsenceParser.Parse(report)); } }