X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FDefaultElementLoaderTest.kt;fp=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FDefaultElementLoaderTest.kt;h=adc5bc96c28421a0acb4cd629172d21740165159;hb=675710fc669a9f5ccfab42296a3aa0b822539e14;hp=0000000000000000000000000000000000000000;hpb=d8bf8d6a89ce08693868fa7fac5d18d6d31256ce;p=Sone.git diff --git a/src/test/kotlin/net/pterodactylus/sone/core/DefaultElementLoaderTest.kt b/src/test/kotlin/net/pterodactylus/sone/core/DefaultElementLoaderTest.kt new file mode 100644 index 0000000..adc5bc9 --- /dev/null +++ b/src/test/kotlin/net/pterodactylus/sone/core/DefaultElementLoaderTest.kt @@ -0,0 +1,81 @@ +package net.pterodactylus.sone.core + +import com.google.common.io.ByteStreams +import com.google.common.io.Files +import freenet.keys.FreenetURI +import net.pterodactylus.sone.core.FreenetInterface.BackgroundFetchCallback +import net.pterodactylus.sone.test.capture +import net.pterodactylus.sone.test.mock +import org.hamcrest.MatcherAssert +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers +import org.hamcrest.Matchers.`is` +import org.hamcrest.Matchers.instanceOf +import org.hamcrest.Matchers.nullValue +import org.junit.Test +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.eq +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import java.io.ByteArrayOutputStream + +/** + * Unit test for [DefaultElementLoaderTest]. + */ +class DefaultElementLoaderTest { + + companion object { + private const val IMAGE_ID = "KSK@gpl.png" + } + + private val freenetInterface = mock() + private val elementLoader = DefaultElementLoader(freenetInterface) + private val callback = capture() + + @Test + fun `image loader starts request for link that is not known`() { + elementLoader.loadElement(IMAGE_ID) + verify(freenetInterface).startFetch(eq(FreenetURI(IMAGE_ID)), any()) + } + + @Test + fun `element loader only starts request once`() { + elementLoader.loadElement(IMAGE_ID) + elementLoader.loadElement(IMAGE_ID) + verify(freenetInterface).startFetch(eq(FreenetURI(IMAGE_ID)), any()) + } + + @Test + fun `element loader returns loading element on first call`() { + assertThat(elementLoader.loadElement(IMAGE_ID).loading, `is`(true)) + } + + @Test + fun `image loader can load image`() { + elementLoader.loadElement(IMAGE_ID) + verify(freenetInterface).startFetch(eq(FreenetURI(IMAGE_ID)), callback.capture()) + callback.value.loaded(FreenetURI(IMAGE_ID), "image/png", read("/static/images/unknown-image-0.png")) + val linkedElement = elementLoader.loadElement(IMAGE_ID) + assertThat(linkedElement.link, `is`(IMAGE_ID)) + assertThat(linkedElement.loading, `is`(false)) + assertThat(linkedElement, instanceOf(LinkedImage::class.java)) + } + + @Test + fun `image can be loaded again after it failed`() { + elementLoader.loadElement(IMAGE_ID) + verify(freenetInterface).startFetch(eq(FreenetURI(IMAGE_ID)), callback.capture()) + callback.value.failed(FreenetURI(IMAGE_ID)) + elementLoader.loadElement(IMAGE_ID) + verify(freenetInterface, times(2)).startFetch(eq(FreenetURI(IMAGE_ID)), callback.capture()) + } + + private fun read(resource: String): ByteArray = + javaClass.getResourceAsStream(resource)?.use { input -> + ByteArrayOutputStream().use { + ByteStreams.copy(input, it) + it + }.toByteArray() + } ?: ByteArray(0) + +}