1 package net.pterodactylus.sone.web.ajax
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
18 import org.mockito.ArgumentMatchers.any
19 import org.mockito.ArgumentMatchers.eq
20 import org.mockito.Mockito.verify
23 * Unit test for [EditImageAjaxPage].
25 class EditImageAjaxPageTest : JsonPageTest("editImage.ajax") {
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)
33 fun `request without image results in invalid-image-id`() {
34 assertThatJsonFailed("invalid-image-id")
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")
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())
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()
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 {
69 it.addImage(ImageImpl("swapped").modify().setSone(sone).update())
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()
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()
85 addRequestParameter("image", "image-id")
86 assertThatJsonFailed("invalid-image-title")
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()
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)
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))
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())