1 package net.pterodactylus.sone.web.pages
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
18 import org.mockito.Mockito.any
19 import org.mockito.Mockito.eq
20 import org.mockito.Mockito.never
21 import org.mockito.Mockito.verify
24 * Unit test for [UploadImagePage].
26 class UploadImagePageTest: WebPageTest(::UploadImagePage) {
28 private val parentAlbum = mock<Album>().apply {
29 whenever(id).thenReturn("parent-id")
30 whenever(sone).thenReturn(currentSone)
34 fun `page returns correct path`() {
35 assertThat(page.path, equalTo("uploadImage.html"))
39 fun `page requires login`() {
40 assertThat(page.requiresLogin(), equalTo(true))
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"))
50 fun `get request does not redirect or upload anything`() {
52 verify(core, never()).createTemporaryImage(any(), any())
53 verify(core, never()).createImage(any(), any(), any())
58 fun `post request without parent results in no permission error page`() {
60 verifyRedirect("noPermission.html")
64 fun `post request with parent that is not the current sone results in no permission error page`() {
66 addHttpRequestPart("parent", "parent-id")
67 whenever(parentAlbum.sone).thenReturn(mock<Sone>())
68 addAlbum("parent-id", parentAlbum)
69 verifyRedirect("noPermission.html")
73 fun `post request with empty name redirects to error page`() {
75 addAlbum("parent-id", parentAlbum)
76 addHttpRequestPart("parent", "parent-id")
77 addHttpRequestPart("title", " ")
78 verifyRedirect("emptyImageTitle.html")
82 fun `uploading an invalid image results in no redirect and message set in template context`() {
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")
90 verify(core, never()).createTemporaryImage(any(), any())
91 assertThat(templateContext["messages"] as String, equalTo("upload error - invalid image"))
96 fun `uploading a valid image uploads image and redirects to album browser`() {
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)
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()
122 fun `page can be created by dependency injection`() {
123 assertThat(baseInjector.getInstance<UploadImagePage>(), notNullValue())