✨ Annotate KnownSonesPage with MenuName
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / pages / UnbookmarkPageTest.kt
1 package net.pterodactylus.sone.web.pages
2
3 import net.pterodactylus.sone.data.Post
4 import net.pterodactylus.sone.test.capture
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.web.baseInjector
9 import net.pterodactylus.util.web.Method.POST
10 import org.hamcrest.MatcherAssert.assertThat
11 import org.hamcrest.Matchers.contains
12 import org.hamcrest.Matchers.equalTo
13 import org.hamcrest.Matchers.notNullValue
14 import org.junit.Test
15 import org.mockito.Mockito.any
16 import org.mockito.Mockito.never
17 import org.mockito.Mockito.times
18 import org.mockito.Mockito.verify
19
20 /**
21  * Unit test for [UnbookmarkPage].
22  */
23 class UnbookmarkPageTest: WebPageTest(::UnbookmarkPage) {
24
25         @Test
26         fun `page returns correct path`() {
27                 assertThat(page.path, equalTo("unbookmark.html"))
28         }
29
30         @Test
31         fun `page does not require login`() {
32                 assertThat(page.requiresLogin(), equalTo(false))
33         }
34
35         @Test
36         fun `page returns correct title`() {
37                 addTranslation("Page.Unbookmark.Title", "unbookmark page title")
38                 assertThat(page.getPageTitle(soneRequest), equalTo("unbookmark page title"))
39         }
40
41         @Test
42         fun `get request does not redirect`() {
43                 verifyNoRedirect { }
44         }
45
46         @Test
47         fun `get request with all-not-loaded parameter unloads all not loaded posts and redirects to bookmarks`() {
48                 addHttpRequestParameter("post", "allNotLoaded")
49                 val loadedPost1 = mock<Post>().apply { whenever(isLoaded).thenReturn(true) }
50                 val loadedPost2 = mock<Post>().apply { whenever(isLoaded).thenReturn(true) }
51                 val notLoadedPost1 = mock<Post>()
52                 val notLoadedPost2 = mock<Post>()
53                 whenever(core.bookmarkedPosts).thenReturn(setOf(loadedPost1, loadedPost2, notLoadedPost1, notLoadedPost2))
54                 verifyRedirect("bookmarks.html") {
55                         val postCaptor = capture<Post>()
56                         verify(core, times(2)).unbookmarkPost(postCaptor.capture())
57                         assertThat(postCaptor.allValues, contains(notLoadedPost1, notLoadedPost2))
58                 }
59         }
60
61         @Test
62         fun `post request does not unbookmark not-present post but redirects to return page`() {
63                 setMethod(POST)
64                 addHttpRequestPart("post", "post-id")
65                 addHttpRequestPart("returnPage", "return.html")
66                 verifyRedirect("return.html") {
67                         verify(core, never()).unbookmarkPost(any())
68                 }
69         }
70
71         @Test
72         fun `post request unbookmarks present post and redirects to return page`() {
73                 setMethod(POST)
74                 addHttpRequestPart("post", "post-id")
75                 addHttpRequestPart("returnPage", "return.html")
76                 val post = mock<Post>().apply { whenever(isLoaded).thenReturn(true) }
77                 addPost("post-id", post)
78                 verifyRedirect("return.html") {
79                         verify(core).unbookmarkPost(post)
80                 }
81         }
82
83         @Test
84         fun `page can be created by dependency injection`() {
85             assertThat(baseInjector.getInstance<UnbookmarkPage>(), notNullValue())
86         }
87
88 }