X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2Fpages%2FIndexPageTest.kt;h=91041270d056c62d3763e2f842ff254dc0aaa22b;hp=04c83d654def95d4aa2cdcbd3e3cd04eb606bd55;hb=2e6be6f2fb6afede009dacc48b8e3318e30e5057;hpb=de7568a82eb4150bf6d2b0553841b7b69f84c968 diff --git a/src/test/kotlin/net/pterodactylus/sone/web/pages/IndexPageTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/pages/IndexPageTest.kt index 04c83d6..9104127 100644 --- a/src/test/kotlin/net/pterodactylus/sone/web/pages/IndexPageTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/web/pages/IndexPageTest.kt @@ -1,34 +1,56 @@ package net.pterodactylus.sone.web.pages -import com.google.common.base.Optional.fromNullable -import com.google.common.base.Predicate -import net.pterodactylus.sone.data.Post -import net.pterodactylus.sone.data.Sone -import net.pterodactylus.sone.notify.PostVisibilityFilter -import net.pterodactylus.sone.test.mock -import net.pterodactylus.sone.test.whenever -import net.pterodactylus.sone.web.pages.IndexPage -import net.pterodactylus.sone.web.pages.WebPageTest -import net.pterodactylus.util.web.Method.GET -import org.hamcrest.MatcherAssert.assertThat -import org.hamcrest.Matchers.contains -import org.junit.Before -import org.junit.Test -import org.mockito.ArgumentMatchers +import com.google.common.base.* +import com.google.common.base.Optional.* +import net.pterodactylus.sone.data.* +import net.pterodactylus.sone.notify.* +import net.pterodactylus.sone.test.* +import net.pterodactylus.sone.utils.* +import net.pterodactylus.sone.web.* +import net.pterodactylus.sone.web.page.* +import org.hamcrest.MatcherAssert.* +import org.hamcrest.Matchers.* +import org.junit.* +import org.mockito.* /** * Unit test for [IndexPage]. */ -class IndexPageTest : WebPageTest() { +class IndexPageTest : WebPageTest({ webInterface, loaders, templateRenderer -> IndexPage(webInterface, loaders, templateRenderer, postVisibilityFilter) }) { - private val postVisibilityFilter = mock() - private val page = IndexPage(template, webInterface, postVisibilityFilter) + companion object { + private val postVisibilityFilter = mock() + } + + @Test + fun `page returns correct path`() { + assertThat(page.path, equalTo("index.html")) + } + + @Test + fun `page requires login`() { + assertThat(page.requiresLogin(), equalTo(true)) + } + + @Test + fun `page returns correct title`() { + whenever(l10n.getString("Page.Index.Title")).thenReturn("index page title") + assertThat(page.getPageTitle(soneRequest), equalTo("index page title")) + } @Before fun setupPostVisibilityFilter() { - whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(object : Predicate { - override fun apply(input: Post?) = true - }) + whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(Predicate { true }) + } + + @Before + fun setupCurrentSone() { + whenever(currentSone.id).thenReturn("current") + } + + @Before + fun setupDirectedPosts() { + whenever(core.getDirectedPosts("current")).thenReturn(emptyList()) } private fun createPost(time: Long, directed: Boolean = false) = mock().apply { @@ -40,8 +62,7 @@ class IndexPageTest : WebPageTest() { fun `index page shows all posts of current sone`() { val posts = listOf(createPost(3000), createPost(2000), createPost(1000)) whenever(currentSone.posts).thenReturn(posts) - request("", GET) - page.handleRequest(freenetRequest, templateContext) + page.processTemplate(freenetRequest, templateContext) @Suppress("UNCHECKED_CAST") assertThat(templateContext["posts"] as Iterable, contains(*posts.toTypedArray())) } @@ -54,8 +75,8 @@ class IndexPageTest : WebPageTest() { val notFollowedPosts = listOf(createPost(2500, true), createPost(1500)) whenever(notFollowedSone.posts).thenReturn(notFollowedPosts) addSone("notfollowed1", notFollowedSone) - request("", GET) - page.handleRequest(freenetRequest, templateContext) + whenever(core.getDirectedPosts("current")).thenReturn(listOf(notFollowedPosts[0])) + page.processTemplate(freenetRequest, templateContext) @Suppress("UNCHECKED_CAST") assertThat(templateContext["posts"] as Iterable, contains( posts[0], notFollowedPosts[0], posts[1], posts[2] @@ -71,12 +92,75 @@ class IndexPageTest : WebPageTest() { whenever(followedSone.posts).thenReturn(followedPosts) whenever(currentSone.friends).thenReturn(listOf("followed1", "followed2")) addSone("followed1", followedSone) - request("", GET) - page.handleRequest(freenetRequest, templateContext) + page.processTemplate(freenetRequest, templateContext) @Suppress("UNCHECKED_CAST") assertThat(templateContext["posts"] as Iterable, contains( posts[0], followedPosts[0], posts[1], followedPosts[1], posts[2] )) } + @Test + fun `index page uses post visibility filter`() { + val posts = listOf(createPost(3000), createPost(2000), createPost(1000)) + whenever(currentSone.posts).thenReturn(posts) + val followedSone = mock() + val followedPosts = listOf(createPost(2500, true), createPost(1500)) + whenever(followedSone.posts).thenReturn(followedPosts) + whenever(currentSone.friends).thenReturn(listOf("followed1", "followed2")) + whenever(postVisibilityFilter.isVisible(ArgumentMatchers.eq(currentSone))).thenReturn(Predicate { (it?.time ?: 10000) < 2500 }) + addSone("followed1", followedSone) + page.processTemplate(freenetRequest, templateContext) + @Suppress("UNCHECKED_CAST") + assertThat(templateContext["posts"] as Iterable, contains( + posts[1], followedPosts[1], posts[2] + )) + } + + @Test + fun `index page sets pagination correctly`() { + val posts = listOf(createPost(3000), createPost(2000), createPost(1000)) + whenever(currentSone.posts).thenReturn(posts) + page.processTemplate(freenetRequest, templateContext) + @Suppress("UNCHECKED_CAST") + assertThat((templateContext["pagination"] as Pagination).items, contains( + posts[0], posts[1], posts[2] + )) + } + + @Test + fun `index page sets page correctly`() { + val posts = listOf(createPost(3000), createPost(2000), createPost(1000)) + whenever(currentSone.posts).thenReturn(posts) + core.preferences.newPostsPerPage = 1 + addHttpRequestParameter("page", "2") + page.processTemplate(freenetRequest, templateContext) + @Suppress("UNCHECKED_CAST") + assertThat((templateContext["pagination"] as Pagination).page, equalTo(2)) + } + + @Test + fun `index page without posts sets correct pagination`() { + core.preferences.newPostsPerPage = 1 + page.processTemplate(freenetRequest, templateContext) + @Suppress("UNCHECKED_CAST") + (templateContext["pagination"] as Pagination).let { pagination -> + assertThat(pagination.items, emptyIterable()) + } + } + + @Test + fun `page can be created by dependency injection`() { + assertThat(baseInjector.getInstance(), notNullValue()) + } + + @Test + fun `page is annotated with correct menuname`() { + assertThat(page.menuName, equalTo("Index")) + } + + @Test + fun `page is annotated with correct template path`() { + assertThat(page.templatePath, equalTo("/templates/index.html")) + } + }