Add some tests for the edit image page
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / pages / EditImagePageTest.kt
1 package net.pterodactylus.sone.web.pages
2
3 import net.pterodactylus.sone.data.Album
4 import net.pterodactylus.sone.data.Image
5 import net.pterodactylus.sone.data.Image.Modifier
6 import net.pterodactylus.sone.data.Sone
7 import net.pterodactylus.sone.test.mock
8 import net.pterodactylus.sone.test.mockBuilder
9 import net.pterodactylus.sone.test.whenever
10 import net.pterodactylus.util.web.Method.GET
11 import net.pterodactylus.util.web.Method.POST
12 import org.hamcrest.MatcherAssert.assertThat
13 import org.hamcrest.Matchers.equalTo
14 import org.junit.Before
15 import org.junit.Test
16 import org.mockito.Mockito.never
17 import org.mockito.Mockito.verify
18
19 /**
20  * Unit test for [EditImagePage].
21  */
22 class EditImagePageTest : WebPageTest() {
23
24         private val page = EditImagePage(template, webInterface)
25
26         private val image = mock<Image>()
27         private val modifier = mockBuilder<Modifier>()
28         private val sone = mock<Sone>()
29         private val album = mock<Album>()
30
31         override fun getPage() = page
32
33         @Before
34         fun setupImage() {
35                 whenever(sone.isLocal).thenReturn(true)
36                 whenever(album.id).thenReturn("album-id")
37                 whenever(modifier.update()).thenReturn(image)
38                 whenever(image.sone).thenReturn(sone)
39                 whenever(image.album).thenReturn(album)
40                 whenever(image.modify()).thenReturn(modifier)
41         }
42
43         @Test
44         fun `page returns correct path`() {
45                 assertThat(page.path, equalTo("editImage.html"))
46         }
47
48         @Test
49         fun `page requires login`() {
50             assertThat(page.requiresLogin(), equalTo(true))
51         }
52
53         @Test
54         fun `page returns correct title`() {
55                 whenever(l10n.getString("Page.EditImage.Title")).thenReturn("edit image page title")
56             assertThat(page.getPageTitle(freenetRequest), equalTo("edit image page title"))
57         }
58
59         @Test
60         fun `get request does not redirect`() {
61                 request("", GET)
62                 page.handleRequest(freenetRequest, templateContext)
63         }
64
65         @Test
66         fun `post request with invalid image redirects to invalid page`() {
67                 request("", POST)
68                 verifyRedirect("invalid.html")
69         }
70
71         @Test
72         fun `post request with valid image from non-local sone redirects to no permission page`() {
73                 request("", POST)
74                 whenever(sone.isLocal).thenReturn(false)
75                 addImage("image-id", image)
76                 addHttpRequestParameter("image", "image-id")
77                 verifyRedirect("noPermission.html")
78         }
79
80         @Test
81         fun `post request with valid image and move left requested moves image left and redirects to return page`() {
82                 request("", POST)
83                 addImage("image-id", image)
84                 addHttpRequestParameter("image", "image-id")
85                 addHttpRequestParameter("returnPage", "return.html")
86                 addHttpRequestParameter("moveLeft", "true")
87                 verifyRedirect("return.html") {
88                         verify(album).moveImageUp(image)
89                         verify(core).touchConfiguration()
90                 }
91         }
92
93         @Test
94         fun `post request with valid image and move right requested moves image right and redirects to return page`() {
95                 request("", POST)
96                 addImage("image-id", image)
97                 addHttpRequestParameter("image", "image-id")
98                 addHttpRequestParameter("returnPage", "return.html")
99                 addHttpRequestParameter("moveRight", "true")
100                 verifyRedirect("return.html") {
101                         verify(album).moveImageDown(image)
102                         verify(core).touchConfiguration()
103                 }
104         }
105
106         @Test
107         fun `post request with valid image but only whitespace in the title redirects to empty image title page`() {
108                 request("", POST)
109                 addImage("image-id", image)
110                 addHttpRequestParameter("image", "image-id")
111                 addHttpRequestParameter("returnPage", "return.html")
112                 addHttpRequestParameter("title", "   ")
113                 verifyRedirect("emptyImageTitle.html") {
114                         verify(core, never()).touchConfiguration()
115                 }
116         }
117
118         @Test
119         fun `post request with valid image title and description modifies image and redirects to reutrn page`() {
120                 request("", POST)
121                 addImage("image-id", image)
122                 addHttpRequestParameter("image", "image-id")
123                 addHttpRequestParameter("returnPage", "return.html")
124                 addHttpRequestParameter("title", "Title")
125                 addHttpRequestParameter("description", "Description")
126                 verifyRedirect("return.html") {
127                         verify(modifier).setTitle("Title")
128                         verify(modifier).setDescription("Description")
129                         verify(modifier).update()
130                         verify(core).touchConfiguration()
131                 }
132         }
133
134         @Test
135         fun `post request with image title and description modifies image with filtered description and redirects to reutrn page`() {
136                 request("", POST)
137                 addImage("image-id", image)
138                 addHttpRequestParameter("image", "image-id")
139                 addHttpRequestParameter("returnPage", "return.html")
140                 addHttpRequestParameter("title", "Title")
141                 addHttpRequestHeader("Host", "www.te.st")
142                 addHttpRequestParameter("description", "Get http://www.te.st/KSK@GPL.txt")
143                 verifyRedirect("return.html") {
144                         verify(modifier).setTitle("Title")
145                         verify(modifier).setDescription("Get KSK@GPL.txt")
146                         verify(modifier).update()
147                         verify(core).touchConfiguration()
148                 }
149         }
150
151 }