diff --git a/Elternbeirat.Web.Tests/FixedTimeProvider.cs b/Elternbeirat.Web.Tests/FixedTimeProvider.cs
new file mode 100644
index 0000000..e8b99c5
--- /dev/null
+++ b/Elternbeirat.Web.Tests/FixedTimeProvider.cs
@@ -0,0 +1,13 @@
+namespace Elternbeirat.Web.Tests;
+
+///
Schön, dass Sie da sind.
\n"); + intro.Links.ShouldBe( + [ + new HomeLink("/events", "Kommende Termine"), + new HomeLink("/contact", "Kontakt aufnehmen"), + ]); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + public void Empty_body_gives_the_fallback(string? markdown) => + HomeIntro.Parse(markdown).ShouldBe(HomeIntro.Fallback); + + [Fact] + public void Body_without_heading_keeps_the_fallback_title_and_all_text() + { + var intro = HomeIntro.Parse("Nur ein Absatz."); + + intro.Title.ShouldBe(HomeIntro.FallbackTitle); + intro.IntroHtml.ShouldContain("Nur ein Absatz."); + intro.Links.ShouldBeEmpty(); + } + + [Fact] + public void Last_paragraph_with_other_text_stays_intro() + { + // "oder" would get lost in a button row, so the paragraph stays text. + var intro = HomeIntro.Parse("# Hallo\n\n[Termine](/events) oder [Kontakt](/contact)"); + + intro.Links.ShouldBeEmpty(); + intro.IntroHtml.ShouldContain("href=\"/events\""); + } + + [Fact] + public void Link_paragraph_that_is_not_last_stays_intro() + { + var intro = HomeIntro.Parse("# Hallo\n\n[Termine](/events)\n\nSchlusssatz."); + + intro.Links.ShouldBeEmpty(); + intro.IntroHtml.ShouldContain("Schlusssatz."); + } + + [Fact] + public void Heading_markup_is_reduced_to_its_text() + { + HomeIntro.Parse("# Willkommen beim **Elternbeirat**").Title.ShouldBe("Willkommen beim Elternbeirat"); + } +} diff --git a/Elternbeirat.Web.Tests/MarkdownTests.cs b/Elternbeirat.Web.Tests/MarkdownTests.cs index 038f9ca..969102a 100644 --- a/Elternbeirat.Web.Tests/MarkdownTests.cs +++ b/Elternbeirat.Web.Tests/MarkdownTests.cs @@ -78,4 +78,51 @@ public class MarkdownTests html.ShouldContain($"