--- /dev/null
+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()
+
+}
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 "";
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;
}
}
+ 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);
+ }
+ }
+
}
--- /dev/null
+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
+
+}