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