Skip to content

Commit feaba9b

Browse files
committed
test: add unit tests for MarkdownPlainText extraction functionality and enhance SearchIndex tests for body content
1 parent e15b514 commit feaba9b

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using ShellDocs.Core;
2+
using Xunit;
3+
4+
namespace ShellDocs.Tests;
5+
6+
public class MarkdownPlainTextTests
7+
{
8+
[Fact]
9+
public void Extract_StripsFrontmatter()
10+
{
11+
var text = MarkdownPlainText.Extract("---\ntitle: Foo\n---\nHello world");
12+
Assert.Equal("Hello world", text);
13+
}
14+
15+
[Fact]
16+
public void Extract_StripsFencedCodeBlocks()
17+
{
18+
var md = "Prose before.\n\n```csharp\nvar x = 1;\n```\n\nProse after.";
19+
var text = MarkdownPlainText.Extract(md);
20+
Assert.Contains("Prose before", text);
21+
Assert.Contains("Prose after", text);
22+
Assert.DoesNotContain("var x = 1", text);
23+
}
24+
25+
[Fact]
26+
public void Extract_StripsRazorComponentTags()
27+
{
28+
var text = MarkdownPlainText.Extract("Before <Callout Title=\"x\">body</Callout> after.");
29+
Assert.DoesNotContain("<Callout", text);
30+
Assert.Contains("body", text);
31+
Assert.Contains("Before", text);
32+
Assert.Contains("after", text);
33+
}
34+
35+
[Fact]
36+
public void Extract_UnwrapsLinksAndImages()
37+
{
38+
var text = MarkdownPlainText.Extract("See [our docs](https://x.com) and ![alt](/img.png).");
39+
Assert.Contains("our docs", text);
40+
Assert.Contains("alt", text);
41+
Assert.DoesNotContain("https://", text);
42+
Assert.DoesNotContain("img.png", text);
43+
}
44+
45+
[Fact]
46+
public void Extract_UnwrapsEmphasisAndInlineCode()
47+
{
48+
var text = MarkdownPlainText.Extract("This is **bold**, *italic*, and `code`.");
49+
Assert.Contains("bold", text);
50+
Assert.Contains("italic", text);
51+
Assert.Contains("code", text);
52+
Assert.DoesNotContain("**", text);
53+
Assert.DoesNotContain("`", text);
54+
}
55+
56+
[Fact]
57+
public void Extract_StripsHeadingHashesButKeepsText()
58+
{
59+
var text = MarkdownPlainText.Extract("## Setup\n\n### Install\n\nRun the CLI.");
60+
Assert.Contains("Setup", text);
61+
Assert.Contains("Install", text);
62+
Assert.Contains("Run the CLI", text);
63+
Assert.DoesNotContain("##", text);
64+
}
65+
66+
[Fact]
67+
public void Extract_TrimsAtMaxLength()
68+
{
69+
var long_ = new string('a', 10_000);
70+
var text = MarkdownPlainText.Extract(long_, maxLength: 500);
71+
Assert.Equal(500, text.Length);
72+
}
73+
74+
[Fact]
75+
public void Extract_HandlesEmptyInput()
76+
{
77+
Assert.Equal("", MarkdownPlainText.Extract(""));
78+
Assert.Equal("", MarkdownPlainText.Extract(null!));
79+
}
80+
}

tests/ShellDocs.Tests/SearchIndexTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,26 @@ public void FromGraph_PageEntryCarriesDescription()
7575
var page = index.Entries.First(e => e.Kind == SearchEntryKind.Page);
7676
Assert.Equal("Get started with ShellDocs", page.Description);
7777
}
78+
79+
[Fact]
80+
public void FromGraph_PageEntryCarriesExtractedBody()
81+
{
82+
WritePage("intro.md", "Introduction",
83+
bodyHeadings: "## Setup\n\nRun the CLI to scaffold a new project.");
84+
var graph = NavigationGraphBuilder.Build(_root);
85+
var index = SearchIndex.FromGraph(graph);
86+
var page = index.Entries.First(e => e.Kind == SearchEntryKind.Page);
87+
Assert.NotNull(page.Body);
88+
Assert.Contains("Run the CLI", page.Body);
89+
}
90+
91+
[Fact]
92+
public void FromGraph_HeadingEntriesHaveNullBody()
93+
{
94+
WritePage("intro.md", "Introduction", bodyHeadings: "## Setup\n\nBody prose.");
95+
var graph = NavigationGraphBuilder.Build(_root);
96+
var index = SearchIndex.FromGraph(graph);
97+
var heading = index.Entries.First(e => e.Kind == SearchEntryKind.Heading);
98+
Assert.Null(heading.Body);
99+
}
78100
}

0 commit comments

Comments
 (0)