Add shared export infrastructure

This commit is contained in:
2026-08-18 21:21:56 +02:00
parent 41bf2c0756
commit 26461bd2f2
13 changed files with 336 additions and 63 deletions
@@ -0,0 +1,32 @@
using LehrerApp.Desktop.Services;
using System.Text;
using Xunit;
namespace LehrerApp.Desktop.Tests;
public sealed class CsvBuilderTests
{
[Fact]
public void AddRow_MaskiertTrennzeichen_AnfuehrungszeichenUndZeilenumbrueche()
{
var csv = new CsvBuilder()
.AddRow("Normal", "A;B", "Zitat \"wichtig\"", "Zeile 1\nZeile 2")
.ToString();
Assert.Contains("Normal;\"A;B\"", csv);
Assert.Contains("\"Zitat \"\"wichtig\"\"\"", csv);
Assert.Contains("\"Zeile 1\nZeile 2\"", csv);
}
[Fact]
public void CsvExportfile_BereinigtDateinameUndErgaenztEndungUndUtf8Bom()
{
var export = ExportFile.Csv("Export", "Auswertung/Chemie", "Änderung");
var bytes = export.Content.ToArray();
var preamble = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true).GetPreamble();
Assert.Equal("Auswertung_Chemie.csv", export.SuggestedFileName);
Assert.Equal(preamble, bytes[..preamble.Length]);
Assert.Equal("Änderung", Encoding.UTF8.GetString(bytes[preamble.Length..]));
}
}
@@ -597,4 +597,53 @@ public sealed class WorkloadEvaluationViewModelTests
Assert.Contains("Soll:", vm.RequiredVsActualDisplay);
Assert.Contains("Ist: 1 h", vm.RequiredVsActualDisplay);
}
[Fact]
public void ExportCsv_EnthaeltZeitraumSummenUndKorrektMaskierteAufschluesselung()
{
var group = new LearningGroup { Name = "8a \"Chemie\"" };
var entries = new FakeTimeEntries();
entries.Add(new TimeEntry
{
Category = "Korrektur; schriftlich",
GroupId = group.Id,
Date = new DateOnly(2026, 3, 5),
DurationMinutes = 90,
});
var vm = new WorkloadEvaluationViewModel(entries, new FakeGroups([group]),
BuildSettingsService(), new SchoolYearService())
{
SelectedYear = 2026,
};
vm.SelectedMonth = vm.MonthOptions[2];
var csv = vm.ExportCsv();
Assert.Contains("Zeitraum;01.03.2026;31.03.2026", csv);
Assert.Contains("Gesamtzeit (Minuten);90", csv);
Assert.Contains("\"Korrektur; schriftlich\";90;1,5", csv);
Assert.Contains("\"8a \"\"Chemie\"\"\";90;1,5", csv);
Assert.Equal("Arbeitszeitauswertung_2026-03.csv", vm.ExportSuggestedFileName);
}
[Fact]
public void ExportCsv_MitPflichtstunden_EnthaeltSollzeitUndAbweichung()
{
var entries = new FakeTimeEntries();
entries.Add(new TimeEntry { Category = "Unterricht", Date = new DateOnly(2026, 3, 2), DurationMinutes = 60 });
var vm = new WorkloadEvaluationViewModel(entries, new FakeGroups([]),
BuildSettingsService(), new SchoolYearService())
{
SelectedYear = 2026,
RequiredWeeklyHoursText = "10",
};
vm.SelectedMonth = vm.MonthOptions[2];
vm.SaveRequiredWeeklyHoursCommand.Execute(null);
var csv = vm.ExportCsv();
Assert.Contains("Pflichtstunden pro Woche;10", csv);
Assert.Contains("Sollzeit (Stunden);", csv);
Assert.Contains("Abweichung (Stunden);", csv);
}
}