Set URI and request method separately in tests
[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.POST
13 import org.hamcrest.MatcherAssert.assertThat
14 import org.hamcrest.Matchers.equalTo
15 import org.junit.Before
16 import org.junit.Test
17 import org.mockito.Mockito.never
18 import org.mockito.Mockito.verify
19
20 /**
21  * Unit test for [EditImagePage].
22  */
23 class EditImagePageTest : WebPageTest() {
24
25         private val page = EditImagePage(template, webInterface)
26
27         private val image = mock<Image>()
28         private val modifier = mockBuilder<Modifier>()
29         private val sone = mock<Sone>()
30         private val album = mock<Album>()
31
32         override fun getPage() = page
33
34         @Before
35         fun setupImage() {
36                 whenever(sone.isLocal).thenReturn(true)
37                 whenever(album.id).thenReturn("album-id")
38                 whenever(modifier.update()).thenReturn(image)
39                 whenever(image.sone).thenReturn(sone)
40                 whenever(image.album).thenReturn(album)
41                 whenever(image.modify()).thenReturn(modifier)
42         }
43
44         @Test
45         fun `page returns correct path`() {
46                 assertThat(page.path, equalTo("editImage.html"))
47         }
48
49         @Test
50         fun `page requires login`() {
51             assertThat(page.requiresLogin(), equalTo(true))
52         }
53
54         @Test
55         fun `page returns correct title`() {
56                 whenever(l10n.getString("Page.EditImage.Title")).thenReturn("edit image page title")
57             assertThat(page.getPageTitle(freenetRequest), equalTo("edit image page title"))
58         }
59
60         @Test
61         fun `get request does not redirect`() {
62                 page.processTemplate(freenetRequest, templateContext)
63         }
64
65         @Test
66         fun `post request with invalid image redirects to invalid page`() {
67                 setMethod(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                 setMethod(POST)
74                 whenever(sone.isLocal).thenReturn(false)
75                 addImage("image-id", image)
76                 addHttpRequestPart("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                 setMethod(POST)
83                 addImage("image-id", image)
84                 addHttpRequestPart("image", "image-id")
85                 addHttpRequestPart("returnPage", "return.html")
86                 addHttpRequestPart("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                 setMethod(POST)
96                 addImage("image-id", image)
97                 addHttpRequestPart("image", "image-id")
98                 addHttpRequestPart("returnPage", "return.html")
99                 addHttpRequestPart("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                 setMethod(POST)
109                 addImage("image-id", image)
110                 addHttpRequestPart("image", "image-id")
111                 addHttpRequestPart("returnPage", "return.html")
112                 addHttpRequestPart("title", "   ")
113                 whenever(modifier.update()).doThrow<ImageTitleMustNotBeEmpty>()
114                 verifyRedirect("emptyImageTitle.html") {
115                         verify(core, never()).touchConfiguration()
116                 }
117         }
118
119         @Test
120         fun `post request with valid image title and description modifies image and redirects to reutrn page`() {
121                 setMethod(POST)
122                 addImage("image-id", image)
123                 addHttpRequestPart("image", "image-id")
124                 addHttpRequestPart("returnPage", "return.html")
125                 addHttpRequestPart("title", "Title")
126                 addHttpRequestPart("description", "Description")
127                 verifyRedirect("return.html") {
128                         verify(modifier).setTitle("Title")
129                         verify(modifier).setDescription("Description")
130                         verify(modifier).update()
131                         verify(core).touchConfiguration()
132                 }
133         }
134
135         @Test
136         fun `post request with image title and description modifies image with filtered description and redirects to return page`() {
137                 setMethod(POST)
138                 addImage("image-id", image)
139                 addHttpRequestPart("image", "image-id")
140                 addHttpRequestPart("returnPage", "return.html")
141                 addHttpRequestPart("title", "Title")
142                 addHttpRequestHeader("Host", "www.te.st")
143                 addHttpRequestPart("description", "Get http://www.te.st/KSK@GPL.txt")
144                 verifyRedirect("return.html") {
145                         verify(modifier).setTitle("Title")
146                         verify(modifier).setDescription("Get KSK@GPL.txt")
147                         verify(modifier).update()
148                         verify(core).touchConfiguration()
149                 }
150         }
151
152 }