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
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 net.pterodactylus.sone.utils.Pagination
-import net.pterodactylus.util.template.TemplateContext
+import net.pterodactylus.sone.utils.asOptional
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() {
+class SearchPageTest: WebPageTest2({ template, webInterface -> SearchPage(template, webInterface, ticker) }) {
- private val page = SearchPage(template, webInterface)
-
- override fun getPage() = page
+ companion object {
+ val ticker = mock<Ticker>()
+ }
@Test
fun `page returns correct path`() {
- assertThat(page.path, equalTo("search.html"))
+ assertThat(page.path, equalTo("search.html"))
}
@Test
fun `page does not require login`() {
- assertThat(page.requiresLogin(), equalTo(false))
+ assertThat(page.requiresLogin(), equalTo(false))
}
@Test
fun `page returns correct title`() {
- addTranslation("Page.Search.Title", "search page title")
+ addTranslation("Page.Search.Title", "search page title")
assertThat(page.getPageTitle(freenetRequest), equalTo("search page title"))
}
}
}
+ @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 <T> get(key: String): T? = templateContext[key] as? T