blob: 339c5e2f102f1e2b0ed0f333d45baf34036c77e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/sh

# Checks about-render.lua, the shipped about-filter. The unit checks drive
# the script under every suitable standalone Lua through the harness in
# extensions/, once as installed and once with lpeg forced away so the
# plain text fallback is proven everywhere. A repository with a markdown
# readme is then rendered through cgit itself, where the outcome depends on
# whether the Lua inside the binary has lpeg, so a probe decides which of
# the two right answers to expect.

test_description='Check the shipped about-render extension'
CGIT_TEST_NO_CREATE_REPOS=YesPlease
. ./setup.sh
. "$TEST_OUTPUT_DIRECTORY/extensions/lib.sh"

interpreters=$(ext_lua_interpreters 5)
test -z "$interpreters" &&
	say 'no standalone lua on the path, unit checks skipped'

for lua in $interpreters
do
	test_expect_success "unit checks under $lua" "
		'$lua' '$EXT_TEST_DIRECTORY/test-about-render.lua' '$EXTENSIONS_DIRECTORY/about-render.lua'
	"

	test_expect_success "fallback checks without lpeg under $lua" "
		'$lua' '$EXT_TEST_DIRECTORY/test-about-render.lua' '$EXTENSIONS_DIRECTORY/about-render.lua' nolpeg
	"
done

test_expect_success 'create a repository with a markdown readme' '
	test_create_repo repos/md &&
	(
		cd repos/md &&
		cat >README.md <<-\EOF &&
		# The Title

		A **bold** claim and a <script>alert(1)</script> attempt.

		See the [roadmap](ROADMAP.md#plan).
		EOF
		cat >tool.1 <<-\EOF &&
		.TH TOOL 1
		.SH NAME
		tool \- does one thing \(em well
		.SH OPTIONS
		.TP
		.B \-v
		Be \fIverbose\fR.
		.nf
		tool \-v <file>
		.fi
		EOF
		echo "Plain <b>notes</b> & more" >NOTES &&
		git add README.md tool.1 NOTES &&
		git commit -m "add readme" &&
		git branch next
	)
'

test_expect_success 'point cgit at it through the about filter' '
	cat >cgitrc <<-EOF
	virtual-root=/
	cache-size=0
	repo.url=md
	repo.path=$PWD/repos/md/.git
	repo.readme=:README.md
	repo.about-filter=lua:$EXTENSIONS_DIRECTORY/about-render.lua
	repo.url=man
	repo.path=$PWD/repos/md/.git
	repo.readme=:tool.1
	repo.about-filter=lua:$EXTENSIONS_DIRECTORY/about-render.lua
	repo.url=txt
	repo.path=$PWD/repos/md/.git
	repo.readme=:NOTES
	repo.about-filter=lua:$EXTENSIONS_DIRECTORY/about-render.lua
	EOF
'

if test "$CGIT_HAS_LUA" -eq 1
then
	test_set_prereq CGIT_LUA
	if cgit_lua_probe "$PWD/repos/md/.git" lpeg
	then
		test_set_prereq CGIT_LUA_LPEG
	else
		test_set_prereq CGIT_LUA_NOLPEG
		say 'cgit lua has no lpeg, expecting the plain text fallback'
	fi
else
	say 'cgit built without lua, filter checks through cgit skipped'
fi

test_expect_success CGIT_LUA_LPEG 'the about page renders the markdown' '
	cgit_url "md/about/" >tmp &&
	grep "<h1 id=.the-title.>The Title</h1>" tmp &&
	grep "<strong>bold</strong>" tmp
'

test_expect_success CGIT_LUA_LPEG 'readme markup reaches the page escaped' '
	cgit_url "md/about/" >tmp &&
	grep "&lt;script&gt;alert(1)&lt;/script&gt;" tmp &&
	! grep "<script>alert(1)" tmp
'

test_expect_success CGIT_LUA_LPEG 'a relative link leads into the tree' '
	cgit_url "md/about/" >tmp &&
	grep "<a href=./md/tree/ROADMAP.md#plan.>roadmap</a>" tmp
'

test_expect_success CGIT_LUA_LPEG 'the link stays on the branch shown' '
	cgit_query "url=md/about/&h=next" >tmp &&
	grep "<a href=./md/tree/ROADMAP.md?h=next#plan.>roadmap</a>" tmp
'

test_expect_success CGIT_LUA_LPEG 'the about page renders a man page' '
	cgit_url "man/about/" >tmp &&
	grep "<div class=.markdown manpage.><h2 id=.name.>NAME</h2>" tmp &&
	grep "tool - does one thing — well" tmp &&
	grep "<strong>-v</strong><br>" tmp &&
	grep "<pre><code>tool -v &lt;file&gt;" tmp &&
	! grep "\\\\f" tmp
'

test_expect_success CGIT_LUA 'the about page shows plain text as it is' '
	cgit_url "txt/about/" >tmp &&
	grep "<pre class=.plaintext.>Plain &lt;b&gt;notes&lt;/b&gt; &amp; more" tmp
'

test_expect_success CGIT_LUA_NOLPEG 'without lpeg the readme is served escaped' '
	cgit_url "md/about/" >tmp &&
	grep "<pre class=.plaintext.>" tmp &&
	grep "# The Title" tmp &&
	cgit_url "man/about/" >tmp &&
	grep "<pre class=.plaintext.>" tmp &&
	grep ".SH NAME" tmp
'

test_done