1 package net.pterodactylus.sone.web.ajax
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
20 import org.mockito.ArgumentMatchers.any
21 import org.mockito.ArgumentMatchers.eq
22 import org.mockito.Mockito.verify
25 * Unit test for [EditImageAjaxPage].
27 class EditImageAjaxPageTest : JsonPageTest("editImage.ajax") {
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)
35 fun `request without image results in invalid-image-id`() {
36 assertThatJsonFailed("invalid-image-id")
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")
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)
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()
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)
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()
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)
91 addRequestParameter("image", "image-id")
92 assertThatJsonFailed("invalid-image-title")
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()
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)
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))
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())