This repository has been archived on 2026-04-03. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
core/server/notelinks/extract_test.go
2026-02-28 15:20:23 +00:00

123 lines
3.3 KiB
Go

package notelinks
import (
"testing"
)
func TestExtractWikilinks(t *testing.T) {
tests := []struct {
name string
content string
want int
checks func(t *testing.T, links []struct{ title, display string; transclusion bool })
}{
{
name: "no links",
content: "Just some plain text with [single brackets]",
want: 0,
},
{
name: "single link",
content: "See [[Project Notes]] for details",
want: 1,
checks: func(t *testing.T, links []struct{ title, display string; transclusion bool }) {
if links[0].title != "Project Notes" {
t.Errorf("title = %q, want %q", links[0].title, "Project Notes")
}
if links[0].transclusion {
t.Error("should not be transclusion")
}
},
},
{
name: "link with display text",
content: "Check the [[Architecture Doc|arch doc]] here",
want: 1,
checks: func(t *testing.T, links []struct{ title, display string; transclusion bool }) {
if links[0].title != "Architecture Doc" {
t.Errorf("title = %q", links[0].title)
}
if links[0].display != "arch doc" {
t.Errorf("display = %q", links[0].display)
}
},
},
{
name: "transclusion",
content: "Embed this: ![[Meeting Notes]]",
want: 1,
checks: func(t *testing.T, links []struct{ title, display string; transclusion bool }) {
if links[0].title != "Meeting Notes" {
t.Errorf("title = %q", links[0].title)
}
if !links[0].transclusion {
t.Error("should be transclusion")
}
},
},
{
name: "multiple links deduplicated",
content: "See [[Alpha]] and [[Beta]] and [[Alpha]] again",
want: 2,
},
{
name: "case-insensitive dedup",
content: "See [[Project]] and [[project]]",
want: 1,
checks: func(t *testing.T, links []struct{ title, display string; transclusion bool }) {
if links[0].title != "Project" {
t.Errorf("title = %q, want first occurrence", links[0].title)
}
},
},
{
name: "mixed links and transclusions",
content: "Link to [[Alpha]], embed ![[Beta|b]], and [[Gamma]]",
want: 3,
},
{
name: "whitespace trimmed",
content: "See [[ Spaced Title ]] here",
want: 1,
checks: func(t *testing.T, links []struct{ title, display string; transclusion bool }) {
if links[0].title != "Spaced Title" {
t.Errorf("title = %q, want trimmed", links[0].title)
}
},
},
{
name: "nested brackets ignored",
content: "Not a link: [[[triple]]] but [[Valid]] is",
want: 1,
checks: func(t *testing.T, links []struct{ title, display string; transclusion bool }) {
if links[0].title != "Valid" {
t.Errorf("title = %q, want Valid", links[0].title)
}
},
},
{
name: "empty brackets ignored",
content: "Empty [[]] should not match",
want: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
links := ExtractWikilinks(tt.content)
if len(links) != tt.want {
t.Fatalf("got %d links, want %d", len(links), tt.want)
}
if tt.checks != nil {
simplified := make([]struct{ title, display string; transclusion bool }, len(links))
for i, l := range links {
simplified[i] = struct{ title, display string; transclusion bool }{
title: l.TargetTitle, display: l.DisplayText, transclusion: l.IsTransclusion,
}
}
tt.checks(t, simplified)
}
})
}
}