X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2Fpages%2FSearchPageTest.kt;h=a77ffcce5cef5097f947925831c9ba029c3adbbc;hp=106b35076e3cb29303efe20d39e6ae94946f2913;hb=e7319b53b914961d59b8fce999da75adfab54009;hpb=4f2dd6da42af253e7545d7cba5d9e5cb2895eb34 diff --git a/src/test/kotlin/net/pterodactylus/sone/web/pages/SearchPageTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/pages/SearchPageTest.kt index 106b350..a77ffcc 100644 --- a/src/test/kotlin/net/pterodactylus/sone/web/pages/SearchPageTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/web/pages/SearchPageTest.kt @@ -1,6 +1,7 @@ package net.pterodactylus.sone.web.pages import com.google.common.base.Optional.absent +import com.google.common.base.Ticker import net.pterodactylus.sone.data.Album import net.pterodactylus.sone.data.Image import net.pterodactylus.sone.data.Post @@ -8,22 +9,43 @@ import net.pterodactylus.sone.data.PostReply import net.pterodactylus.sone.data.Profile import net.pterodactylus.sone.data.Sone import net.pterodactylus.sone.test.asOptional +import net.pterodactylus.sone.test.isOnPage import net.pterodactylus.sone.test.mock import net.pterodactylus.sone.test.whenever import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.contains +import org.hamcrest.Matchers.equalTo import org.junit.Test +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicInteger /** * Unit test for [SearchPage]. */ class SearchPageTest : WebPageTest() { - private val page = SearchPage(template, webInterface) + private val ticker = mock() + private val page = SearchPage(template, webInterface, ticker) override fun getPage() = page @Test + fun `page returns correct path`() { + assertThat(page.path, equalTo("search.html")) + } + + @Test + fun `page does not require login`() { + assertThat(page.requiresLogin(), equalTo(false)) + } + + @Test + fun `page returns correct title`() { + addTranslation("Page.Search.Title", "search page title") + assertThat(page.getPageTitle(freenetRequest), equalTo("search page title")) + } + + @Test fun `empty query redirects to index page`() { verifyRedirect("index.html") } @@ -226,7 +248,7 @@ class SearchPageTest : WebPageTest() { whenever(this.text).thenReturn(text) } - private fun createSone(id: String, firstName: String, middleName: String, lastName: String) = mock().apply { + private fun createSone(id: String, firstName: String? = null, middleName: String? = null, lastName: String? = null) = mock().apply { whenever(this.id).thenReturn(id) whenever(this.name).thenReturn(id) whenever(this.profile).thenReturn(Profile(this).apply { @@ -259,6 +281,87 @@ class SearchPageTest : WebPageTest() { } } + @Test + fun `sone hits are paginated correctly`() { + core.preferences.postsPerPage = 2 + val sones = listOf(createSone("1Sone"), createSone("Other1"), createSone("22Sone"), createSone("333Sone"), createSone("Other2")) + .onEach { addSone(it.id, it) } + addHttpRequestParameter("query", "sone") + verifyNoRedirect { + assertThat(this["sonePagination"], isOnPage(0).hasPages(2)) + assertThat(this["soneHits"], contains(sones[0], sones[2])) + } + } + + @Test + fun `sone hits page 2 is shown correctly`() { + core.preferences.postsPerPage = 2 + val sones = listOf(createSone("1Sone"), createSone("Other1"), createSone("22Sone"), createSone("333Sone"), createSone("Other2")) + .onEach { addSone(it.id, it) } + addHttpRequestParameter("query", "sone") + addHttpRequestParameter("sonePage", "1") + verifyNoRedirect { + assertThat(this["sonePagination"], isOnPage(1).hasPages(2)) + assertThat(this["soneHits"], contains(sones[3])) + } + } + + @Test + fun `post hits are paginated correctly`() { + core.preferences.postsPerPage = 2 + val sones = listOf(createSoneWithPost("match1", "1Sone"), createSoneWithPost("no-match1", "Other1"), createSoneWithPost("match2", "22Sone"), createSoneWithPost("match3", "333Sone"), createSoneWithPost("no-match2", "Other2")) + addHttpRequestParameter("query", "sone") + verifyNoRedirect { + assertThat(this["postPagination"], isOnPage(0).hasPages(2)) + assertThat(this["postHits"], contains(sones[0], sones[2])) + } + } + + @Test + fun `post hits page 2 is shown correctly`() { + core.preferences.postsPerPage = 2 + val sones = listOf(createSoneWithPost("match1", "1Sone"), createSoneWithPost("no-match1", "Other1"), createSoneWithPost("match2", "22Sone"), createSoneWithPost("match3", "333Sone"), createSoneWithPost("no-match2", "Other2")) + addHttpRequestParameter("query", "sone") + addHttpRequestParameter("postPage", "1") + verifyNoRedirect { + assertThat(this["postPagination"], isOnPage(1).hasPages(2)) + assertThat(this["postHits"], contains(sones[3])) + } + } + + @Test + fun `post search results are cached`() { + val post = createPost("with-match", "text") + val callCounter = AtomicInteger() + whenever(post.text).thenAnswer { callCounter.incrementAndGet(); "text" } + val sone = createSoneWithPost(post) + addSone("sone", sone) + addHttpRequestParameter("query", "text") + verifyNoRedirect { + assertThat(this["postHits"], contains(post)) + } + verifyNoRedirect { + assertThat(callCounter.get(), equalTo(1)) + } + } + + @Test + fun `post search results are cached for five minutes`() { + val post = createPost("with-match", "text") + val callCounter = AtomicInteger() + whenever(post.text).thenAnswer { callCounter.incrementAndGet(); "text" } + val sone = createSoneWithPost(post) + addSone("sone", sone) + addHttpRequestParameter("query", "text") + verifyNoRedirect { + assertThat(this["postHits"], contains(post)) + } + whenever(ticker.read()).thenReturn(TimeUnit.MINUTES.toNanos(5) + 1 ) + verifyNoRedirect { + assertThat(callCounter.get(), equalTo(2)) + } + } + @Suppress("UNCHECKED_CAST") private operator fun get(key: String): T? = templateContext[key] as? T