From acab609befb73e27ee91cfeae4966aaf76236b5f Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Thu, 29 Jun 2017 21:38:19 +0200 Subject: [PATCH] Replace bookmark ajax page test with Kotlin version --- .../sone/web/ajax/BookmarkAjaxPageTest.java | 83 ---------------------- .../sone/web/ajax/BookmarkAjaxPageTest.kt | 54 ++++++++++++++ .../pterodactylus/sone/web/ajax/JsonPageTest.kt | 26 +++---- 3 files changed, 68 insertions(+), 95 deletions(-) delete mode 100644 src/test/java/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.java create mode 100644 src/test/kotlin/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.kt diff --git a/src/test/java/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.java b/src/test/java/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.java deleted file mode 100644 index d7c2053..0000000 --- a/src/test/java/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * © 2013 xplosion interactive - */ - -package net.pterodactylus.sone.web.ajax; - -import static com.google.common.base.Optional.of; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.net.URI; -import java.net.URISyntaxException; - -import net.pterodactylus.sone.core.Core; -import net.pterodactylus.sone.data.Post; -import net.pterodactylus.sone.web.WebInterface; -import net.pterodactylus.sone.web.page.FreenetRequest; - -import freenet.clients.http.HTTPRequestImpl; -import freenet.support.api.HTTPRequest; -import org.junit.Test; - -/** - * Tests for {@link BookmarkAjaxPage}. - * - * @author David Roden - */ -public class BookmarkAjaxPageTest { - - @Test - public void testBookmarkingExistingPost() throws URISyntaxException { - /* create mocks. */ - Core core = mock(Core.class); - Post post = mock(Post.class); - when(core.getPost("abc")).thenReturn(of(post)); - WebInterface webInterface = mock(WebInterface.class); - when(webInterface.getCore()).thenReturn(core); - HTTPRequest httpRequest = new HTTPRequestImpl(new URI("/ajax/bookmark.ajax?post=abc"), "GET"); - FreenetRequest request = mock(FreenetRequest.class); - when(request.getHttpRequest()).thenReturn(httpRequest); - - /* create JSON page. */ - BookmarkAjaxPage bookmarkAjaxPage = new BookmarkAjaxPage(webInterface); - JsonReturnObject jsonReturnObject = bookmarkAjaxPage.createJsonObject(request); - - /* verify response. */ - assertThat(jsonReturnObject, notNullValue()); - assertThat(jsonReturnObject.isSuccess(), is(true)); - - /* verify behaviour. */ - verify(core).bookmarkPost(post); - } - - @Test - public void testBookmarkingMissingPost() throws URISyntaxException { - /* create mocks. */ - Core core = mock(Core.class); - WebInterface webInterface = mock(WebInterface.class); - when(webInterface.getCore()).thenReturn(core); - HTTPRequest httpRequest = new HTTPRequestImpl(new URI("/ajax/bookmark.ajax"), "GET"); - FreenetRequest request = mock(FreenetRequest.class); - when(request.getHttpRequest()).thenReturn(httpRequest); - - /* create JSON page. */ - BookmarkAjaxPage bookmarkAjaxPage = new BookmarkAjaxPage(webInterface); - JsonReturnObject jsonReturnObject = bookmarkAjaxPage.createJsonObject(request); - - /* verify response. */ - assertThat(jsonReturnObject, notNullValue()); - assertThat(jsonReturnObject.isSuccess(), is(false)); - assertThat(((JsonErrorReturnObject) jsonReturnObject).getError(), is("invalid-post-id")); - - /* verify behaviour. */ - verify(core, never()).bookmarkPost(any(Post.class)); - } - -} diff --git a/src/test/kotlin/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.kt new file mode 100644 index 0000000..1d26c71 --- /dev/null +++ b/src/test/kotlin/net/pterodactylus/sone/web/ajax/BookmarkAjaxPageTest.kt @@ -0,0 +1,54 @@ +package net.pterodactylus.sone.web.ajax + +import net.pterodactylus.sone.data.Post +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.junit.Test +import org.mockito.ArgumentMatchers.any +import org.mockito.Mockito.never +import org.mockito.Mockito.verify + +/** + * Unit test for [BookmarkAjaxPage]. + */ +class BookmarkAjaxPageTest : JsonPageTest(::BookmarkAjaxPage) { + + @Test + fun `page returns correct path`() { + assertThat(page.path, equalTo("bookmark.ajax")) + } + + @Test + fun `page does not require login`() { + assertThat(page.requiresLogin(), equalTo(false)) + } + + @Test + fun `missing post ID results in invalid id response`() { + assertThat(json.isSuccess, equalTo(false)) + assertThat((json as JsonErrorReturnObject).error, equalTo("invalid-post-id")) + } + + @Test + fun `empty post ID results in invalid id response`() { + addRequestParameter("post", "") + assertThat(json.isSuccess, equalTo(false)) + assertThat((json as JsonErrorReturnObject).error, equalTo("invalid-post-id")) + } + + @Test + fun `invalid post ID results in success but does not bookmark anything`() { + addRequestParameter("post", "missing") + assertThat(json.isSuccess, equalTo(true)) + verify(core, never()).bookmarkPost(any()) + } + + @Test + fun `valid post ID results in success and bookmarks the post`() { + addRequestParameter("post", "valid-post-id") + val post = addNewPost("valid-post-id", "1", 2) + assertThat(json.isSuccess, equalTo(true)) + verify(core).bookmarkPost(post) + } + +} diff --git a/src/test/kotlin/net/pterodactylus/sone/web/ajax/JsonPageTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/ajax/JsonPageTest.kt index 11d5291..b5f17cf 100644 --- a/src/test/kotlin/net/pterodactylus/sone/web/ajax/JsonPageTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/web/ajax/JsonPageTest.kt @@ -12,6 +12,7 @@ import net.pterodactylus.sone.data.Sone import net.pterodactylus.sone.data.Sone.SoneStatus import net.pterodactylus.sone.data.Sone.SoneStatus.idle import net.pterodactylus.sone.test.deepMock +import net.pterodactylus.sone.test.get import net.pterodactylus.sone.test.mock import net.pterodactylus.sone.test.whenever import net.pterodactylus.sone.utils.asOptional @@ -21,19 +22,19 @@ import net.pterodactylus.util.notify.Notification import org.junit.Before import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyString +import org.mockito.ArgumentMatchers.isNull import java.util.NoSuchElementException import javax.naming.SizeLimitExceededException -import kotlin.coroutines.experimental.EmptyCoroutineContext.plus /** * Base class for tests for any [JsonPage] implementations. */ -open class JsonPageTest { +open class JsonPageTest(pageSupplier: (WebInterface) -> JsonPage = { _ -> mock() }) { protected val webInterface = mock() protected val core = mock() protected val elementLoader = mock() - protected open lateinit var page: JsonPage + protected open val page: JsonPage by lazy { pageSupplier(webInterface) } protected val json by lazy { page.createJsonObject(freenetRequest)!! } protected val toadletContext = mock() @@ -63,6 +64,7 @@ open class JsonPageTest { @Before fun setupCore() { whenever(core.getSone(anyString())).thenAnswer { (localSones + remoteSones)[it.getArgument(0)].asOptional() } + whenever(core.getPost(anyString())).thenAnswer { newPosts[it[0]].asOptional() } } @Before @@ -87,6 +89,7 @@ open class JsonPageTest { fun setupHttpRequest() { whenever(httpRequest.getParam(anyString())).thenAnswer { requestParameters[it.getArgument(0)] ?: "" } whenever(httpRequest.getParam(anyString(), anyString())).thenAnswer { requestParameters[it.getArgument(0)] ?: it.getArgument(1) } + whenever(httpRequest.getParam(anyString(), isNull())).thenAnswer { requestParameters[it.getArgument(0)] } whenever(httpRequest.getPart(anyString())).thenAnswer { requestParts[it.getArgument(0)]?.let { SimpleReadOnlyArrayBucket(it.toByteArray()) } } whenever(httpRequest.getPartAsBytesFailsafe(anyString(), anyInt())).thenAnswer { requestParts[it.getArgument(0)]?.toByteArray()?.copyOf(it.getArgument(1)) ?: ByteArray(0) } whenever(httpRequest.getPartAsBytesThrowing(anyString(), anyInt())).thenAnswer { invocation -> requestParts[invocation.getArgument(0)]?.let { it.toByteArray().let { if (it.size > invocation.getArgument(1)) throw SizeLimitExceededException() else it } } ?: throw NoSuchElementException() } @@ -125,15 +128,14 @@ open class JsonPageTest { remoteSones += sone.id to sone } - protected fun addNewPost(id: String, soneId: String, time: Long, recipientId: String? = null) { - newPosts[id] = mock().apply { - whenever(this.id).thenReturn(id) - val sone = mock().apply { whenever(this.id).thenReturn(soneId) } - whenever(this.sone).thenReturn(sone) - whenever(this.time).thenReturn(time) - whenever(this.recipientId).thenReturn(recipientId.asOptional()) - } - } + protected fun addNewPost(id: String, soneId: String, time: Long, recipientId: String? = null) = + mock().apply { + whenever(this.id).thenReturn(id) + val sone = mock().apply { whenever(this.id).thenReturn(soneId) } + whenever(this.sone).thenReturn(sone) + whenever(this.time).thenReturn(time) + whenever(this.recipientId).thenReturn(recipientId.asOptional()) + }.also { newPosts[id] = it } protected fun addNewReply(id: String, soneId: String, postId: String, postSoneId: String) { newReplies[id] = mock().apply { -- 2.7.4