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}