Merge branch 'release-0.9.7'
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / ajax / EditImageAjaxPageTest.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import net.pterodactylus.sone.data.Album
4 import net.pterodactylus.sone.data.Image
5 import net.pterodactylus.sone.data.Sone
6 import net.pterodactylus.sone.data.impl.ImageImpl
7 import net.pterodactylus.sone.template.ParserFilter
8 import net.pterodactylus.sone.template.RenderFilter
9 import net.pterodactylus.sone.template.ShortenFilter
10 import net.pterodactylus.sone.test.argumentCaptor
11 import net.pterodactylus.sone.test.mock
12 import net.pterodactylus.sone.test.whenever
13 import org.hamcrest.MatcherAssert.assertThat
14 import org.hamcrest.Matchers.equalTo
15 import org.junit.Test
16 import org.mockito.ArgumentMatchers.any
17 import org.mockito.ArgumentMatchers.eq
18 import org.mockito.Mockito.verify
19
20 /**
21  * Unit test for [EditImageAjaxPage].
22  */
23 class EditImageAjaxPageTest : JsonPageTest("editImage.ajax") {
24
25         private val parserFilter = mock<ParserFilter>()
26         private val shortenFilter = mock<ShortenFilter>()
27         private val renderFilter = mock<RenderFilter>()
28         override val page: JsonPage get() = EditImageAjaxPage(webInterface, parserFilter, shortenFilter, renderFilter)
29
30         @Test
31         fun `request without image results in invalid-image-id`() {
32                 assertThatJsonFailed("invalid-image-id")
33         }
34
35         @Test
36         fun `request with non-local image results in not-authorized`() {
37                 val image = mock<Image>()
38                 val sone = mock<Sone>()
39                 whenever(image.sone).thenReturn(sone)
40                 addImage(image, "image-id")
41                 addRequestParameter("image", "image-id")
42                 assertThatJsonFailed("not-authorized")
43         }
44
45         @Test
46         fun `moving an image to the left returns the correct values`() {
47                 val image = mock<Image>().apply { whenever(id).thenReturn("image-id") }
48                 val sone = mock<Sone>().apply { whenever(isLocal).thenReturn(true) }
49                 whenever(image.sone).thenReturn(sone)
50                 val swapped = mock<Image>().apply { whenever(id).thenReturn("swapped") }
51                 val album = mock<Album>()
52                 whenever(album.moveImageUp(image)).thenReturn(swapped)
53                 whenever(image.album).thenReturn(album)
54                 addImage(image)
55                 addRequestParameter("image", "image-id")
56                 addRequestParameter("moveLeft", "true")
57                 assertThatJsonIsSuccessful()
58                 assertThat(json["sourceImageId"]?.asText(), equalTo("image-id"))
59                 assertThat(json["destinationImageId"]?.asText(), equalTo("swapped"))
60                 verify(core).touchConfiguration()
61         }
62
63         @Test
64         fun `moving an image to the right returns the correct values`() {
65                 val image = mock<Image>().apply { whenever(id).thenReturn("image-id") }
66                 val sone = mock<Sone>().apply { whenever(isLocal).thenReturn(true) }
67                 whenever(image.sone).thenReturn(sone)
68                 val swapped = mock<Image>().apply { whenever(id).thenReturn("swapped") }
69                 val album = mock<Album>()
70                 whenever(album.moveImageDown(image)).thenReturn(swapped)
71                 whenever(image.album).thenReturn(album)
72                 addImage(image)
73                 addRequestParameter("image", "image-id")
74                 addRequestParameter("moveRight", "true")
75                 assertThatJsonIsSuccessful()
76                 assertThat(json["sourceImageId"]?.asText(), equalTo("image-id"))
77                 assertThat(json["destinationImageId"]?.asText(), equalTo("swapped"))
78                 verify(core).touchConfiguration()
79         }
80
81         @Test
82         fun `request with empty title results in invalid-image-title`() {
83                 val image = mock<Image>().apply { whenever(id).thenReturn("image-id") }
84                 val sone = mock<Sone>().apply { whenever(isLocal).thenReturn(true) }
85                 whenever(image.sone).thenReturn(sone)
86                 addImage(image)
87                 addRequestParameter("image", "image-id")
88                 assertThatJsonFailed("invalid-image-title")
89         }
90
91         @Test
92         fun `request with title and description returns correct values`() {
93                 val sone = mock<Sone>().apply { whenever(isLocal).thenReturn(true) }
94                 val image = ImageImpl("image-id").modify().setSone(sone).update()
95                 val parsed = Object()
96                 val shortened = Object()
97                 val rendered = "rendered description"
98                 whenever(parserFilter.format(any(), eq("some KSK@foo link"), any())).thenReturn(parsed)
99                 whenever(shortenFilter.format(any(), eq(parsed), any())).thenReturn(shortened)
100                 whenever(renderFilter.format(any(), eq(shortened), any())).thenReturn(rendered)
101                 addImage(image)
102                 addRequestParameter("image", "image-id")
103                 addRequestParameter("title", "some title")
104                 addRequestParameter("description", "some http://127.0.0.1:8888/KSK@foo link")
105                 addRequestHeader("Host", "127.0.0.1:8888")
106                 assertThatJsonIsSuccessful()
107                 assertThat(json["title"]?.asText(), equalTo("some title"))
108                 assertThat(json["description"]?.asText(), equalTo("some KSK@foo link"))
109                 assertThat(json["parsedDescription"]?.asText(), equalTo("rendered description"))
110                 verify(core).touchConfiguration()
111                 val parameterCaptor = argumentCaptor<MutableMap<String, Any?>>()
112                 verify(parserFilter).format(any(), any(), parameterCaptor.capture())
113                 assertThat(parameterCaptor.value["sone"], equalTo<Any>(sone))
114         }
115
116 }