+++ /dev/null
-/*
- * 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");
- }
- }
-
-}
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>()
--- /dev/null
+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])
+ }
+ }
+ }
+
+}
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.nullValue
import org.junit.Test
+import java.util.concurrent.atomic.AtomicBoolean
/**
* Test for [Optional] utils.
}
@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))
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
/**
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))
}
}