using LehrerApp.TemplateDesigner; using Xunit; namespace LehrerApp.TemplateDesigner.Tests; public sealed class ProjectLifecycleTests { [Fact] public void Reset_ErzeugtEinVollstaendigLeeresUnabhaengigesProjekt() { var viewModel = new DesignerViewModel(); viewModel.ImportAsset("logo.png", OnePixelPng); viewModel.Placeholders.Add(new("Test", LehrerApp.Templating.PlaceholderType.Text, false, "Wert")); viewModel.NewElementType = "IMG"; viewModel.NewContent = "logo.png"; viewModel.Reset(); Assert.Equal("neue-vorlage", viewModel.TemplateId); Assert.Equal("PAGE 210 297 mm\n", viewModel.LayoutSource); Assert.Empty(viewModel.Placeholders); Assert.Empty(viewModel.Assets); Assert.Empty(viewModel.AssetItems); Assert.Equal("de-DE", viewModel.MetadataItems.Single(x => x.Name == "language").Value); Assert.Equal("letter", viewModel.MetadataItems.Single(x => x.Name == "report-type").Value); Assert.Null(viewModel.SelectedAsset); Assert.Null(viewModel.PreviewImage); Assert.Equal("TEXT", viewModel.NewElementType); Assert.Equal("$Brieftext", viewModel.NewContent); Assert.False(viewModel.CanExport); } [Fact] public void FreieMetadaten_WerdenInDasManifestUebernommen() { var viewModel = new DesignerViewModel(); viewModel.MetadataItems.Add(new("school-year", "2026/27")); var manifest = viewModel.BuildManifest(); Assert.Equal("de-DE", manifest.Metadata["language"]); Assert.Equal("2026/27", manifest.Metadata["school-year"]); } [Fact] public void PlatzhalterAnlegen_WaehltIhnAusUndUebernimmtBearbeiteteDefinition() { var viewModel = new DesignerViewModel(); viewModel.Placeholders.Clear(); var placeholder = viewModel.AddPlaceholder(); placeholder.Name = "Sprache"; placeholder.Type = LehrerApp.Templating.PlaceholderType.Text; placeholder.Required = true; placeholder.Sample = "Deutsch"; Assert.Same(placeholder, viewModel.SelectedPlaceholder); var definition = Assert.Single(viewModel.BuildManifest().Placeholders); Assert.Equal("Sprache", definition.Name); Assert.Equal(LehrerApp.Templating.PlaceholderType.Text, definition.Type); Assert.True(definition.Required); viewModel.RemoveSelectedPlaceholder(); Assert.Empty(viewModel.Placeholders); Assert.Null(viewModel.SelectedPlaceholder); } [Fact] public void DoppeltePlatzhalternamen_WerdenVerstaendlichAbgelehnt() { var viewModel = new DesignerViewModel(); viewModel.Placeholders.Clear(); viewModel.Placeholders.Add(new("Name", LehrerApp.Templating.PlaceholderType.Text, false, "A")); viewModel.Placeholders.Add(new("Name", LehrerApp.Templating.PlaceholderType.Text, false, "B")); var exception = Assert.Throws(() => viewModel.BuildManifest()); Assert.Contains("mehrfach", exception.Message); } private static readonly byte[] OnePixelPng = Convert.FromBase64String( "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="); }