Add possibility to load templates from the filesystem
[Sone.git] / src / test / java / net / pterodactylus / sone / template / FilesystemTemplateTest.java
diff --git a/src/test/java/net/pterodactylus/sone/template/FilesystemTemplateTest.java b/src/test/java/net/pterodactylus/sone/template/FilesystemTemplateTest.java
new file mode 100644 (file)
index 0000000..cd989eb
--- /dev/null
@@ -0,0 +1,111 @@
+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"));
+       }
+
+}