X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2Fajax%2FJsonPageTest.kt;h=b0a67d477368732b6c3d95f0adfef9b4aeae9cac;hp=9b19aa3e22f10b77dcdd4d7081b11566425503db;hb=858eb848396910330160dcce9817c0d3e6d37cce;hpb=dd96e781b592c3bae9b0f66f85ba05a4e4cc18ce 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 9b19aa3..b0a67d4 100644 --- a/src/test/kotlin/net/pterodactylus/sone/web/ajax/JsonPageTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/web/ajax/JsonPageTest.kt @@ -1,6 +1,7 @@ package net.pterodactylus.sone.web.ajax import freenet.clients.http.ToadletContext +import freenet.support.SimpleReadOnlyArrayBucket import freenet.support.api.HTTPRequest import net.pterodactylus.sone.core.Core import net.pterodactylus.sone.core.ElementLoader @@ -10,25 +11,33 @@ import net.pterodactylus.sone.data.PostReply 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.asOptional 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 import net.pterodactylus.sone.web.WebInterface import net.pterodactylus.sone.web.page.FreenetRequest import net.pterodactylus.util.notify.Notification +import net.pterodactylus.util.web.Method.GET import org.junit.Before +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyString +import org.mockito.ArgumentMatchers.eq +import org.mockito.ArgumentMatchers.isNull +import java.util.NoSuchElementException +import javax.naming.SizeLimitExceededException /** * 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() @@ -36,16 +45,19 @@ open class JsonPageTest { protected val httpRequest = mock() protected val currentSone = deepMock() + private val requestHeaders = mutableMapOf() private val requestParameters = mutableMapOf() + private val requestParts = mutableMapOf() private val localSones = mutableMapOf() private val remoteSones = mutableMapOf() private val newPosts = mutableMapOf() private val newReplies = mutableMapOf() - private val loadedElements = mutableMapOf() + private val linkedElements = mutableMapOf() private val notifications = mutableListOf() @Before fun setupWebInterface() { + whenever(webInterface.getCurrentSone(eq(toadletContext), anyBoolean())).thenReturn(currentSone) whenever(webInterface.getCurrentSoneCreatingSession(toadletContext)).thenReturn(currentSone) whenever(webInterface.getCurrentSoneWithoutCreatingSession(toadletContext)).thenReturn(currentSone) whenever(webInterface.core).thenReturn(core) @@ -57,12 +69,13 @@ 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 fun setupElementLoader() { whenever(elementLoader.loadElement(anyString())).thenAnswer { - loadedElements[it.getArgument(0)] ?: LinkedElement(it.getArgument(0), loading = true) + linkedElements[it.getArgument(0)] ?: LinkedElement(it.getArgument(0), loading = true) } } @@ -74,15 +87,28 @@ open class JsonPageTest { @Before fun setupFreenetRequest() { whenever(freenetRequest.toadletContext).thenReturn(toadletContext) + whenever(freenetRequest.method).thenReturn(GET) whenever(freenetRequest.httpRequest).thenReturn(httpRequest) } @Before fun setupHttpRequest() { + whenever(httpRequest.method).thenReturn("GET") + whenever(httpRequest.getHeader(anyString())).thenAnswer { requestHeaders[it.get(0).toLowerCase()] } 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() } + whenever(httpRequest.getPartAsStringFailsafe(anyString(), anyInt())).thenAnswer { requestParts[it.getArgument(0)]?.substring(0, it.getArgument(1)) ?: "" } + whenever(httpRequest.getPartAsStringThrowing(anyString(), anyInt())).thenAnswer { invocation -> requestParts[invocation.getArgument(0)]?.let { if (it.length > invocation.getArgument(1)) throw SizeLimitExceededException() else it } ?: throw NoSuchElementException() } + whenever(httpRequest.getIntPart(anyString(), anyInt())).thenAnswer { invocation -> requestParts[invocation.getArgument(0)]?.toIntOrNull() ?: invocation.getArgument(1) } + whenever(httpRequest.isPartSet(anyString())).thenAnswer { it.getArgument(0) in requestParts } } + protected val JsonReturnObject.error get() = if (this is JsonErrorReturnObject) this.error else null + protected fun Sone.mock(id: String, name: String, local: Boolean = false, time: Long, status: SoneStatus = idle) = apply { whenever(this.id).thenReturn(id) whenever(this.name).thenReturn(name) @@ -92,14 +118,23 @@ open class JsonPageTest { } protected fun unsetCurrentSone() { + whenever(webInterface.getCurrentSone(eq(toadletContext), anyBoolean())).thenReturn(null) whenever(webInterface.getCurrentSoneWithoutCreatingSession(toadletContext)).thenReturn(null) whenever(webInterface.getCurrentSoneCreatingSession(toadletContext)).thenReturn(null) } + protected fun addRequestHeader(key: String, value: String) { + requestHeaders += key.toLowerCase() to value + } + protected fun addRequestParameter(key: String, value: String) { requestParameters += key to value } + protected fun addRequestPart(key: String, value: String) { + requestParts += key to value + } + protected fun addNotification(vararg notifications: Notification) { this.notifications += notifications } @@ -108,15 +143,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 { @@ -132,8 +166,8 @@ open class JsonPageTest { } } - protected fun addLoadedElement(link: String, loading: Boolean, failed: Boolean) { - loadedElements[link] = LinkedElement(link, failed, loading) + protected fun addLinkedElement(link: String, loading: Boolean, failed: Boolean) { + linkedElements[link] = LinkedElement(link, failed, loading) } }