1 package net.pterodactylus.sone.web.pages
3 import net.pterodactylus.sone.data.Post
4 import net.pterodactylus.sone.data.PostReply
5 import net.pterodactylus.sone.test.getInstance
6 import net.pterodactylus.sone.test.mock
7 import net.pterodactylus.sone.test.whenever
8 import net.pterodactylus.sone.utils.Pagination
9 import net.pterodactylus.sone.utils.asOptional
10 import net.pterodactylus.sone.web.baseInjector
11 import org.hamcrest.MatcherAssert.assertThat
12 import org.hamcrest.Matchers.contains
13 import org.hamcrest.Matchers.containsInAnyOrder
14 import org.hamcrest.Matchers.equalTo
15 import org.hamcrest.Matchers.notNullValue
16 import org.junit.Before
18 import java.util.Arrays.asList
21 * Unit test for [NewPage].
23 class NewPageTest: WebPageTest(::NewPage) {
26 fun setupNumberOfPostsPerPage() {
27 webInterface.core.preferences.postsPerPage = 5
31 fun `page returns correct path`() {
32 assertThat(page.path, equalTo("new.html"))
36 fun `page does not require login`() {
37 assertThat(page.requiresLogin(), equalTo(false))
41 fun `page returns correct title`() {
42 addTranslation("Page.New.Title", "new page title")
43 assertThat(page.getPageTitle(freenetRequest), equalTo("new page title"))
47 fun `posts are not duplicated when they come from both new posts and new replies notifications`() {
48 val extraPost = mock<Post>().withTime(2000)
49 val posts = asList(mock<Post>().withTime(1000), mock<Post>().withTime(3000))
50 val postReplies = asList(mock<PostReply>(), mock<PostReply>())
51 whenever(postReplies[0].post).thenReturn(posts[0].asOptional())
52 whenever(postReplies[1].post).thenReturn(extraPost.asOptional())
53 whenever(webInterface.getNewPosts(currentSone)).thenReturn(posts)
54 whenever(webInterface.getNewReplies(currentSone)).thenReturn(postReplies)
57 val renderedPosts = templateContext.get<List<Post>>("posts", List::class.java)
58 assertThat(renderedPosts, containsInAnyOrder(posts[1], extraPost, posts[0]))
62 private fun Post.withTime(time: Long) = apply { whenever(this.time).thenReturn(time) }
65 @Suppress("UNCHECKED_CAST")
66 fun `posts are paginated properly`() {
67 webInterface.core.preferences.postsPerPage = 2
68 val posts = listOf(mock<Post>().withTime(2000), mock<Post>().withTime(3000), mock<Post>().withTime(1000))
69 whenever(webInterface.getNewPosts(currentSone)).thenReturn(posts)
71 assertThat((templateContext["pagination"] as Pagination<Post>).items, contains(posts[1], posts[0]))
76 @Suppress("UNCHECKED_CAST")
77 fun `posts are paginated properly on second page`() {
78 webInterface.core.preferences.postsPerPage = 2
79 addHttpRequestParameter("page", "1")
80 val posts = listOf(mock<Post>().withTime(2000), mock<Post>().withTime(3000), mock<Post>().withTime(1000))
81 whenever(webInterface.getNewPosts(currentSone)).thenReturn(posts)
83 assertThat((templateContext["pagination"] as Pagination<Post>).items, contains(posts[2]))
88 fun `page can be created by dependency injection`() {
89 assertThat(baseInjector.getInstance<NewPage>(), notNullValue())