🚧 Add interactions helper for page maker
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 19 May 2019 18:57:25 +0000 (20:57 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 20 May 2019 18:23:17 +0000 (20:23 +0200)
src/main/kotlin/net/pterodactylus/sone/web/page/PageMakerInteraction.kt [new file with mode: 0644]
src/test/java/net/pterodactylus/sone/test/Dirty.java
src/test/java/net/pterodactylus/sone/test/TestUtil.java
src/test/kotlin/net/pterodactylus/sone/web/page/PageMakerInteractionTest.kt [new file with mode: 0644]

diff --git a/src/main/kotlin/net/pterodactylus/sone/web/page/PageMakerInteraction.kt b/src/main/kotlin/net/pterodactylus/sone/web/page/PageMakerInteraction.kt
new file mode 100644 (file)
index 0000000..8d6884c
--- /dev/null
@@ -0,0 +1,31 @@
+package net.pterodactylus.sone.web.page
+
+import freenet.clients.http.*
+
+class PageMakerInteraction(toadletContext: ToadletContext, pageTitle: String) {
+
+       private val pageMaker: PageMaker = toadletContext.pageMaker
+       private val pageNode: PageNode = pageMaker.getPageNode(pageTitle, toadletContext)
+
+       fun addStyleSheet(styleSheet: String) {
+               pageNode.addCustomStyleSheet(styleSheet)
+       }
+
+       fun addLinkNode(linkAttributes: Map<String, String>) {
+               pageNode.headNode.addChild("link").let {
+                       linkAttributes.forEach(it::addAttribute)
+               }
+       }
+
+       fun addShortcutIcon(shortcutIcon: String) {
+               pageNode.addForwardLink("icon", shortcutIcon)
+       }
+
+       fun setContent(content: String) {
+               pageNode.content.addChild("%", content)
+       }
+
+       fun renderPage(): String =
+                       pageNode.outer.generate()
+
+}
index c7d351c..5d2873f 100644 (file)
@@ -1,16 +1,18 @@
 package net.pterodactylus.sone.test;
 
 import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
- * This annotation marks test methods that are somehow not good test methods.
+ * This annotation marks tests or test methods that are dirty,
+ * i.e. written in a way no test should ever be written in.
  */
 @Retention(SOURCE)
-@Target(METHOD)
+@Target(value = { TYPE, METHOD })
 public @interface Dirty {
 
        String value() default "";
index 22c2057..35e8202 100644 (file)
@@ -1,5 +1,6 @@
 package net.pterodactylus.sone.test;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -43,4 +44,14 @@ public class TestUtil {
                }
        }
 
+       public static <T> T createObject(Class<T> clazz, Class[] parameterTypes, Object... arguments) {
+               try {
+                       Constructor<T> constructor = clazz.getDeclaredConstructor(parameterTypes);
+                       constructor.setAccessible(true);
+                       return constructor.newInstance(arguments);
+               } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
+                       throw new RuntimeException(e);
+               }
+       }
+
 }
diff --git a/src/test/kotlin/net/pterodactylus/sone/web/page/PageMakerInteractionTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/page/PageMakerInteractionTest.kt
new file mode 100644 (file)
index 0000000..178ef09
--- /dev/null
@@ -0,0 +1,67 @@
+package net.pterodactylus.sone.web.page
+
+import freenet.clients.http.*
+import freenet.support.*
+import freenet.support.HTMLNode.*
+import net.pterodactylus.sone.test.*
+import net.pterodactylus.sone.test.TestUtil.*
+import org.hamcrest.MatcherAssert.*
+import org.hamcrest.Matchers.*
+import org.junit.*
+
+@Dirty
+class PageMakerInteractionTest {
+
+       private val toadletContext = deepMock<ToadletContext>()
+       private val pageMaker: PageMaker = toadletContext.pageMaker
+       private val outerNode = HTMLDoctype("html", "-//W3C//DTD XHTML 1.1//EN")
+       private val htmlNode: HTMLNode = outerNode.addChild("html")
+       private val headNode: HTMLNode = htmlNode.addChild("head")
+       private val contentNode: HTMLNode = htmlNode.addChild("body").addChild("div")
+       private val pageNode: PageNode = createObject(PageNode::class.java, arrayOf(HTMLNode::class.java, HTMLNode::class.java, HTMLNode::class.java), outerNode, headNode, contentNode)
+
+       init {
+               whenever(pageMaker.getPageNode("page title", toadletContext)).thenReturn(pageNode)
+       }
+
+       private val pageMakerInteractions = PageMakerInteraction(toadletContext, "page title")
+
+       @Test
+       fun `interactions can add style sheet`() {
+               pageMakerInteractions.addStyleSheet("style.sheet")
+               assertThat(headNode.children.filter { it.name == "link" }.map { it.attributes }, contains(
+                               mapOf("rel" to "stylesheet", "href" to "style.sheet", "type" to "text/css", "media" to "screen")
+               ))
+       }
+
+       @Test
+       fun `link nodes can be added`() {
+               pageMakerInteractions.addLinkNode(mapOf("foo" to "bar"))
+               assertThat(headNode.children.filter { it.name == "link" }.map { it.attributes }, contains(
+                               mapOf("foo" to "bar")
+               ))
+       }
+
+       @Test
+       fun `shortcut icon can be added`() {
+               pageMakerInteractions.addShortcutIcon("shortcut.icon")
+               assertThat(headNode.children.filter { it.name == "link" }.map { it.attributes }, contains(
+                               mapOf("rel" to "icon", "href" to "shortcut.icon")
+               ))
+       }
+
+       @Test
+       fun `content can be set`() {
+               pageMakerInteractions.setContent("foo<bar")
+               assertThat(contentNode.generate(), containsString("foo<bar"))
+       }
+
+       @Test
+       fun `whole page can be rendered`() {
+               pageMakerInteractions.setContent("foo<bar")
+               assertThat(pageMakerInteractions.renderPage(), containsString("foo<bar"))
+       }
+
+       private val HTMLNode.name: String get() = firstTag
+
+}