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