blob: fbc652ae15906f756d9a1013f207c88c6e8931f0 [file] [log] [blame]
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gitiles.doc;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.base.CharMatcher;
import com.google.gitiles.GitilesView;
import com.google.gitiles.RootedDocServlet;
import org.eclipse.jgit.lib.Config;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class LinkTest {
private GitilesView view;
private Config config;
@Before
public void setup() {
view =
GitilesView.revision()
.setHostName("127.0.0.1")
.setServletPath("/g")
.setRepositoryName("repo")
.setRevision("HEAD")
.build();
config = new Config();
}
@Test
public void httpLink() {
MarkdownToHtml md =
MarkdownToHtml.builder()
.setGitilesView(view)
.setConfig(new MarkdownConfig(config))
.setFilePath("index.md")
.build();
String url;
url = "http://example.com/foo.html";
assertThat(md.href(url)).isEqualTo(url);
url = "https://example.com/foo.html";
assertThat(md.href(url)).isEqualTo(url);
url = "//example.com/foo.html";
assertThat(md.href(url)).isEqualTo(url);
url = "mailto://nobody@nowhere.org";
assertThat(md.href(url)).isEqualTo(url);
}
@Test
public void gitLink() {
MarkdownToHtml md =
MarkdownToHtml.builder()
.setGitilesView(view)
.setConfig(new MarkdownConfig(config))
.setFilePath("index.md")
.build();
String url;
url = "git://example.com/repo.git";
assertThat(md.href(url)).isEqualTo(url);
assertThat(md.href("git:example.com/repo.git")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("git://")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("git://example.com/../root")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("git://example.com/root/..")).isEqualTo("about:invalid#zSoyz");
}
@Test
public void absolutePath() {
MarkdownToHtml md =
MarkdownToHtml.builder()
.setGitilesView(view)
.setConfig(new MarkdownConfig(config))
.setFilePath("index.md")
.build();
assertThat(md.href("/")).isEqualTo("/g/repo/+/HEAD/");
assertThat(md.href("/index.md")).isEqualTo("/g/repo/+/HEAD/index.md");
assertThat(md.href("/doc/index.md")).isEqualTo("/g/repo/+/HEAD/doc/index.md");
// GitilesView trims trailing '/' from path expressions.
assertThat(md.href("/doc/")).isEqualTo("/g/repo/+/HEAD/doc");
}
@Test
public void relativePathInRootFile() {
testMarkdownInRoot(file("/index.md"));
}
@Test
public void relativePathInTreeFile() {
testMarkdownInTree(file("/doc/index.md"));
}
@Test
public void relativePathInRepositoryIndexReadme() {
testMarkdownInRoot(repoIndexReadme());
}
@Test
public void relativePathInCommitReadme() {
testMarkdownInRoot(revisionReadme());
}
@Test
public void relativePathInTreeReadme() {
testMarkdownInTree(treeReadme("/doc"));
testMarkdownInTree(treeReadme("/doc/"));
}
private static void testMarkdownInRoot(MarkdownToHtml md) {
assertThat(md.href("#Help")).isEqualTo("#Help");
assertThat(md.href("setup.md#Help")).isEqualTo("/g/repo/+/HEAD/setup.md#Help");
assertThat(md.href("setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
assertThat(md.href("./setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
assertThat(md.href("./")).isEqualTo("/g/repo/+/HEAD/");
assertThat(md.href(".")).isEqualTo("/g/repo/+/HEAD/");
assertThat(md.href("../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("..")).isEqualTo("about:invalid#zSoyz");
}
private static void testMarkdownInTree(MarkdownToHtml md) {
assertThat(md.href("#Help")).isEqualTo("#Help");
assertThat(md.href("setup.md#Help")).isEqualTo("/g/repo/+/HEAD/doc/setup.md#Help");
assertThat(md.href("setup.md")).isEqualTo("/g/repo/+/HEAD/doc/setup.md");
assertThat(md.href("./setup.md")).isEqualTo("/g/repo/+/HEAD/doc/setup.md");
assertThat(md.href("../setup.md")).isEqualTo("/g/repo/+/HEAD/setup.md");
assertThat(md.href("../tech/setup.md")).isEqualTo("/g/repo/+/HEAD/tech/setup.md");
assertThat(md.href("./")).isEqualTo("/g/repo/+/HEAD/doc");
assertThat(md.href(".")).isEqualTo("/g/repo/+/HEAD/doc");
assertThat(md.href("../")).isEqualTo("/g/repo/+/HEAD/");
assertThat(md.href("..")).isEqualTo("/g/repo/+/HEAD/");
assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../../../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../../..")).isEqualTo("about:invalid#zSoyz");
}
private MarkdownToHtml file(String path) {
return MarkdownToHtml.builder()
.setGitilesView(GitilesView.doc().copyFrom(view).setPathPart(path).build())
.setConfig(new MarkdownConfig(config))
.setFilePath(path)
.build();
}
private MarkdownToHtml repoIndexReadme() {
return readme(view, "README.md");
}
private MarkdownToHtml revisionReadme() {
return readme(GitilesView.revision().copyFrom(view).build(), "README.md");
}
private MarkdownToHtml treeReadme(String path) {
GitilesView v = GitilesView.path().copyFrom(view).setPathPart(path).build();
String file = CharMatcher.is('/').trimTrailingFrom(path) + "/README.md";
return readme(v, file);
}
private MarkdownToHtml readme(GitilesView v, String path) {
return MarkdownToHtml.builder()
.setGitilesView(v)
.setConfig(new MarkdownConfig(config))
.setFilePath(path)
.build();
}
@Test
public void rootedDocInRoot() {
testRootedDocInRoot(rootedDoc("/", "/index.md"));
testRootedDocInRoot(rootedDoc("/index.md", "/index.md"));
}
private void testRootedDocInRoot(MarkdownToHtml md) {
assertThat(md.href("setup.md")).isEqualTo("/setup.md");
assertThat(md.href("./setup.md")).isEqualTo("/setup.md");
assertThat(md.href("./")).isEqualTo("/");
assertThat(md.href(".")).isEqualTo("/");
assertThat(md.href("../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("..")).isEqualTo("about:invalid#zSoyz");
}
@Test
public void rootedDocInTree() {
testRootedDocInTree(rootedDoc("/doc", "/doc/index.md"));
testRootedDocInTree(rootedDoc("/doc/", "/doc/index.md"));
testRootedDocInTree(rootedDoc("/doc/index.md", "/doc/index.md"));
}
private void testRootedDocInTree(MarkdownToHtml md) {
assertThat(md.href("setup.md")).isEqualTo("/doc/setup.md");
assertThat(md.href("./setup.md")).isEqualTo("/doc/setup.md");
assertThat(md.href("../setup.md")).isEqualTo("/setup.md");
assertThat(md.href("../tech/setup.md")).isEqualTo("/tech/setup.md");
assertThat(md.href("./")).isEqualTo("/doc");
assertThat(md.href(".")).isEqualTo("/doc");
assertThat(md.href("../")).isEqualTo("/");
assertThat(md.href("..")).isEqualTo("/");
assertThat(md.href("../../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../..")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../../../")).isEqualTo("about:invalid#zSoyz");
assertThat(md.href("../../..")).isEqualTo("about:invalid#zSoyz");
}
private MarkdownToHtml rootedDoc(String path, String file) {
return MarkdownToHtml.builder()
.setGitilesView(
GitilesView.rootedDoc()
.setHostName("gerritcodereview.com")
.setServletPath("")
.setRevision(RootedDocServlet.BRANCH)
.setPathPart(path)
.build())
.setConfig(new MarkdownConfig(config))
.setFilePath(file)
.build();
}
@Test
public void automaticRelativePaths() {
MarkdownToHtml md =
MarkdownToHtml.builder()
.setGitilesView(GitilesView.doc().copyFrom(view).setPathPart("docs/index.md").build())
.setConfig(new MarkdownConfig(config))
.setFilePath("/docs/index.md")
.setRequestUri("/g/repo/+/HEAD/docs/index.md")
.build();
assertThat(md.href("help.md")).isEqualTo("help.md");
assertThat(md.href("/docs/help.md")).isEqualTo("help.md");
assertThat(md.href("technical/format.md")).isEqualTo("technical/format.md");
assertThat(md.href("/docs/technical/format.md")).isEqualTo("technical/format.md");
assertThat(md.href("../README.md")).isEqualTo("/g/repo/+/HEAD/README.md");
assertThat(md.href("../src/catalog.md")).isEqualTo("/g/repo/+/HEAD/src/catalog.md");
assertThat(md.href("/src/catalog.md")).isEqualTo("/g/repo/+/HEAD/src/catalog.md");
}
}