🔀 Merge “release/v81” into “master”
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / template / ParserFilterTest.kt
1 package net.pterodactylus.sone.template
2
3 import com.google.inject.Guice
4 import net.pterodactylus.sone.core.Core
5 import net.pterodactylus.sone.data.Sone
6 import net.pterodactylus.sone.test.*
7 import net.pterodactylus.sone.text.SoneTextParser
8 import net.pterodactylus.sone.text.SoneTextParserContext
9 import net.pterodactylus.util.template.TemplateContext
10 import org.hamcrest.MatcherAssert.assertThat
11 import org.hamcrest.Matchers.equalTo
12 import org.hamcrest.Matchers.emptyIterable
13 import org.hamcrest.Matchers.notNullValue
14 import org.hamcrest.Matchers.sameInstance
15 import org.junit.Test
16 import org.mockito.ArgumentCaptor.forClass
17 import org.mockito.Mockito.eq
18 import org.mockito.Mockito.verify
19
20 /**
21  * Unit test for [ParserFilter].
22  */
23 class ParserFilterTest {
24
25         companion object {
26                 private const val SONE_IDENTITY = "nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI"
27         }
28
29         private val core = mock<Core>()
30         private val sone = setupSone(SONE_IDENTITY)
31         private val soneTextParser = mock<SoneTextParser>()
32         private val templateContext = TemplateContext()
33         private val parameters = mutableMapOf<String, Any?>()
34         private val filter = ParserFilter(core, soneTextParser)
35
36         private fun setupSone(identity: String): Sone {
37                 val sone = mock<Sone>()
38                 whenever(sone.id).thenReturn(identity)
39                 whenever(core.getSone(identity)).thenReturn(sone)
40                 return sone
41         }
42
43         @Test
44         fun `parsing null returns an empty iterable`() {
45                 assertThat(filter.format(templateContext, null, mutableMapOf()) as Iterable<*>, emptyIterable())
46         }
47
48         @Test
49         fun `given sone is used to create parser context`() {
50                 setupSoneAndVerifyItIsUsedInContext(sone, sone)
51         }
52
53         @Test
54         fun `sone with given sone ID is used to create parser context`() {
55                 setupSoneAndVerifyItIsUsedInContext(SONE_IDENTITY, sone)
56         }
57
58         private fun setupSoneAndVerifyItIsUsedInContext(soneOrSoneId: Any, sone: Sone) {
59                 parameters.put("sone", soneOrSoneId)
60                 filter.format(templateContext, "text", parameters)
61                 val context = forClass(SoneTextParserContext::class.java)
62                 verify(soneTextParser).parse(eq<String>("text") ?: "", context.capture())
63                 assertThat(context.value.postingSone, equalTo(sone))
64         }
65
66         @Test
67         fun `parser filter can be created by guice`() {
68             val injector = Guice.createInjector(
69                             Core::class.isProvidedByMock(),
70                             SoneTextParser::class.isProvidedByMock()
71             )
72                 assertThat(injector.getInstance<ParserFilter>(), notNullValue())
73         }
74
75         @Test
76         fun `parser filter is created as singleton`() {
77                 val injector = Guice.createInjector(
78                                 Core::class.isProvidedByMock(),
79                                 SoneTextParser::class.isProvidedByMock()
80                 )
81                 val firstInstance = injector.getInstance<ParserFilter>()
82                 val secondInstance = injector.getInstance<ParserFilter>()
83                 assertThat(firstInstance, sameInstance(secondInstance))
84
85         }
86
87 }