1 package net.pterodactylus.sone.web
3 import com.google.inject.Guice.*
4 import freenet.client.*
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.sone.web.notification.*
16 import net.pterodactylus.sone.web.page.*
17 import net.pterodactylus.util.notify.*
18 import net.pterodactylus.util.template.*
19 import net.pterodactylus.util.web.*
20 import org.hamcrest.MatcherAssert.*
21 import org.hamcrest.Matchers.*
25 class WebInterfaceModuleTest {
27 private val webInterfaceModule = WebInterfaceModule()
28 private val loaders = mock<Loaders>()
29 private val translation = object : Translation {
30 override val currentLocale = Locale.ENGLISH
31 override fun translate(key: String) = if (key == "View.Sone.Text.UnknownDate") "unknown" else key
33 private val additionalModules = arrayOf(
34 Core::class.isProvidedByMock(),
35 SoneProvider::class.isProvidedByMock(),
36 Translation::class.isProvidedBy(translation),
37 SoneTextParser::class.isProvidedByMock(),
38 ElementLoader::class.isProvidedByMock(),
39 Loaders::class.isProvidedBy(loaders),
40 HighLevelSimpleClient::class.isProvidedByMock()
42 private val injector = createInjector(webInterfaceModule, *additionalModules)!!
43 private val templateContext by lazy { injector.getInstance<TemplateContextFactory>().createTemplateContext()!! }
46 fun `template context factory creates template with reflection accessor for objects`() {
47 verifyAccessor<Any, ReflectionAccessor>()
51 fun `template context factory creates template with collection accessor for collections`() {
52 verifyAccessor<Collection<*>, CollectionAccessor>()
56 fun `template context contains sone accessor for sones`() {
57 verifyAccessor<Sone, SoneAccessor>()
61 fun `template context contains post accessor for posts`() {
62 verifyAccessor<Post, PostAccessor>()
66 fun `template context contains reply accessor for replies`() {
67 verifyAccessor<Reply<*>, ReplyAccessor>()
71 fun `template context contains album accessor for albums`() {
72 verifyAccessor<Album, AlbumAccessor>()
76 fun `template context contains image accessor for images`() {
77 verifyAccessor<Image, ImageAccessor>()
81 fun `template context contains identity accessor for identities`() {
82 verifyAccessor<Identity, IdentityAccessor>()
86 fun `template context contains trust accessor for trusts`() {
87 verifyAccessor<Trust, TrustAccessor>()
91 fun `template context contains http request accessor for http requests`() {
92 verifyAccessor<HTTPRequest, HttpRequestAccessor>()
96 fun `template context contains profile accessor for profiles`() {
97 verifyAccessor<Profile, ProfileAccessor>()
100 private inline fun <reified O, reified A : Accessor> verifyAccessor() {
101 assertThat(templateContext.getAccessor(O::class.java), instanceOf(A::class.java))
105 fun `template context contains date filter`() {
106 verifyFilter<DateFilter>("date")
110 fun `template context contains html filter`() {
111 verifyFilter<HtmlFilter>("html")
115 fun `template context contains replace filter`() {
116 verifyFilter<ReplaceFilter>("replace")
120 fun `template context contains store filter`() {
121 verifyFilter<StoreFilter>("store")
125 fun `template context contains l10n filter`() {
126 verifyFilter<L10nFilter>("l10n")
130 fun `template context contains substring filter`() {
131 verifyFilter<SubstringFilter>("substring")
135 fun `template context contains xml filter`() {
136 verifyFilter<XmlFilter>("xml")
140 fun `template context contains change filter`() {
141 verifyFilter<RequestChangeFilter>("change")
145 fun `template context contains match filter`() {
146 verifyFilter<MatchFilter>("match")
150 fun `template context contains css filter`() {
151 verifyFilter<CssClassNameFilter>("css")
155 fun `template context contains js filter`() {
156 verifyFilter<JavascriptFilter>("js")
160 fun `template context contains parser filter`() {
161 verifyFilter<ParserFilter>("parse")
165 fun `template context contains shorten filter`() {
166 verifyFilter<ShortenFilter>("shorten")
170 fun `template context contains render filter`() {
171 verifyFilter<RenderFilter>("render")
175 fun `template context contains linked elements filter`() {
176 verifyFilter<LinkedElementsFilter>("linked-elements")
180 fun `template context contains linked elements render filter`() {
181 verifyFilter<LinkedElementRenderFilter>("render-linked-element")
185 fun `template context contains reparse filter`() {
186 verifyFilter<ReparseFilter>("reparse")
190 fun `template context contains unknown date filter`() {
191 verifyFilter<UnknownDateFilter>("unknown")
195 fun `unknown date filter uses correct l10n key`() {
196 assertThat(getFilter("unknown")!!.format(null, 0L, emptyMap()), equalTo<Any>("unknown"))
200 fun `template context contains format filter`() {
201 verifyFilter<FormatFilter>("format")
205 fun `template context contains duration format filter`() {
206 verifyFilter<DurationFormatFilter>("duration")
210 fun `template context contains collection sort filter`() {
211 verifyFilter<CollectionSortFilter>("sort")
215 fun `template context contains image link filter`() {
216 verifyFilter<ImageLinkFilter>("image-link")
220 fun `template context contains reply group filter`() {
221 verifyFilter<ReplyGroupFilter>("replyGroup")
225 fun `template context contains contains filter`() {
226 verifyFilter<ContainsFilter>("in")
230 fun `template context unique elements filter`() {
231 verifyFilter<UniqueElementFilter>("unique")
235 fun `template context mod filter`() {
236 verifyFilter<ModFilter>("mod")
240 fun `template context pagination filter`() {
241 verifyFilter<PaginationFilter>("paginate")
245 fun `template context histogram renderer`() {
246 verifyFilter<HistogramRenderer>("render-histogram")
249 private inline fun <reified F : Filter> verifyFilter(name: String) {
250 assertThat(getFilter(name), instanceOf(F::class.java))
253 private fun getFilter(name: String): Filter? = templateContext.getFilter(name)
256 fun `template context factory is created as singleton`() {
257 injector.verifySingletonInstance<TemplateContextFactory>()
261 fun `template from classpath is returned`() {
262 val template = Template()
263 templateContext["testTemplate"] = template
264 assertThat(templateContext.getTemplate("testTemplate"), sameInstance(template))
268 fun `template from loaders’ provider is returned`() {
269 val template = Template()
270 whenever(loaders.templateProvider).thenReturn(TemplateProvider { _, templateName ->
271 template.takeIf { templateName == "testTemplate" }
273 assertThat(templateContext.getTemplate("testTemplate"), sameInstance(template))
277 fun `page toadlet factory is created with correct prefix`() {
278 val page = mock<Page<FreenetRequest>>()
279 assertThat(injector.getInstance<PageToadletFactory>().createPageToadlet(page).path(), startsWith("/Sone/"))
283 fun `notification manager is created as singleton`() {
284 injector.verifySingletonInstance<NotificationManager>()