✨ Annotate KnownSonesPage with MenuName
[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.getInstance
10 import net.pterodactylus.sone.test.mock
11 import net.pterodactylus.sone.test.mockBuilder
12 import net.pterodactylus.sone.test.whenever
13 import net.pterodactylus.sone.web.baseInjector
14 import net.pterodactylus.util.web.Method.POST
15 import org.hamcrest.MatcherAssert.assertThat
16 import org.hamcrest.Matchers.equalTo
17 import org.hamcrest.Matchers.notNullValue
18 import org.junit.Before
19 import org.junit.Test
20 import org.mockito.Mockito.never
21 import org.mockito.Mockito.verify
22
23 /**
24  * Unit test for [EditImagePage].
25  */
26 class EditImagePageTest: WebPageTest(::EditImagePage) {
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         @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(soneRequest), equalTo("edit image page title"))
57         }
58
59         @Test
60         fun `get request does not redirect`() {
61                 page.processTemplate(freenetRequest, templateContext)
62         }
63
64         @Test
65         fun `post request with invalid image redirects to invalid page`() {
66                 setMethod(POST)
67                 verifyRedirect("invalid.html")
68         }
69
70         @Test
71         fun `post request with valid image from non-local sone redirects to no permission page`() {
72                 setMethod(POST)
73                 whenever(sone.isLocal).thenReturn(false)
74                 addImage("image-id", image)
75                 addHttpRequestPart("image", "image-id")
76                 verifyRedirect("noPermission.html")
77         }
78
79         @Test
80         fun `post request with valid image and move left requested moves image left and redirects to return page`() {
81                 setMethod(POST)
82                 addImage("image-id", image)
83                 addHttpRequestPart("image", "image-id")
84                 addHttpRequestPart("returnPage", "return.html")
85                 addHttpRequestPart("moveLeft", "true")
86                 verifyRedirect("return.html") {
87                         verify(album).moveImageUp(image)
88                         verify(core).touchConfiguration()
89                 }
90         }
91
92         @Test
93         fun `post request with valid image and move right requested moves image right and redirects to return page`() {
94                 setMethod(POST)
95                 addImage("image-id", image)
96                 addHttpRequestPart("image", "image-id")
97                 addHttpRequestPart("returnPage", "return.html")
98                 addHttpRequestPart("moveRight", "true")
99                 verifyRedirect("return.html") {
100                         verify(album).moveImageDown(image)
101                         verify(core).touchConfiguration()
102                 }
103         }
104
105         @Test
106         fun `post request with valid image but only whitespace in the title redirects to empty image title page`() {
107                 setMethod(POST)
108                 addImage("image-id", image)
109                 addHttpRequestPart("image", "image-id")
110                 addHttpRequestPart("returnPage", "return.html")
111                 addHttpRequestPart("title", "   ")
112                 whenever(modifier.update()).doThrow<ImageTitleMustNotBeEmpty>()
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                 setMethod(POST)
121                 addImage("image-id", image)
122                 addHttpRequestPart("image", "image-id")
123                 addHttpRequestPart("returnPage", "return.html")
124                 addHttpRequestPart("title", "Title")
125                 addHttpRequestPart("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 return page`() {
136                 setMethod(POST)
137                 addImage("image-id", image)
138                 addHttpRequestPart("image", "image-id")
139                 addHttpRequestPart("returnPage", "return.html")
140                 addHttpRequestPart("title", "Title")
141                 addHttpRequestHeader("Host", "www.te.st")
142                 addHttpRequestPart("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         @Test
152         fun `page can be created by dependency injection`() {
153                 assertThat(baseInjector.getInstance<EditImagePage>(), notNullValue())
154         }
155
156 }