blob: 110f481c43baa6082b4a79f1aa40d62bc1e0e1ee [file] [log] [blame]
Shawn Pearce962349e2015-02-09 22:02:48 -08001// Copyright (C) 2015 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles.doc;
16
Dave Borowitzfde41fd2015-09-16 15:14:38 -040017import static com.google.common.truth.Truth.assertThat;
Shawn Pearce962349e2015-02-09 22:02:48 -080018
Nodir Turakulov4bc26002015-08-18 18:24:37 -070019import com.google.gitiles.ServletTest;
Shawn Pearce962349e2015-02-09 22:02:48 -080020import org.junit.Test;
21import org.junit.runner.RunWith;
22import org.junit.runners.JUnit4;
23
Shawn Pearce962349e2015-02-09 22:02:48 -080024/** Tests for {DocServlet}. */
25@RunWith(JUnit4.class)
Nodir Turakulov4bc26002015-08-18 18:24:37 -070026public class DocServletTest extends ServletTest {
Shawn Pearce962349e2015-02-09 22:02:48 -080027 @Test
28 public void simpleReadmeDoc() throws Exception {
29 String title = "DocServletTest simpleDoc";
30 String url = "http://daringfireball.net/projects/markdown/syntax";
Dave Borowitzcf38c032016-05-02 11:06:23 -040031 String markdown =
32 "# " + title + "\n" + "\n" + "Tests the rendering of " + "[Markdown](" + url + ").";
33 repo.branch("master").commit().add("README.md", markdown).create();
Shawn Pearce962349e2015-02-09 22:02:48 -080034
35 String html = buildHtml("/repo/+doc/master/README.md");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040036 assertThat(html).contains("<title>" + title + "</title>");
37 assertThat(html).contains(title + "</h1>");
38 assertThat(html).contains("<a href=\"" + url + "\">Markdown</a>");
Shawn Pearce962349e2015-02-09 22:02:48 -080039 }
40
41 @Test
42 public void includesNavbar() throws Exception {
Vlad Bokovfbda0c92019-04-17 13:47:44 +070043 String navbar =
44 "# Site Title\n"
45 + "\n"
David Pursehouse374c9992019-06-15 14:06:40 +090046 + "[home]: index.md\n"
47 + "[logo]: logo.png\n"
48 + "\n"
49 + "* [Home][home]\n"
Vlad Bokovfbda0c92019-04-17 13:47:44 +070050 + "* [README](README.md)\n"
51 + "[extensions]: blocknote\n";
Dave Borowitzcf38c032016-05-02 11:06:23 -040052 repo.branch("master")
53 .commit()
Shawn Pearce962349e2015-02-09 22:02:48 -080054 .add("README.md", "# page\n\nof information.")
55 .add("navbar.md", navbar)
56 .create();
57
58 String html = buildHtml("/repo/+doc/master/README.md");
Dave Borowitzfde41fd2015-09-16 15:14:38 -040059 assertThat(html).contains("<title>Site Title - page</title>");
David Pursehouse374c9992019-06-15 14:06:40 +090060 assertThat(html).contains("Header-anchorLogo");
Dave Borowitz3b7e7a52015-09-16 16:42:46 -040061 assertThat(html).contains("<span class=\"Header-anchorTitle\">Site Title</span>");
Shawn Pearcec8fac642016-05-16 13:15:43 -060062 assertThat(html).contains("<li><a href=\"/b/repo/+/master/index.md\">Home</a></li>");
63 assertThat(html).contains("<li><a href=\"/b/repo/+/master/README.md\">README</a></li>");
Vlad Bokovfbda0c92019-04-17 13:47:44 +070064 assertThat(html).doesNotContain("extensions");
Dave Borowitzcf38c032016-05-02 11:06:23 -040065 assertThat(html)
Darragh Baileyd8d82fc2017-07-07 10:13:00 +010066 .contains("<h1><a class=\"h\" name=\"page\" href=\"#page\"><span></span></a>page</h1>");
Shawn Pearce962349e2015-02-09 22:02:48 -080067 }
68
69 @Test
Robert Liaoe8f74112018-10-24 18:10:51 -070070 public void simpleSubNavbar() throws Exception {
David Pursehouse3bce3562018-11-08 16:23:38 +090071 String rootNavbar = "# Site Title\n\n* [Home](index.md)\n* [README](README.md)\n";
72 String subNavbar = "# Subdir Title\n\n* [Sub Home](index.md)\n* [Sub README](README.md)\n";
Robert Liaoe8f74112018-10-24 18:10:51 -070073 repo.branch("master")
74 .commit()
75 .add("README.md", "# page\n\nof information.")
76 .add("navbar.md", rootNavbar)
77 .add("subdir/README.md", "# subdir page\n\nof information.")
78 .add("subdir/navbar.md", subNavbar)
79 .create();
80
81 String rootReadmeHtml = buildHtml("/repo/+doc/master/README.md");
82 assertThat(rootReadmeHtml).contains("<title>Site Title - page</title>");
83
84 assertThat(rootReadmeHtml).contains("<span class=\"Header-anchorTitle\">Site Title</span>");
85 assertThat(rootReadmeHtml).contains("<li><a href=\"/b/repo/+/master/index.md\">Home</a></li>");
86 assertThat(rootReadmeHtml)
87 .contains("<li><a href=\"/b/repo/+/master/README.md\">README</a></li>");
88 assertThat(rootReadmeHtml)
89 .contains("<h1><a class=\"h\" name=\"page\" href=\"#page\"><span></span></a>page</h1>");
90
91 String subdirReadmeHtml = buildHtml("/repo/+doc/master/subdir/README.md");
92 assertThat(subdirReadmeHtml).contains("<title>Subdir Title - subdir page</title>");
93
94 assertThat(subdirReadmeHtml).contains("<span class=\"Header-anchorTitle\">Subdir Title</span>");
95 assertThat(subdirReadmeHtml)
96 .contains("<li><a href=\"/b/repo/+/master/subdir/index.md\">Sub Home</a></li>");
97 assertThat(subdirReadmeHtml)
98 .contains("<li><a href=\"/b/repo/+/master/subdir/README.md\">Sub README</a></li>");
99 assertThat(subdirReadmeHtml)
100 .contains(
101 "<h1><a class=\"h\" name=\"subdir-page\" href=\"#subdir-page\"><span></span>"
102 + "</a>subdir page</h1>");
103 assertThat(subdirReadmeHtml)
104 .doesNotContain("<li><a href=\"/b/repo/+/master/index.md\">Home</a></li>");
105 assertThat(subdirReadmeHtml)
106 .doesNotContain("<li><a href=\"/b/repo/+/master/README.md\">README</a></li>");
107 }
108
109 @Test
Shawn Pearce962349e2015-02-09 22:02:48 -0800110 public void dropsHtml() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400111 String markdown =
112 "# B. Ad\n"
113 + "\n"
114 + "<script>window.alert();</script>\n"
115 + "\n"
116 + "Non-HTML <b>is fine</b>.";
117 repo.branch("master").commit().add("index.md", markdown).create();
Shawn Pearce962349e2015-02-09 22:02:48 -0800118
119 String html = buildHtml("/repo/+doc/master/");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400120 assertThat(html).contains("B. Ad</h1>");
121 assertThat(html).contains("Non-HTML is fine.");
Shawn Pearce962349e2015-02-09 22:02:48 -0800122
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400123 assertThat(html).doesNotContain("window.alert");
124 assertThat(html).doesNotContain("<script>");
Shawn Pearce962349e2015-02-09 22:02:48 -0800125 }
126
127 @Test
Shawn Pearce25d91962015-06-22 15:35:36 -0700128 public void namedAnchor() throws Exception {
David Pursehouse33d5cdb2017-07-07 11:33:02 +0900129 String markdown = "# Section {#debug}\n" + "# Other <a name=\"OLD-SCHOOL\"></a>\n";
Dave Borowitzcf38c032016-05-02 11:06:23 -0400130 repo.branch("master").commit().add("index.md", markdown).create();
Shawn Pearce25d91962015-06-22 15:35:36 -0700131 String html = buildHtml("/repo/+doc/master/");
Dave Borowitzcf38c032016-05-02 11:06:23 -0400132 assertThat(html)
133 .contains(
134 "<h1>"
135 + "<a class=\"h\" name=\"debug\" href=\"#debug\"><span></span></a>"
136 + "Section</h1>");
137 assertThat(html)
138 .contains(
139 "<h1>"
David Pursehouse33d5cdb2017-07-07 11:33:02 +0900140 + "<a class=\"h\" name=\"OLD-SCHOOL\" href=\"#OLD-SCHOOL\"><span></span></a>"
Dave Borowitzcf38c032016-05-02 11:06:23 -0400141 + "<a class=\"h\" name=\"old-school\" href=\"#old-school\"><span></span></a>"
142 + "Other</h1>");
Shawn Pearce25d91962015-06-22 15:35:36 -0700143 }
144
145 @Test
Shawn Pearce962349e2015-02-09 22:02:48 -0800146 public void incompleteHtmlIsLiteral() throws Exception {
147 String markdown = "Incomplete <html is literal.";
Dave Borowitzcf38c032016-05-02 11:06:23 -0400148 repo.branch("master").commit().add("index.md", markdown).create();
Shawn Pearce962349e2015-02-09 22:02:48 -0800149
150 String html = buildHtml("/repo/+doc/master/index.md");
Dave Borowitzfde41fd2015-09-16 15:14:38 -0400151 assertThat(html).contains("Incomplete &lt;html is literal.");
Shawn Pearce962349e2015-02-09 22:02:48 -0800152 }
153
Shawn Pearceb7e872d2015-07-10 15:21:47 -0700154 @Test
Shawn Pearce56857f92016-06-05 10:15:03 -0700155 public void noteInList() throws Exception {
156 String markdown =
157 "+ one\n\n" + " ***aside\n" + " remember this\n" + " ***\n" + "\n" + "+ two\n";
158 repo.branch("master").commit().add("index.md", markdown).create();
159
160 String html = buildHtml("/repo/+/master/index.md");
Shawn Pearce56857f92016-06-05 10:15:03 -0700161 assertThat(html)
162 .contains(
163 "<ul><li><p>one</p><div class=\"aside\">remember this</div>"
164 + "</li><li><p>two</p></li></ul>");
165 }
166
167 @Test
Shawn Pearceb7e872d2015-07-10 15:21:47 -0700168 public void relativeLink() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400169 repo.branch("master").commit().add("A/B/README.md", "[c](../../C)").create();
Shawn Pearceb7e872d2015-07-10 15:21:47 -0700170
171 String html = buildHtml("/repo/+doc/master/A/B/README.md");
Shawn Pearcec8fac642016-05-16 13:15:43 -0600172 assertThat(html).contains("<a href=\"/b/repo/+/master/C\">c</a>");
Shawn Pearceb7e872d2015-07-10 15:21:47 -0700173 }
174
175 @Test
176 public void absoluteLink() throws Exception {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400177 repo.branch("master").commit().add("README.md", "[c](/x)").create();
Shawn Pearceb7e872d2015-07-10 15:21:47 -0700178
179 String html = buildHtml("/repo/+doc/master/README.md");
Shawn Pearcec8fac642016-05-16 13:15:43 -0600180 assertThat(html).contains("<a href=\"/b/repo/+/master/x\">c</a>");
Shawn Pearceb7e872d2015-07-10 15:21:47 -0700181 }
Shawn Pearce532b62f2016-06-05 12:20:38 -0700182
183 @Test
184 public void gitUrlLink() throws Exception {
185 repo.branch("master").commit().add("README.md", "[c](git://example.com/repo.git)").create();
186
187 String html = buildHtml("/repo/+doc/master/README.md");
188 assertThat(html).contains("<a href=\"git://example.com/repo.git\">c</a>");
189 }
190
191 @Test
192 public void invalidGitUrlLink() throws Exception {
193 repo.branch("master").commit().add("README.md", "[c](git://example.com/repo/..)").create();
194
195 String html = buildHtml("/repo/+doc/master/README.md");
David Pursehouse537ff7c2016-08-19 17:21:10 +0900196 assertThat(html).contains("<a href=\"about:invalid#zSoyz\">c</a>");
Shawn Pearce532b62f2016-06-05 12:20:38 -0700197 }
Shawn Pearce962349e2015-02-09 22:02:48 -0800198}