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