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