package org.jbake.app;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.ConfigurationException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class ParserTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
public CompositeConfiguration config;
public Parser parser;
private File rootPath;
private File validHTMLFile;
private File invalidHTMLFile;
private File validAsciiDocFile;
private File invalidAsciiDocFile;
private File validAsciiDocFileWithoutHeader;
private File invalidAsciiDocFileWithoutHeader;
private File validAsciiDocFileWithHeaderInContent;
private File validAsciiDocFileWithoutJBakeMetaData;
private String validHeader = "title=This is a Title = This is a valid Title\nstatus=draft\ntype=post\ndate=2013-09-02\n~~~~~~";
private String invalidHeader = "title=This is a Title\n~~~~~~";
@Before
public void createSampleFile() throws Exception {
rootPath = new File(this.getClass().getResource(".").getFile());
config = ConfigUtil.load(rootPath);
parser = new Parser(config,rootPath.getPath());
validHTMLFile = folder.newFile("valid.html");
PrintWriter out = new PrintWriter(validHTMLFile);
out.println(validHeader);
out.println("<p>This is a test.</p>");
out.close();
invalidHTMLFile = folder.newFile("invalid.html");
out = new PrintWriter(invalidHTMLFile);
out.println(invalidHeader);
out.close();
validAsciiDocFile = folder.newFile("valid.ad");
out = new PrintWriter(validAsciiDocFile);
out.println(validHeader);
out.println("= Hello, AsciiDoc!");
out.println("Test User <user@test.org>");
out.println("");
out.println("JBake now supports AsciiDoc.");
out.close();
invalidAsciiDocFile = folder.newFile("invalid.ad");
out = new PrintWriter(invalidAsciiDocFile);
out.println(invalidHeader);
out.println("= Hello, AsciiDoc!");
out.println("Test User <user@test.org>");
out.println("");
out.println("JBake now supports AsciiDoc.");
out.close();
validAsciiDocFileWithoutHeader = folder.newFile("validwoheader.ad");
out = new PrintWriter(validAsciiDocFileWithoutHeader);
out.println("= Hello: AsciiDoc!");
out.println("Test User <user@test.org>");
out.println("2013-09-02");
out.println(":jbake-status: published");
out.println(":jbake-type: page");
out.println("");
out.println("JBake now supports AsciiDoc.");
out.close();
invalidAsciiDocFileWithoutHeader = folder.newFile("invalidwoheader.ad");
out = new PrintWriter(invalidAsciiDocFileWithoutHeader);
out.println("= Hello, AsciiDoc!");
out.println("Test User <user@test.org>");
out.println("2013-09-02");
out.println(":jbake-status: published");
out.println("");
out.println("JBake now supports AsciiDoc.");
out.close();
validAsciiDocFileWithHeaderInContent = folder.newFile("validheaderincontent.ad");
out = new PrintWriter(validAsciiDocFileWithHeaderInContent);
out.println("= Hello, AsciiDoc!");
out.println("Test User <user@test.org>");
out.println("2013-09-02");
out.println(":jbake-status: published");
out.println(":jbake-type: page");
out.println("");
out.println("JBake now supports AsciiDoc.");
out.println("");
out.println("----");
out.println("title=Example Header");
out.println("date=2013-02-01");
out.println("type=post");
out.println("tags=tag1, tag2");
out.println("status=published");
out.println("~~~~~~");
out.println("----");
out.close();
validAsciiDocFileWithoutJBakeMetaData = folder.newFile("validwojbakemetadata.ad");
out = new PrintWriter(validAsciiDocFileWithoutJBakeMetaData);
out.println("= Hello: AsciiDoc!");
out.println("Test User <user@test.org>");
out.println("2013-09-02");
out.println("");
out.println("JBake now supports AsciiDoc documents without JBake meta data.");
out.close();
}
@Test
public void parseValidHTMLFile() {
Map<String, Object> map = parser.processFile(validHTMLFile);
Assert.assertNotNull(map);
Assert.assertEquals("draft", map.get("status"));
Assert.assertEquals("post", map.get("type"));
Assert.assertEquals("This is a Title = This is a valid Title", map.get("title"));
Assert.assertNotNull(map.get("date"));
Calendar cal = Calendar.getInstance();
cal.setTime((Date) map.get("date"));
Assert.assertEquals(8, cal.get(Calendar.MONTH));
Assert.assertEquals(2, cal.get(Calendar.DAY_OF_MONTH));
Assert.assertEquals(2013, cal.get(Calendar.YEAR));
}
@Test
public void parseInvalidHTMLFile() {
Map<String, Object> map = parser.processFile(invalidHTMLFile);
Assert.assertNull(map);
}
@Test
public void parseValidAsciiDocFile() {
Map<String, Object> map = parser.processFile(validAsciiDocFile);
Assert.assertNotNull(map);
Assert.assertEquals("draft", map.get("status"));
Assert.assertEquals("post", map.get("type"));
assertThat(map.get("body").toString())
.contains("class=\"paragraph\"")
.contains("<p>JBake now supports AsciiDoc.</p>");
// Assert.assertEquals("<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>JBake now supports AsciiDoc.</p>\n</div>\n</div>\n</div>", map.get("body"));
}
@Test
public void parseInvalidAsciiDocFile() {
Parser parser = new Parser(config,rootPath.getPath());
Map<String, Object> map = parser.processFile(invalidAsciiDocFile);
Assert.assertNull(map);
}
@Test
public void parseValidAsciiDocFileWithoutHeader() {
Map<String, Object> map = parser.processFile(validAsciiDocFileWithoutHeader);
Assert.assertNotNull(map);
Assert.assertEquals("Hello: AsciiDoc!", map.get("title"));
Assert.assertEquals("published", map.get("status"));
Assert.assertEquals("page", map.get("type"));
assertThat(map.get("body").toString())
.contains("class=\"paragraph\"")
.contains("<p>JBake now supports AsciiDoc.</p>");
// Assert.assertEquals("<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>JBake now supports AsciiDoc.</p>\n</div>\n</div>\n</div>", map.get("body"));
}
@Test
public void parseInvalidAsciiDocFileWithoutHeader() {
Parser parser = new Parser(config,rootPath.getPath());
Map<String, Object> map = parser.processFile(invalidAsciiDocFileWithoutHeader);
Assert.assertNull(map);
}
@Test
public void parseValidAsciiDocFileWithExampleHeaderInContent() {
Map<String, Object> map = parser.processFile(validAsciiDocFileWithHeaderInContent);
Assert.assertNotNull(map);
Assert.assertEquals("published", map.get("status"));
Assert.assertEquals("page", map.get("type"));
assertThat(map.get("body").toString())
.contains("class=\"paragraph\"")
.contains("<p>JBake now supports AsciiDoc.</p>")
.contains("class=\"listingblock\"")
.contains("class=\"content\"")
.contains("<pre>")
.contains("title=Example Header")
.contains("date=2013-02-01")
.contains("tags=tag1, tag2");
// Assert.assertEquals("<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>JBake now supports AsciiDoc.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>title=Example Header\ndate=2013-02-01\ntype=post\ntags=tag1, tag2\nstatus=published\n~~~~~~</pre>\n</div>\n</div>\n</div>\n</div>", map.get("body"));
}
@Test
public void parseValidAsciiDocFileWithoutJBakeMetaDataUsingDefaultTypeAndStatus() throws ConfigurationException {
CompositeConfiguration defaultConfig = ConfigUtil.load(rootPath);
defaultConfig.addProperty(ConfigUtil.Keys.DEFAULT_STATUS, "published");
defaultConfig.addProperty(ConfigUtil.Keys.DEFAULT_TYPE, "page");
Parser parser = new Parser(defaultConfig,rootPath.getPath());
Map<String, Object> map = parser.processFile(validAsciiDocFileWithoutJBakeMetaData);
Assert.assertNotNull(map);
Assert.assertEquals("published", map.get("status"));
Assert.assertEquals("page", map.get("type"));
assertThat(map.get("body").toString())
.contains("<p>JBake now supports AsciiDoc documents without JBake meta data.</p>");
}
}