all repos

mugit @ d220163

🐮 git server that your cow will love

mugit/internal/markdown/relink_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
test: add missing tests (#5)..., 2 months ago
1
package markdown
2
3
import (
4
	"testing"
5
6
	"olexsmir.xyz/x/is"
7
)
8
9
func TestIsAbsoluteURL(t *testing.T) {
10
	tests := []struct {
11
		name string
12
		link string
13
		want bool
14
	}{
15
		// absolute URLs
16
		{name: "https url", link: "https://example.com", want: true},
17
		{name: "http url", link: "http://example.com", want: true},
18
		{name: "https with path", link: "https://example.com/path/to/file", want: true},
19
		{name: "protocol relative", link: "//example.com/path", want: true},
20
		{name: "anchor link", link: "#section", want: true},
21
		{name: "anchor with id", link: "#my-heading-id", want: true},
22
		{name: "ftp scheme", link: "ftp://files.example.com", want: true},
23
		{name: "mailto scheme", link: "mailto:user@example.com", want: true},
24
		{name: "data uri", link: "data:image/png;base64,abc123", want: true},
25
26
		// relative URLs
27
		{name: "relative path", link: "path/to/file.md"},
28
		{name: "relative with dot", link: "./relative/path"},
29
		{name: "parent directory", link: "../other/file.md"},
30
		{name: "absolute path no scheme", link: "/absolute/path"},
31
		{name: "just filename", link: "README.md"},
32
		{name: "image file", link: "images/logo.png"},
33
		{name: "empty string", link: ""},
34
	}
35
36
	for _, tt := range tests {
37
		t.Run(tt.name, func(t *testing.T) {
38
			is.Equal(t, isAbsoluteURL(tt.link), tt.want)
39
		})
40
	}
41
}
42
43
func TestRelLinkTransformer_imageFromRepo(t *testing.T) {
44
	tests := []struct {
45
		name     string
46
		repoName string
47
		repoRef  string
48
		baseDir  string
49
		dst      string
50
		want     string
51
	}{
52
		{
53
			name:     "simple image at root",
54
			repoName: "myrepo",
55
			repoRef:  "main",
56
			baseDir:  "",
57
			dst:      "logo.png",
58
			want:     "/myrepo/raw/main/logo.png",
59
		},
60
		{
61
			name:     "image in subdirectory",
62
			repoName: "myrepo",
63
			repoRef:  "main",
64
			baseDir:  "assets/docs",
65
			dst:      "images/diagram.png",
66
			want:     "/myrepo/raw/main/assets/docs/images/diagram.png",
67
		},
68
		{
69
			name:     "absolute image path",
70
			repoName: "myrepo",
71
			repoRef:  "master",
72
			dst:      "/assets/logo.png",
73
			want:     "/myrepo/raw/master/assets/logo.png",
74
		},
75
		{
76
			name:     "external URL unchanged",
77
			repoName: "myrepo",
78
			repoRef:  "main",
79
			baseDir:  "",
80
			dst:      "https://example.com/image.png",
81
			want:     "https://example.com/image.png",
82
		},
83
		{
84
			name:     "protocol relative URL unchanged",
85
			repoName: "myrepo",
86
			repoRef:  "main",
87
			baseDir:  "",
88
			dst:      "//cdn.example.com/image.png",
89
			want:     "//cdn.example.com/image.png",
90
		},
91
		{
92
			name:     "with version tag ref",
93
			repoName: "myrepo",
94
			repoRef:  "v1.2.3",
95
			baseDir:  "",
96
			dst:      "screenshot.png",
97
			want:     "/myrepo/raw/v1.2.3/screenshot.png",
98
		},
99
		{
100
			name:     "repo name with special chars",
101
			repoName: "my-repo.git",
102
			repoRef:  "main",
103
			baseDir:  "",
104
			dst:      "img.png",
105
			want:     "/my-repo.git/raw/main/img.png",
106
		},
107
	}
108
109
	for _, tt := range tests {
110
		t.Run(tt.name, func(t *testing.T) {
111
			m := &relLinkTransformer{
112
				repoName: tt.repoName,
113
				repoRef:  tt.repoRef,
114
				baseDir:  tt.baseDir,
115
			}
116
			is.Equal(t, m.imageFromRepo(tt.dst), tt.want)
117
		})
118
	}
119
}
120
121
func TestRelLinkTransformer_path(t *testing.T) {
122
	tests := []struct {
123
		name    string
124
		baseDir string
125
		dst     string
126
		want    string
127
	}{
128
		{
129
			name:    "relative from root",
130
			baseDir: "",
131
			dst:     "file.md",
132
			want:    "file.md",
133
		},
134
		{
135
			name:    "relative from subdirectory",
136
			baseDir: "docs",
137
			dst:     "guide.md",
138
			want:    "docs/guide.md",
139
		},
140
		{
141
			name:    "absolute path ignores baseDir",
142
			baseDir: "docs",
143
			dst:     "/README.md",
144
			want:    "/README.md",
145
		},
146
		{
147
			name:    "nested paths",
148
			baseDir: "docs/api",
149
			dst:     "endpoints/users.md",
150
			want:    "docs/api/endpoints/users.md",
151
		},
152
	}
153
154
	for _, tt := range tests {
155
		t.Run(tt.name, func(t *testing.T) {
156
			m := &relLinkTransformer{baseDir: tt.baseDir}
157
			is.Equal(t, m.path(tt.dst), tt.want)
158
		})
159
	}
160
}