Add test for DI constructability of TrustAjaxPage
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / ajax / GetLinkedElementAjaxPageTest.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import com.fasterxml.jackson.databind.JsonNode
4 import net.pterodactylus.sone.core.ElementLoader
5 import net.pterodactylus.sone.core.LinkedElement
6 import net.pterodactylus.sone.template.LinkedElementRenderFilter
7 import net.pterodactylus.sone.test.getInstance
8 import net.pterodactylus.sone.test.isProvidedByMock
9 import net.pterodactylus.sone.test.mock
10 import net.pterodactylus.sone.test.whenever
11 import net.pterodactylus.sone.utils.jsonArray
12 import net.pterodactylus.sone.web.baseInjector
13 import net.pterodactylus.util.template.TemplateContext
14 import org.hamcrest.MatcherAssert.assertThat
15 import org.hamcrest.Matchers
16 import org.hamcrest.Matchers.notNullValue
17 import org.junit.Test
18 import org.mockito.ArgumentMatchers
19
20 /**
21  * Unit test for [GetLinkedElementAjaxPage].
22  */
23 class GetLinkedElementAjaxPageTest: JsonPageTest("getLinkedElement.ajax", requiresLogin = false, needsFormPassword = false) {
24
25         private val linkedElementRenderFilter = mock<LinkedElementRenderFilter>()
26         override var page: JsonPage = GetLinkedElementAjaxPage(webInterface, elementLoader, linkedElementRenderFilter)
27
28         @Test
29         fun `only loaded linked elements are returned`() {
30             addRequestParameter("elements", jsonArray("KSK@foo.png", "KSK@foo.jpg", "KSK@foo.html").toString())
31                 addLinkedElement("KSK@foo.png", true, false)
32                 addLinkedElement("KSK@foo.jpg", false, false)
33                 addLinkedElement("KSK@foo.html", false, true)
34                 whenever(linkedElementRenderFilter.format(ArgumentMatchers.any<TemplateContext>(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenAnswer { invocation ->
35                         when (invocation.getArgument<LinkedElement>(1).link) {
36                                 "KSK@foo.jpg" -> "jpeg-image"
37                                 "KSK@foo.html" -> "html-page"
38                                 else -> null
39                         }
40                 }
41                 assertThat(json.get("linkedElements")!!.elements().asSequence().map { it.toMap() }.toList(), Matchers.containsInAnyOrder(
42                                 mapOf<String, String?>("link" to "KSK@foo.jpg", "html" to "jpeg-image"),
43                                 mapOf("link" to "KSK@foo.html", "html" to "html-page")
44                 ))
45         }
46
47         @Test
48         fun `page can be created by dependency injection`() {
49             assertThat(baseInjector.createChildInjector(
50                             ElementLoader::class.isProvidedByMock(),
51                             LinkedElementRenderFilter::class.isProvidedByMock()
52             ).getInstance<GetLinkedElementAjaxPage>(), notNullValue())
53         }
54
55         private fun JsonNode.toMap() = fields().asSequence().map { it.key!! to if (it.value.isNull) null else it.value.asText()!! }.toMap()
56
57 }