Replace unbookmark page with Kotlin version
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 3 Jun 2017 22:52:49 +0000 (00:52 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 4 Jun 2017 09:55:29 +0000 (11:55 +0200)
src/main/java/net/pterodactylus/sone/web/pages/UnbookmarkPage.java [deleted file]
src/main/kotlin/net/pterodactylus/sone/utils/Optionals.kt
src/main/kotlin/net/pterodactylus/sone/web/pages/UnbookmarkPage.kt [new file with mode: 0644]
src/test/kotlin/net/pterodactylus/sone/utils/OptionalsTest.kt
src/test/kotlin/net/pterodactylus/sone/web/pages/UnbookmarkPageTest.kt

diff --git a/src/main/java/net/pterodactylus/sone/web/pages/UnbookmarkPage.java b/src/main/java/net/pterodactylus/sone/web/pages/UnbookmarkPage.java
deleted file mode 100644 (file)
index 6fa037f..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Sone - UnbookmarkPage.java - Copyright © 2011–2016 David Roden
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package net.pterodactylus.sone.web.pages;
-
-import java.util.Set;
-
-import net.pterodactylus.sone.data.Post;
-import net.pterodactylus.sone.web.WebInterface;
-import net.pterodactylus.sone.web.page.FreenetRequest;
-import net.pterodactylus.util.template.Template;
-import net.pterodactylus.util.template.TemplateContext;
-import net.pterodactylus.util.web.Method;
-
-import com.google.common.base.Optional;
-
-/**
- * Page that lets the user unbookmark a post.
- *
- * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
- */
-public class UnbookmarkPage extends SoneTemplatePage {
-
-       /**
-        * @param template
-        *            The template to render
-        * @param webInterface
-        *            The Sone web interface
-        */
-       public UnbookmarkPage(Template template, WebInterface webInterface) {
-               super("unbookmark.html", template, "Page.Unbookmark.Title", webInterface);
-       }
-
-       //
-       // SONETEMPLATEPAGE METHODS
-       //
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       protected void handleRequest(FreenetRequest request, TemplateContext templateContext) throws RedirectException {
-               if (request.getMethod() == Method.POST) {
-                       String id = request.getHttpRequest().getPartAsStringFailsafe("post", 36);
-                       String returnPage = request.getHttpRequest().getPartAsStringFailsafe("returnPage", 256);
-                       Optional<Post> post = webInterface.getCore().getPost(id);
-                       if (post.isPresent()) {
-                               webInterface.getCore().unbookmarkPost(post.get());
-                       }
-                       throw new RedirectException(returnPage);
-               }
-               String id = request.getHttpRequest().getParam("post");
-               if (id.equals("allNotLoaded")) {
-                       Set<Post> posts = webInterface.getCore().getBookmarkedPosts();
-                       for (Post post : posts) {
-                               if (!post.isLoaded()) {
-                                       webInterface.getCore().unbookmarkPost(post);
-                               }
-                       }
-                       throw new RedirectException("bookmarks.html");
-               }
-       }
-
-}
index 35487ed..5f53ed0 100644 (file)
@@ -3,5 +3,6 @@ package net.pterodactylus.sone.utils
 import com.google.common.base.Optional
 
 fun <T, R> Optional<T>.let(block: (T) -> R): R? = if (isPresent) block(get()) else null
+fun <T> Optional<T>.also(block: (T) -> Unit) = if (isPresent) block(get()) else Unit
 
 fun <T> T?.asOptional(): Optional<T> = this?.let { Optional.of(it) } ?: Optional.absent<T>()
diff --git a/src/main/kotlin/net/pterodactylus/sone/web/pages/UnbookmarkPage.kt b/src/main/kotlin/net/pterodactylus/sone/web/pages/UnbookmarkPage.kt
new file mode 100644 (file)
index 0000000..6af1bcf
--- /dev/null
@@ -0,0 +1,36 @@
+package net.pterodactylus.sone.web.pages
+
+import net.pterodactylus.sone.data.Post
+import net.pterodactylus.sone.utils.also
+import net.pterodactylus.sone.utils.isGET
+import net.pterodactylus.sone.utils.isPOST
+import net.pterodactylus.sone.utils.parameters
+import net.pterodactylus.sone.web.WebInterface
+import net.pterodactylus.sone.web.page.FreenetRequest
+import net.pterodactylus.util.template.Template
+import net.pterodactylus.util.template.TemplateContext
+
+/**
+ * Page that lets the user unbookmark a post.
+ */
+class UnbookmarkPage(template: Template, webInterface: WebInterface):
+               SoneTemplatePage("unbookmark.html", template, "Page.Unbookmark.Title", webInterface, false) {
+
+       override fun handleRequest(request: FreenetRequest, templateContext: TemplateContext) {
+               when {
+                       request.isGET && (request.parameters["post"] == "allNotLoaded") -> {
+                               webInterface.core.bookmarkedPosts
+                                               .filterNot(Post::isLoaded)
+                                               .forEach(webInterface.core::unbookmarkPost)
+                               throw RedirectException("bookmarks.html")
+                       }
+                       request.isPOST -> {
+                               request.parameters["post", 36]
+                                               .let(webInterface.core::getPost)
+                                               .also(webInterface.core::unbookmarkPost)
+                               throw RedirectException(request.parameters["returnPage", 256])
+                       }
+               }
+       }
+
+}
index 2a49db0..6d35509 100644 (file)
@@ -5,6 +5,7 @@ import org.hamcrest.MatcherAssert.assertThat
 import org.hamcrest.Matchers.equalTo
 import org.hamcrest.Matchers.nullValue
 import org.junit.Test
+import java.util.concurrent.atomic.AtomicBoolean
 
 /**
  * Test for [Optional] utils.
@@ -24,6 +25,20 @@ class OptionalsTest {
        }
 
        @Test
+       fun `present optional can be processed with also`() {
+               val called = AtomicBoolean(false)
+               Optional.of(1).also { if (it == 1) called.set(true) }
+               assertThat(called.get(), equalTo(true))
+       }
+
+       @Test
+       fun `absent optional is not processed with also`() {
+               val called = AtomicBoolean(false)
+               Optional.absent<Int>().also { called.set(true) }
+               assertThat(called.get(), equalTo(false))
+       }
+
+       @Test
        fun `1 as optional is correct optional`() {
                val optional = 1.asOptional()
                assertThat(optional.get(), equalTo(1))
index 1123ec8..fddc9a3 100644 (file)
@@ -1,14 +1,17 @@
 package net.pterodactylus.sone.web.pages
 
 import net.pterodactylus.sone.data.Post
+import net.pterodactylus.sone.test.capture
 import net.pterodactylus.sone.test.mock
 import net.pterodactylus.sone.test.whenever
 import net.pterodactylus.util.web.Method.POST
 import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.contains
 import org.hamcrest.Matchers.equalTo
 import org.junit.Test
 import org.mockito.Mockito.any
 import org.mockito.Mockito.never
+import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 
 /**
@@ -50,10 +53,9 @@ class UnbookmarkPageTest: WebPageTest() {
                val notLoadedPost2 = mock<Post>()
                whenever(core.bookmarkedPosts).thenReturn(setOf(loadedPost1, loadedPost2, notLoadedPost1, notLoadedPost2))
                verifyRedirect("bookmarks.html") {
-                       verify(core).unbookmarkPost(notLoadedPost1)
-                       verify(core).unbookmarkPost(notLoadedPost2)
-                       verify(core, never()).unbookmarkPost(loadedPost1)
-                       verify(core, never()).unbookmarkPost(loadedPost2)
+                       val postCaptor = capture<Post>()
+                       verify(core, times(2)).unbookmarkPost(postCaptor.capture())
+                       assertThat(postCaptor.allValues, contains(notLoadedPost1, notLoadedPost2))
                }
        }