✨ Annotate KnownSonesPage with MenuName
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / WebInterfaceModuleTest.kt
1 package net.pterodactylus.sone.web
2
3 import com.google.inject.Guice.*
4 import freenet.l10n.*
5 import freenet.support.api.*
6 import net.pterodactylus.sone.core.*
7 import net.pterodactylus.sone.data.*
8 import net.pterodactylus.sone.database.*
9 import net.pterodactylus.sone.freenet.*
10 import net.pterodactylus.sone.freenet.wot.*
11 import net.pterodactylus.sone.main.*
12 import net.pterodactylus.sone.template.*
13 import net.pterodactylus.sone.test.*
14 import net.pterodactylus.sone.text.*
15 import net.pterodactylus.util.template.*
16 import org.hamcrest.MatcherAssert.*
17 import org.hamcrest.Matchers.*
18 import org.junit.*
19
20 class WebInterfaceModuleTest {
21
22         private val webInterfaceModule = WebInterfaceModule()
23         private val l10n = mock<BaseL10n>()
24         private val loaders = mock<Loaders>()
25         private val additionalModules = arrayOf(
26                         Core::class.isProvidedByMock(),
27                         SoneProvider::class.isProvidedByMock(),
28                         BaseL10n::class.isProvidedBy(l10n),
29                         SoneTextParser::class.isProvidedByMock(),
30                         ElementLoader::class.isProvidedByMock(),
31                         Loaders::class.isProvidedBy(loaders)
32         )
33         private val injector = createInjector(webInterfaceModule, *additionalModules)!!
34         private val templateContext by lazy { injector.getInstance<TemplateContextFactory>().createTemplateContext()!! }
35
36         @Test
37         fun `template context factory creates template with reflection accessor for objects`() {
38                 verifyAccessor<Any, ReflectionAccessor>()
39         }
40
41         @Test
42         fun `template context factory creates template with collection accessor for collections`() {
43                 verifyAccessor<Collection<*>, CollectionAccessor>()
44         }
45
46         @Test
47         fun `template context contains sone accessor for sones`() {
48                 verifyAccessor<Sone, SoneAccessor>()
49         }
50
51         @Test
52         fun `template context contains post accessor for posts`() {
53                 verifyAccessor<Post, PostAccessor>()
54         }
55
56         @Test
57         fun `template context contains reply accessor for replies`() {
58                 verifyAccessor<Reply<*>, ReplyAccessor>()
59         }
60
61         @Test
62         fun `template context contains album accessor for albums`() {
63                 verifyAccessor<Album, AlbumAccessor>()
64         }
65
66         @Test
67         fun `template context contains image accessor for images`() {
68                 verifyAccessor<Image, ImageAccessor>()
69         }
70
71         @Test
72         fun `template context contains identity accessor for identities`() {
73                 verifyAccessor<Identity, IdentityAccessor>()
74         }
75
76         @Test
77         fun `template context contains trust accessor for trusts`() {
78                 verifyAccessor<Trust, TrustAccessor>()
79         }
80
81         @Test
82         fun `template context contains http request accessor for http requests`() {
83                 verifyAccessor<HTTPRequest, HttpRequestAccessor>()
84         }
85
86         @Test
87         fun `template context contains profile accessor for profiles`() {
88                 verifyAccessor<Profile, ProfileAccessor>()
89         }
90
91         private inline fun <reified O, reified A : Accessor> verifyAccessor() {
92                 assertThat(templateContext.getAccessor(O::class.java), instanceOf(A::class.java))
93         }
94
95         @Test
96         fun `template context contains date filter`() {
97                 verifyFilter<DateFilter>("date")
98         }
99
100         @Test
101         fun `template context contains html filter`() {
102                 verifyFilter<HtmlFilter>("html")
103         }
104
105         @Test
106         fun `template context contains replace filter`() {
107                 verifyFilter<ReplaceFilter>("replace")
108         }
109
110         @Test
111         fun `template context contains store filter`() {
112                 verifyFilter<StoreFilter>("store")
113         }
114
115         @Test
116         fun `template context contains l10n filter`() {
117                 verifyFilter<L10nFilter>("l10n")
118         }
119
120         @Test
121         fun `template context contains substring filter`() {
122                 verifyFilter<SubstringFilter>("substring")
123         }
124
125         @Test
126         fun `template context contains xml filter`() {
127                 verifyFilter<XmlFilter>("xml")
128         }
129
130         @Test
131         fun `template context contains change filter`() {
132                 verifyFilter<RequestChangeFilter>("change")
133         }
134
135         @Test
136         fun `template context contains match filter`() {
137                 verifyFilter<MatchFilter>("match")
138         }
139
140         @Test
141         fun `template context contains css filter`() {
142                 verifyFilter<CssClassNameFilter>("css")
143         }
144
145         @Test
146         fun `template context contains js filter`() {
147                 verifyFilter<JavascriptFilter>("js")
148         }
149
150         @Test
151         fun `template context contains parser filter`() {
152                 verifyFilter<ParserFilter>("parse")
153         }
154
155         @Test
156         fun `template context contains shorten filter`() {
157                 verifyFilter<ShortenFilter>("shorten")
158         }
159
160         @Test
161         fun `template context contains render filter`() {
162                 verifyFilter<RenderFilter>("render")
163         }
164
165         @Test
166         fun `template context contains linked elements filter`() {
167                 verifyFilter<LinkedElementsFilter>("linked-elements")
168         }
169
170         @Test
171         fun `template context contains linked elements render filter`() {
172                 verifyFilter<LinkedElementRenderFilter>("render-linked-element")
173         }
174
175         @Test
176         fun `template context contains reparse filter`() {
177                 verifyFilter<ReparseFilter>("reparse")
178         }
179
180         @Test
181         fun `template context contains unknown date filter`() {
182                 verifyFilter<UnknownDateFilter>("unknown")
183         }
184
185         @Test
186         fun `unknown date filter uses correct l10n key`() {
187                 whenever(l10n.getString("View.Sone.Text.UnknownDate")).thenReturn("unknown")
188                 assertThat(getFilter("unknown")!!.format(null, 0L, emptyMap()), equalTo<Any>("unknown"))
189         }
190
191         @Test
192         fun `template context contains format filter`() {
193                 verifyFilter<FormatFilter>("format")
194         }
195
196         @Test
197         fun `template context contains collection sort filter`() {
198                 verifyFilter<CollectionSortFilter>("sort")
199         }
200
201         @Test
202         fun `template context contains image link filter`() {
203                 verifyFilter<ImageLinkFilter>("image-link")
204         }
205
206         @Test
207         fun `template context contains reply group filter`() {
208                 verifyFilter<ReplyGroupFilter>("replyGroup")
209         }
210
211         @Test
212         fun `template context contains contains filter`() {
213                 verifyFilter<ContainsFilter>("in")
214         }
215
216         @Test
217         fun `template context unique elements filter`() {
218                 verifyFilter<UniqueElementFilter>("unique")
219         }
220
221         @Test
222         fun `template context mod filter`() {
223                 verifyFilter<ModFilter>("mod")
224         }
225
226         @Test
227         fun `template context pagination filter`() {
228                 verifyFilter<PaginationFilter>("paginate")
229         }
230
231         private inline fun <reified F : Filter> verifyFilter(name: String) {
232                 assertThat(getFilter(name), instanceOf(F::class.java))
233         }
234
235         private fun getFilter(name: String): Filter? = templateContext.getFilter(name)
236
237         @Test
238         fun `template context factory is created as singleton`() {
239             val factory1 = injector.getInstance<TemplateContextFactory>()
240             val factory2 = injector.getInstance<TemplateContextFactory>()
241                 assertThat(factory1, sameInstance(factory2))
242         }
243
244         @Test
245         fun `template from classpath is returned`() {
246                 val template = Template()
247                 templateContext["testTemplate"] = template
248                 assertThat(templateContext.getTemplate("testTemplate"), sameInstance(template))
249         }
250
251         @Test
252         fun `template from loaders’ provider is returned`() {
253                 val template = Template()
254                 whenever(loaders.templateProvider).thenReturn(TemplateProvider { _, templateName ->
255                         template.takeIf { templateName == "testTemplate" }
256                 })
257                 assertThat(templateContext.getTemplate("testTemplate"), sameInstance(template))
258         }
259
260 }