package net.pterodactylus.sone.template; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; import net.pterodactylus.util.template.Part; import net.pterodactylus.util.template.TemplateContext; import net.pterodactylus.util.template.TemplateException; import com.google.common.base.Charsets; import com.google.common.io.Files; import org.junit.Before; import org.junit.Test; /** * Unit test for {@link FilesystemTemplate}. * * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a> */ public class FilesystemTemplateTest { private final File tempFile; private final FilesystemTemplate filesystemTemplate; private final AtomicReference<StringWriter> stringWriter = new AtomicReference<StringWriter>(new StringWriter()); private final TemplateContext templateContext = new TemplateContext(); public FilesystemTemplateTest() throws IOException { tempFile = File.createTempFile("template-", ".dat"); writeTemplate("Text"); filesystemTemplate = new FilesystemTemplate(tempFile.getAbsolutePath()); } private void writeTemplate(String text) throws IOException { Files.write(text + ".<%foreach values value><% value><%/foreach>", tempFile, Charsets.UTF_8); } @Before public void setupTemplateContext() { templateContext.set("values", Arrays.asList("a", 1)); } @Test(expected = FilesystemTemplate.TemplateFileNotFoundException.class) public void loadingTemplateFromNonExistingFileThrowsException() throws IOException { FilesystemTemplate filesystemTemplate = new FilesystemTemplate("/a/b/c.dat"); filesystemTemplate.getInitialContext(); } @Test public void templateCanBeLoadedFromTheFilesystem() { filesystemTemplate.render(templateContext, stringWriter.get()); assertThat(getRenderedString(), is("Text.a1")); } @Test public void templateCanBeReloaded() throws IOException, InterruptedException { filesystemTemplate.render(templateContext, stringWriter.get()); assertThat(getRenderedString(), is("Text.a1")); Thread.sleep(1000); writeTemplate("New"); filesystemTemplate.render(templateContext, stringWriter.get()); assertThat(getRenderedString(), is("New.a1")); } @Test public void templateIsNotReloadedIfNotChanged() { filesystemTemplate.render(templateContext, stringWriter.get()); assertThat(getRenderedString(), is("Text.a1")); filesystemTemplate.render(templateContext, stringWriter.get()); assertThat(getRenderedString(), is("Text.a1")); } private String getRenderedString() { String renderedString = stringWriter.get().toString(); stringWriter.set(new StringWriter()); return renderedString; } @Test public void initialContextIsCopiedToReloadedTemplates() throws IOException, InterruptedException { filesystemTemplate.getInitialContext().set("values", "test"); Thread.sleep(1000); writeTemplate("New"); assertThat(filesystemTemplate.getInitialContext().get("values"), is((Object) "test")); } @Test public void partsAreCopiedToReloadedTemplates() throws InterruptedException, IOException { filesystemTemplate.add(new Part() { @Override public void render(TemplateContext templateContext, Writer writer) throws TemplateException { try { writer.write(".Test"); } catch (IOException e) { throw new TemplateException(e); } } }); Thread.sleep(1000); writeTemplate("New"); filesystemTemplate.render(templateContext, stringWriter.get()); assertThat(getRenderedString(), is("New.a1.Test")); } }