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