a60c4a7480870abf24aeb259a9c05e8fb73f00a4
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / pages / UploadImagePageTest.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.data.TemporaryImage
8 import net.pterodactylus.sone.test.getInstance
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.sone.web.baseInjector
13 import net.pterodactylus.util.web.Method.POST
14 import org.hamcrest.MatcherAssert.assertThat
15 import org.hamcrest.Matchers.equalTo
16 import org.hamcrest.Matchers.notNullValue
17 import org.junit.Test
18 import org.mockito.Mockito.any
19 import org.mockito.Mockito.eq
20 import org.mockito.Mockito.never
21 import org.mockito.Mockito.verify
22
23 /**
24  * Unit test for [UploadImagePage].
25  */
26 class UploadImagePageTest: WebPageTest(::UploadImagePage) {
27
28         private val parentAlbum = mock<Album>().apply {
29                 whenever(id).thenReturn("parent-id")
30                 whenever(sone).thenReturn(currentSone)
31         }
32
33         @Test
34         fun `page returns correct path`() {
35             assertThat(page.path, equalTo("uploadImage.html"))
36         }
37
38         @Test
39         fun `page requires login`() {
40             assertThat(page.requiresLogin(), equalTo(true))
41         }
42
43         @Test
44         fun `page returns correct title`() {
45             addTranslation("Page.UploadImage.Title", "upload image page title")
46                 assertThat(page.getPageTitle(freenetRequest), equalTo("upload image page title"))
47         }
48
49         @Test
50         fun `get request does not redirect or upload anything`() {
51                 verifyNoRedirect {
52                         verify(core, never()).createTemporaryImage(any(), any())
53                         verify(core, never()).createImage(any(), any(), any())
54                 }
55         }
56
57         @Test
58         fun `post request without parent results in no permission error page`() {
59                 setMethod(POST)
60                 verifyRedirect("noPermission.html")
61         }
62
63         @Test
64         fun `post request with parent that is not the current sone results in no permission error page`() {
65                 setMethod(POST)
66                 addHttpRequestPart("parent", "parent-id")
67                 whenever(parentAlbum.sone).thenReturn(mock<Sone>())
68                 addAlbum("parent-id", parentAlbum)
69                 verifyRedirect("noPermission.html")
70         }
71
72         @Test
73         fun `post request with empty name redirects to error page`() {
74                 setMethod(POST)
75                 addAlbum("parent-id", parentAlbum)
76                 addHttpRequestPart("parent", "parent-id")
77                 addHttpRequestPart("title", " ")
78                 verifyRedirect("emptyImageTitle.html")
79         }
80
81         @Test
82         fun `uploading an invalid image results in no redirect and message set in template context`() {
83                 setMethod(POST)
84                 addAlbum("parent-id", parentAlbum)
85                 addHttpRequestPart("parent", "parent-id")
86                 addHttpRequestPart("title", "title")
87                 addUploadedFile("image", "image.png", "image/png", "upload-image-invalid-image.png")
88                 addTranslation("Page.UploadImage.Error.InvalidImage", "upload error - invalid image")
89                 verifyNoRedirect {
90                         verify(core, never()).createTemporaryImage(any(), any())
91                         assertThat(templateContext["messages"] as String, equalTo("upload error - invalid image"))
92                 }
93         }
94
95         @Test
96         fun `uploading a valid image uploads image and redirects to album browser`() {
97                 setMethod(POST)
98                 addAlbum("parent-id", parentAlbum)
99                 addHttpRequestPart("parent", "parent-id")
100                 addHttpRequestPart("title", "Title")
101                 addHttpRequestPart("description", "Description @ http://localhost:8888/KSK@foo")
102                 addHttpRequestHeader("Host", "localhost:8888")
103                 addUploadedFile("image", "upload-image-value-image.png", "image/png", "upload-image-value-image.png")
104                 val temporaryImage = TemporaryImage("temp-image")
105                 val imageModifier = mockBuilder<Modifier>()
106                 val image = mock<Image>().apply {
107                         whenever(modify()).thenReturn(imageModifier)
108                 }
109                 whenever(core.createTemporaryImage(eq("image/png"), any())).thenReturn(temporaryImage)
110                 whenever(core.createImage(currentSone, parentAlbum, temporaryImage)).thenReturn(image)
111                 verifyRedirect("imageBrowser.html?album=parent-id") {
112                         verify(image).modify()
113                         verify(imageModifier).setWidth(2)
114                         verify(imageModifier).setHeight(1)
115                         verify(imageModifier).setTitle("Title")
116                         verify(imageModifier).setDescription("Description @ KSK@foo")
117                         verify(imageModifier).update()
118                 }
119         }
120
121         @Test
122         fun `page can be created by dependency injection`() {
123             assertThat(baseInjector.getInstance<UploadImagePage>(), notNullValue())
124         }
125
126 }