using System.IO.Compression; using LehrerApp.Core.Models; using LehrerApp.Core.Services; using LehrerApp.Desktop.ViewModels.Students; using Xunit; namespace LehrerApp.Desktop.Tests; public sealed class CreateLetterDialogViewModelTests : IDisposable { private readonly string _directory = Path.Combine(Path.GetTempPath(), $"lehrerapp-letter-vm-tests-{Guid.NewGuid():N}"); public CreateLetterDialogViewModelTests() => Directory.CreateDirectory(_directory); [Fact] public void OhneVorlage_KannKeinenBriefErzeugen() { var student = StudentWithContact("Sehr geehrte Frau Muster,"); var vm = Build(student, new LetterTemplateService(_directory)); Assert.False(vm.CanGenerate); Assert.Contains(vm.Issues, i => i.Message.Contains("Vorlage", StringComparison.OrdinalIgnoreCase)); } [Fact] public void VerwendeteBriefanredeFehlt_BlockiertErzeugung() { var service = ServiceWithTemplate("Letter.Salutation"); var vm = Build(StudentWithContact(null), service); Assert.False(vm.CanGenerate); Assert.Contains(vm.Issues, i => i.Message.Contains("Briefanrede")); } [Fact] public void VollstaendigeDaten_ErzeugenEditierbareDocxKopie() { var service = ServiceWithTemplate("Letter.Salutation", "Student.FirstName", "CurrentDate"); var vm = Build(StudentWithContact("Sehr geehrte Frau Muster,"), service); var output = Path.Combine(_directory, "Brief.docx"); var generated = vm.Generate(output); Assert.True(generated); Assert.True(File.Exists(output)); using var archive = ZipFile.OpenRead(output); using var reader = new StreamReader(archive.GetEntry("word/document.xml")!.Open()); var xml = reader.ReadToEnd(); Assert.Contains("Sehr geehrte Frau Muster,", xml); Assert.Contains("Lena", xml); } [Fact] public void KontaktBearbeiten_SpeichertExpliziteBriefanrede() { var vm = new ContactEditDialogViewModel(new Contact { Name = "Frau Muster" }); vm.LetterSalutation = "Sehr geehrte Frau Muster,"; vm.SaveCommand.Execute(null); Assert.Equal("Sehr geehrte Frau Muster,", vm.Result!.LetterSalutation); } private CreateLetterDialogViewModel Build(Student student, LetterTemplateService service) => new(student, service, new FakeMemberships([]), new FakeGroups([])); private LetterTemplateService ServiceWithTemplate(params string[] tags) { var source = Path.Combine(_directory, $"{Guid.NewGuid():N}.docx"); using (var archive = ZipFile.Open(source, ZipArchiveMode.Create)) { var entry = archive.CreateEntry("word/document.xml"); using var writer = new StreamWriter(entry.Open()); var controls = string.Join("", tags.Select(tag => $"" + "Platzhalter")); writer.Write("" + $"{controls}"); } var service = new LetterTemplateService(Path.Combine(_directory, $"service-{Guid.NewGuid():N}")); service.Import(source, "Elternbrief"); return service; } private static Student StudentWithContact(string? salutation) => new() { FirstName = "Lena", LastName = "Beispiel", Contacts = [ new Contact { Name = "Frau Muster", Relation = "Mutter", LetterSalutation = salutation, Street = "Hauptstraße 1", PostalCode = "12345", City = "Musterstadt", }, ], }; public void Dispose() { if (Directory.Exists(_directory)) Directory.Delete(_directory, recursive: true); } }