GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package main
6
7import (
8 "embed"
9 "fmt"
10 "testing"
11
12 "github.com/sergi/go-diff/diffmatchpatch"
13 "gitroot.dev/libs/golang/plugin/model"
14 "gitroot.dev/libs/golang/plugin/test"
15)
16
17//go:embed test_ressources/*
18var fakeFs embed.FS
19
20const want = `<!doctype html>
21<html>
22<head>
23<meta charset="UTF-8">
24<meta name="viewport" content="width=device-width, initial-scale=1.0">
25<link rel="icon" type="image/jpeg" href="/logo.jpeg">
26<base href="test/" />
27<meta name="og:title" content="2" />
28<meta name="title" content="my title" />
29
30<title>my title</title>
31<link rel="stylesheet" href="simple.min.css">
32</head>
33<body>
34<header>
35 test/
36 <nav>
37 <ul></ul>
38 </nav>
39</header>
40<h1 id="title">my title <small>baseline</small></h1>
41
42<footer>
43 <small>clone from ssh://myUrl.myTld/test/</small>
44</footer>
45</body>
46</html>`
47
48const wantNotFound = `<!doctype html>
49<html>
50<head>
51<meta charset="UTF-8">
52<meta name="viewport" content="width=device-width, initial-scale=1.0">
53<link rel="icon" type="image/jpeg" href="/logo.jpeg">
54<base href="http://127.0.0.1:4546/test/" />
55
56<title>my title</title>
57<link rel="stylesheet" href="simple.min.css">
58</head>
59<body>
60<header>
61 {{notavar}}http://127.0.0.1:4546/test/
62 <nav>
63 <ul></ul>
64 </nav>
65</header>
66<h1 id="title">my title</h1>
67
68<footer>
69 <small>my page is my title</small>
70</footer>
71</body>
72</html>`
73
74const wantSubRender = `<!doctype html>
75<html>
76<head>
77<meta charset="UTF-8">
78<meta name="viewport" content="width=device-width, initial-scale=1.0">
79<link rel="icon" type="image/jpeg" href="/logo.jpeg">
80<base href="http://127.0.0.1:4546/test/" />
81
82<title>my title</title>
83<link rel="stylesheet" href="simple.min.css">
84</head>
85<body>
86<header>
87 http://127.0.0.1:4546/test/
88 <nav>
89 <ul></ul>
90 </nav>
91</header>
92<h1 id="title">my title <small>baseline</small></h1>
93<section>Hello</section>
94<footer>
95 <small>clone from ssh://127.0.0.1:4545/test/</small>
96</footer>
97</body>
98</html>`
99
100func TestRenderHtml(t *testing.T) {
101 p := Plugin{
102 server: test.NewFakeServerWithOverride(t, test.Override{
103 ForgeConf: func() (model.ForgeConf, error) {
104 return model.ForgeConf{
105 Domain: "myUrl.myTld",
106 ExternalSshAddr: "ssh://myUrl.myTld/",
107 }, nil
108 },
109 }),
110 }
111 p.Init("test", model.InitKindDiff, `{"favicon":"/logo.jpeg", "header": "{{repo.url}}", "footer":"<small>clone from {{repo.cloneUrl}}</small>", "meta": {"og:title": "title displayed in social"}}`)
112 res := p.renderer.render("/help.md", "<h1 id=\"title\">my title <small>baseline</small></h1>\n", map[string]string{"title": "my title", "og:title": "2"})
113 if res != want {
114 t.Errorf("---\n%s\n--- want ---\n%s\n---", res, want)
115 }
116}
117
118func TestRenderHtmlVarNotFound(t *testing.T) {
119 p := Plugin{
120 server: test.NewFakeServer(t),
121 }
122 p.Init("test", model.InitKindDiff, `{"favicon":"/logo.jpeg", "header": "{{notavar}}{{repo.url}}", "footer":"<small>my page is {{page.title}}</small>"}`)
123 res := p.renderer.render("/help.md", "<h1 id=\"title\">my title</h1>\n", map[string]string{})
124 if res != wantNotFound {
125 t.Errorf("---\n%s\n--- want ---\n%s\n---", res, wantNotFound)
126 }
127}
128
129func TestMenu(t *testing.T) {
130 p := &Plugin{
131 server: test.NewFakeServer(t),
132 }
133 p.Init("repo", model.InitKindDiff, `{"menu": [
134 {"display": "🏠 Home", "link": "/"},
135 {"display": "📖 Documentation", "link": "/doc/"}
136 ]}`)
137 menu := p.renderer.buildMenu("/doc/index.md")
138 menuForDoc := "<ul><li><a href=\"./index.html\">🏠 Home</a></li><li><a aria-current=\"page\">📖 Documentation</a></li></ul>"
139 if menu != menuForDoc {
140 t.Errorf("l should be %s but was %s", menuForDoc, menu)
141 }
142}
143
144func TestSubRenderInPage(t *testing.T) {
145 s := test.NewFakeServer(t)
146 s.SetOverride(test.Override{
147 Worktree: func() *model.GrFs {
148 return model.NewGrFsWithFs(model.WORKTREE, s, fakeFs)
149 },
150 })
151 p := Plugin{
152 server: s,
153 }
154 p.Init("test", model.InitKindDiff, `{"favicon":"/logo.jpeg", "header": "{{repo.url}}", "footer":"<small>clone from {{repo.cloneUrl}}</small>"}`)
155 res := p.renderer.render("/help.md", "<h1 id=\"title\">my title <small>baseline</small></h1>\n", map[string]string{"layout": "test_ressources/layout.html"})
156 if res != wantSubRender {
157 t.Errorf("---\n%s\n--- want ---\n%s\n---", res, wantSubRender)
158 }
159}
160
161func TestSubRenderInConf(t *testing.T) {
162 s := test.NewFakeServer(t)
163 s.SetOverride(test.Override{
164 Worktree: func() *model.GrFs {
165 return model.NewGrFsWithFs(model.WORKTREE, s, fakeFs)
166 },
167 })
168 p := Plugin{
169 server: s,
170 }
171 p.Init("test", model.InitKindDiff, `{"favicon":"/logo.jpeg", "header": "{{repo.url}}", "footer":"<small>clone from {{repo.cloneUrl}}</small>", "layout":[{"glob":"**/*.md", "path":"test_ressources/layout.html"}]}`)
172 res := p.renderer.render("/help.md", "<h1 id=\"title\">my title <small>baseline</small></h1>\n", map[string]string{})
173 if res != wantSubRender {
174 t.Errorf("---\n%s\n--- want ---\n%s\n---", res, wantSubRender)
175 }
176}
177
178func TestSubRenderNotExist(t *testing.T) {
179 calledPath := ""
180 server := test.NewFakeServer(t)
181 server.SetOverride(test.Override{
182 ForgeConf: func() (model.ForgeConf, error) {
183 return model.ForgeConf{
184 Domain: "myUrl.myTld",
185 ExternalSshAddr: "ssh://myUrl.myTld/",
186 }, nil
187 },
188 Worktree: func() *model.GrFs {
189 return model.NewGrFsWithFs(model.WORKTREE, server, fakeFs)
190 },
191 WriteContent: func(fromFs model.FsBase, path, content string) error {
192 calledPath = path
193 return nil
194 },
195 })
196 p := Plugin{
197 server: server,
198 }
199 p.Init("test", model.InitKindDiff, `{"favicon":"/logo.jpeg", "header": "{{repo.url}}", "footer":"<small>clone from {{repo.cloneUrl}}</small>", "layout":[{"glob":"**/*.md", "path":"test_ressources/layout2.html"}]}`)
200 res := p.renderer.render("/help.md", "<h1 id=\"title\">my title <small>baseline</small></h1>\n", map[string]string{})
201 if res != want {
202 dmp := diffmatchpatch.New()
203
204 diffs := dmp.DiffMain(res, want, false)
205
206 fmt.Println(dmp.DiffPrettyText(diffs))
207 t.Error(dmp.DiffPrettyText(diffs))
208 }
209 if calledPath != "test_ressources/layout2.html" {
210 t.Fatalf("should be calledPath %s", calledPath)
211 }
212}