noz-cli/NozCli.Tests/NoteLinkHelperTests.cs
kryptomrx 58410f8d9f feat: link and templates commands with note linking helper
NoteLinkHelper inserts wikilinks into an existing 'Siehe auch' section
or appends one. ApplyPlaceholders fills {{title}}/{{date}}/{{topic}} in
template bodies. new --template <name> fetches a server-side template
before opening the editor. SlugGuard moved to NozCli.Core in a previous
session — remove stale copy from NozCli.
2026-05-17 00:28:22 +02:00

86 lines
3.1 KiB
C#

using Xunit;
using NozCli.Core.Client;
namespace NozCli.Tests;
public class NoteLinkHelperTests
{
// ── AddLink — neue Sektion ────────────────────────────────────────────────
[Fact]
public void AddLink_NoSection_AppendsSieheAuch()
{
var md = "# Notiz\n\nEtwas Text.";
var result = NoteLinkHelper.AddLink(md, "psychologie/flow");
Assert.Contains("## Siehe auch", result);
Assert.Contains("- [[psychologie/flow]]", result);
}
[Fact]
public void AddLink_NoSection_BodyUntouched()
{
var md = "# Notiz\n\nEtwas Text.";
var result = NoteLinkHelper.AddLink(md, "psychologie/flow");
Assert.StartsWith("# Notiz\n\nEtwas Text.", result);
}
// ── AddLink — existierende Sektion ────────────────────────────────────────
[Fact]
public void AddLink_ExistingSection_AppendsToSection()
{
var md = "# Notiz\n\nText.\n\n## Siehe auch\n\n- [[anderes/link]]\n";
var result = NoteLinkHelper.AddLink(md, "psychologie/flow");
Assert.Contains("- [[anderes/link]]", result);
Assert.Contains("- [[psychologie/flow]]", result);
}
[Fact]
public void AddLink_AlreadyLinked_NoChange()
{
var md = "# Notiz\n\n## Siehe auch\n\n- [[psychologie/flow]]\n";
var result = NoteLinkHelper.AddLink(md, "psychologie/flow");
Assert.Equal(md, result);
}
[Fact]
public void AddLink_ExistingSection_DoesNotBleedIntoNextSection()
{
var md = "# Notiz\n\n## Siehe auch\n\n- [[a]]\n\n## Weiteres\n\nAnderer Inhalt.\n";
var result = NoteLinkHelper.AddLink(md, "b/new-note");
Assert.Contains("- [[b/new-note]]", result);
// The new link should appear before "## Weiteres"
var linkIdx = result.IndexOf("- [[b/new-note]]", StringComparison.Ordinal);
var weitersIdx = result.IndexOf("## Weiteres", StringComparison.Ordinal);
Assert.True(linkIdx < weitersIdx);
}
// ── ApplyPlaceholders ─────────────────────────────────────────────────────
[Fact]
public void ApplyPlaceholders_ReplacesAllTokens()
{
var body = "# {{title}}\n\ntopic: {{topic}}\nlang: {{lang}}\nstatus: {{status}}";
var result = NoteLinkHelper.ApplyPlaceholders(body, "Mein Rezept", "kochen", "de", "seed");
Assert.Contains("# Mein Rezept", result);
Assert.Contains("topic: kochen", result);
Assert.Contains("lang: de", result);
Assert.Contains("status: seed", result);
Assert.DoesNotContain("{{", result);
}
[Fact]
public void ApplyPlaceholders_DateIsCurrentDay()
{
var body = "Datum: {{date}}";
var result = NoteLinkHelper.ApplyPlaceholders(body, "", "", "", "");
var today = DateTime.UtcNow.ToString("yyyy-MM-dd");
Assert.Contains(today, result);
}
}