package com.gitblit.wicket; import static org.junit.Assert.*; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import com.gitblit.manager.IManager; import com.gitblit.manager.IPluginManager; import com.gitblit.manager.IRuntimeManager; import com.gitblit.models.PluginRegistry; import com.gitblit.tests.mock.MockGitblitContext; import com.gitblit.tests.mock.MockRuntimeManager; import org.apache.wicket.util.tester.WicketTester; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.junit.Before; import org.junit.Test; import com.gitblit.Keys; import com.gitblit.tests.mock.MemorySettings; import com.gitblit.utils.JSoupXssFilter; import com.gitblit.wicket.MarkupProcessor.MarkupDocument; import ro.fortsoft.pf4j.PluginState; import ro.fortsoft.pf4j.PluginWrapper; import ro.fortsoft.pf4j.Version; public class MarkupProcessorTest { private WicketTester tester; private MockGitblitContext gbctx; @Before public void setUp() { IRuntimeManager rm = new MockRuntimeManager(getSettings()); gbctx = new MockGitblitContext(); gbctx.addManager(rm); tester = new WicketTester(new GitBlitWebApp(null, null, rm, getPluginManager(), null, null, null, null, null, null, null, null, null)); } /* * The unit tests for MarkupProcessor have two major goals. * One is to check that links are rendered correctly, and * the second one is that XSS protection is working. * * The proper rendering of markup for the various Wiki/Markdown * languages is not in focus. This, as a secondary goal, the Wiki/Md * syntax rendering can be tested to make sure that when switching to * a new or updated wiki syntax library nothing breaks and the pages * are still rendered correctly. * Or, to make sure things actually render correctly, because currently * they don't as cen be seen with reference images and wiki links, * for example. */ @Test public void testParseMdRepoRelativeLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a page](file.md)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/file.md", href); } @Test public void testParseMdRepoRelativeLinkSubfolder() { String psep ="%2F"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a file](folder/file.md)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"file.md", href); } @Test public void testParseMdRepoRelativeLinkSubSubfolder() { String psep ="%2F"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a file](sub/folder/file.md)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/sub"+psep+"folder"+psep+"file.md", href); } @Test public void testParseMdRepoRelativeLinkUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a page](日本語.md)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/%E6%97%A5%E6%9C%AC%E8%AA%9E.md", href); } @Test public void testParseMdRepoRelativeLinkSubfolderUtf8() { String psep ="%2F"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a file](folder/receitas_de_culinária/file.md)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"receitas_de_culin%C3%A1ria"+psep+"file.md", href); } @Test public void testParseMdExternalLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a website](http://example.com/page.html)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","http://example.com/page.html", href); } @Test public void testParseMdExternalLinkBare() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: "; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","http://example.com/page.html", href); } // We leave it up to the document author to write working links in the document @Test public void testParseMdExternalLinkUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [Japanese](http://example.com/lang/日本語.html)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","http://example.com/lang/日本語.html", href); } @Test public void testParseMdRepoRelativeRefLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a page][1]\n\n[1]: file.md"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/file.md", href); } @Test public void testParseMdRepoRelativeRefLinkSubfolder() { String psep ="%2F"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a file][file]\n\n[file]: folder/file.md"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"file.md", href); } @Test public void testParseMdRepoRelativeRefLinkSubSubfolder() { String psep ="%2F"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a file][l1] \n\n[l1]: sub/folder/file.md"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/sub"+psep+"folder"+psep+"file.md", href); } @Test public void testParseMdRepoRelativeRefLinkUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a page][x]\n\n[x]: 日本語.md"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/%E6%97%A5%E6%9C%AC%E8%AA%9E.md", href); } @Test public void testParseMdRepoRelativeRefLinkSubfolderUtf8() { String psep ="%2F"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a file][xy]\n\n[xy]: folder/receitas_de_culinária/file.md"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"receitas_de_culin%C3%A1ria"+psep+"file.md", href); } @Test public void testParseMdExternalRefLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [a website][ex]\n\n[ex]: http://example.com/page.html"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","http://example.com/page.html", href); } /* * Apparently wiki style links currently do not work in Markdown. @Test public void testParseMdWikiLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "link: [[page]]"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/page", href); } */ @Test public void testParseMdRepoRelativeImage() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a graphic](graphic.gif)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); markup = "image: ![a graphic](graphic.gif \"Some graphic\")"; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); } @Test public void testParseMdRepoRelativeImageUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![look the dog](ドッグ.gif)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); markup = "image: ![look the dog](ドッグ.gif \"シーバ\")"; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); } @Test public void testParseMdRepoRelativeImageSubfolder() { String psep ="!"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a graphic](results/graphic.gif)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/results"+psep+"graphic.gif", ref); markup = "image: ![a graphic](results/graphic.gif \"Some graphic\")"; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/results"+psep+"graphic.gif", ref); } @Test public void testParseMdRepoRelativeImageSubfolderUtf8() { String psep ="!"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a cat](folder/картинки/cat.jpg)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); markup = "image: ![a cat](folder/картинки/cat.jpg \"Кошка\")"; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); } @Test public void testParseMdExternalImage() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a cat](http://example.com/cats/meow.jpg)"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); markup = "image: ![a cat](http://example.com/cats/meow.jpg \"Miau\")"; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); } @Test public void testParseMdRepoRelativeRefImage() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a graphic][1]\n\n[1]: graphic.gif"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); markup = "image: ![a graphic][2]\n\n[2]: graphic.gif \"Some graphic\""; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); } @Test public void testParseMdRepoRelativeRefImageUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![look the dog][1]\n\n[1]: ドッグ.gif"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); markup = "image: ![look the dog][1]\n\n[1]: ドッグ.gif \"シーバ\""; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); } @Test public void testParseMdRepoRelativeRefImageSubfolder() { String psep ="!"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a cat][cat]\n\n[cat]: folder/cat.jpg"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"cat.jpg", ref); markup = "image: ![a cat][cat]\n\n[cat]: folder/cat.jpg \"Кошка\""; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"cat.jpg", ref); } @Test public void testParseMdRepoRelativeRefImageSubfolderUtf8() { String psep ="!"; MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a cat][i1]\n\n[i1]: folder/картинки/cat.jpg"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); markup = "image: ![a cat][i1]\n\n[i1]: folder/картинки/cat.jpg \"Кошка\""; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); } @Test public void testParseMdExternalRefImage() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String markup = "image: ![a cat][1]\n\n[1]: http://example.com/cats/meow.jpg"; MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); markup = "image: ![a cat][1]\n\n[1]: http://example.com/cats/meow.jpg \"Miau\""; mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); doc = Jsoup.parseBodyFragment(mdoc.html); ref = doc.getElementsByAttribute("src").attr("src"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); } @Test public void testParseMediaWikiRepoRelativeLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String psep = "%2F"; String markup = "link: [[document]]"; MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("href").attr("href"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect link href rendered","doc/wikirepo/12345abcde/wiki"+ psep + "document", ref); } @Test public void testParseMediaWikiRepoRelativeLinkUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String psep = "%2F"; String markup = "link: [[日本語]]"; MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","doc/wikirepo/12345abcde/wiki" + psep + "%E6%97%A5%E6%9C%AC%E8%AA%9E", href); } @Test public void testParseMediaWikiExternalLink() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String psep = "%2F"; String markup = "link: [http://example.com/some/document.html document]"; MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("href").attr("href"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect link href rendered","http://example.com/some/document.html", ref); } @Test public void testParseMediaWikiExternalLinkNumbered() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String psep = "%2F"; String markup = "link: [http://example.com/some/document.html]"; MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("href").attr("href"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect link href rendered","http://example.com/some/document.html", ref); } @Test public void testParseMediaWikiExternalLinkBare() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String psep = "%2F"; String markup = "link: http://example.com/some/document.html"; MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String ref = doc.getElementsByAttribute("href").attr("href"); assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); assertEquals("Incorrect link href rendered","http://example.com/some/document.html", ref); } // We leave it up to the document author to write working links in the document @Test public void testParseMediaWikiExternalLinkUtf8() { MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); String psep = "%2F"; String markup = "link: [http://example.com/lang/日本語.html Japanese]"; MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); Document doc = Jsoup.parseBodyFragment(mdoc.html); String href = doc.getElementsByAttribute("href").attr("href"); assertEquals("Incorrect link rendered","http://example.com/lang/日本語.html", href); } private MemorySettings getSettings() { Map backingMap = new HashMap(); backingMap.put(Keys.web.documents, "readme"); backingMap.put(Keys.web.blobEncodings, "UTF-8 ISO-8859-1"); backingMap.put(Keys.web.confluenceExtensions, "confluence"); backingMap.put(Keys.web.markdownExtensions, "md mkd markdown MD MKD"); backingMap.put(Keys.web.mediawikiExtensions, "mw mediawiki"); backingMap.put(Keys.web.textileExtensions, "textile"); backingMap.put(Keys.web.tracwikiExtensions, "tracwiki"); backingMap.put(Keys.web.twikiExtensions, "twiki"); backingMap.put(Keys.web.forwardSlashCharacter, "/"); backingMap.put(Keys.web.mountParameters, true); MemorySettings ms = new MemorySettings(backingMap); return ms; } private IPluginManager getPluginManager() { return new IPluginManager() { @Override public Version getSystemVersion() { return null; } @Override public void startPlugins() { } @Override public void stopPlugins() { } @Override public PluginState startPlugin(String pluginId) { return null; } @Override public PluginState stopPlugin(String pluginId) { return null; } @Override public List> getExtensionClasses(String pluginId) { return null; } @Override public List getExtensions(Class type) { return null; } @Override public List getPlugins() { return Collections.emptyList(); } @Override public PluginWrapper getPlugin(String pluginId) { return null; } @Override public PluginWrapper whichPlugin(Class clazz) { return null; } @Override public boolean disablePlugin(String pluginId) { return false; } @Override public boolean enablePlugin(String pluginId) { return false; } @Override public boolean uninstallPlugin(String pluginId) { return false; } @Override public boolean refreshRegistry(boolean verifyChecksum) { return false; } @Override public boolean installPlugin(String url, boolean verifyChecksum) throws IOException { return false; } @Override public boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum) throws IOException { return false; } @Override public List getRegisteredPlugins() { return null; } @Override public List getRegisteredPlugins(PluginRegistry.InstallState state) { return null; } @Override public PluginRegistry.PluginRegistration lookupPlugin(String idOrName) { return null; } @Override public PluginRegistry.PluginRelease lookupRelease(String idOrName, String version) { return null; } @Override public IManager start() { return null; } @Override public IManager stop() { return null; } }; } }