1 package net.pterodactylus.sone.web.pages
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.*
15 import org.mockito.Mockito.*
16 import org.mockito.Mockito.eq
19 * Unit test for [UploadImagePage].
21 class UploadImagePageTest : WebPageTest(::UploadImagePage) {
23 private val parentAlbum = mock<Album>().apply {
24 whenever(id).thenReturn("parent-id")
25 whenever(sone).thenReturn(currentSone)
29 fun `page returns correct path`() {
30 assertThat(page.path, equalTo("uploadImage.html"))
34 fun `page requires login`() {
35 assertThat(page.requiresLogin(), equalTo(true))
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"))
45 fun `get request does not redirect or upload anything`() {
47 verify(core, never()).createTemporaryImage(any(), any())
48 verify(core, never()).createImage(any(), any(), any())
53 fun `post request without parent results in no permission error page`() {
55 verifyRedirect("noPermission.html")
59 fun `post request with parent that is not the current sone results in no permission error page`() {
61 addHttpRequestPart("parent", "parent-id")
62 whenever(parentAlbum.sone).thenReturn(mock())
63 addAlbum("parent-id", parentAlbum)
64 verifyRedirect("noPermission.html")
68 fun `post request with empty name redirects to error page`() {
70 addAlbum("parent-id", parentAlbum)
71 addHttpRequestPart("parent", "parent-id")
72 addHttpRequestPart("title", " ")
73 verifyRedirect("emptyImageTitle.html")
77 fun `uploading an invalid image results in no redirect and message set in template context`() {
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")
85 verify(core, never()).createTemporaryImage(any(), any())
86 assertThat(templateContext["messages"] as String, equalTo("upload error - invalid image"))
91 fun `uploading a valid image uploads image and redirects to album browser`() {
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)
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()
117 fun `page can be created by dependency injection`() {
118 assertThat(baseInjector.getInstance<UploadImagePage>(), notNullValue())
122 fun `page is annotated with correct template path`() {
123 assertThat(page.templatePath, equalTo("/templates/invalid.html"))