🔀 Merge branch “release-80”
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / PageToadletRegistryTest.kt
1 package net.pterodactylus.sone.web
2
3 import com.google.inject.*
4 import freenet.clients.http.*
5 import net.pterodactylus.sone.main.*
6 import net.pterodactylus.sone.test.*
7 import net.pterodactylus.sone.web.page.*
8 import net.pterodactylus.util.web.*
9 import org.junit.*
10 import org.junit.rules.*
11 import org.mockito.Mockito.*
12
13 class PageToadletRegistryTest {
14
15         private val pageMaker = mock<PageMaker>()
16         private val toadletContainer = mock<ToadletContainer>()
17         private val pageToadletFactory = mock<PageToadletFactory>()
18         private val sonePlugin = mock<SonePlugin>()
19
20         private val injector = Guice.createInjector(
21                         PageMaker::class.isProvidedBy(pageMaker),
22                         ToadletContainer::class.isProvidedBy(toadletContainer),
23                         PageToadletFactory::class.isProvidedBy(pageToadletFactory),
24                         SonePlugin::class.isProvidedBy(sonePlugin)
25         )
26
27         @JvmField
28         @Rule
29         val expectedException: ExpectedException = ExpectedException.none()
30         private val pageToadletRegistry = injector.getInstance<PageToadletRegistry>()
31
32         @Test
33         fun `registry adds navigation category to page maker`() {
34                 pageToadletRegistry.registerToadlets()
35                 verify(pageMaker).addNavigationCategory("/Sone/index.html", "Navigation.Menu.Sone.Name", "Navigation.Menu.Sone.Tooltip", sonePlugin)
36         }
37
38         private val page = TestPage()
39
40         @Test
41         fun `adding a page without menuname will add it correctly`() {
42                 val toadletWithoutMenuname = createPageToadlet()
43                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadletWithoutMenuname)
44                 pageToadletRegistry.addPage(page)
45                 pageToadletRegistry.registerToadlets()
46                 verify(toadletContainer).register(toadletWithoutMenuname, null, "/Sone/", true, false)
47         }
48
49         @Test
50         fun `adding a page with menuname will add it correctly`() {
51                 val toadletWithMenuname = createPageToadlet("Test")
52                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadletWithMenuname)
53                 pageToadletRegistry.addPage(page)
54                 pageToadletRegistry.registerToadlets()
55                 verify(toadletContainer).register(toadletWithMenuname, "Navigation.Menu.Sone.Name", "/Sone/", true, "Navigation.Menu.Sone.Item.Test.Name", "Navigation.Menu.Sone.Item.Test.Tooltip", false, toadletWithMenuname)
56         }
57
58         @Test
59         fun `adding a page after registering will throw an exception`() {
60                 val toadletWithMenuname = createPageToadlet("Test")
61                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadletWithMenuname)
62                 pageToadletRegistry.registerToadlets()
63                 expectedException.expect(IllegalStateException::class.java)
64                 pageToadletRegistry.addPage(page)
65         }
66
67         @Test
68         fun `unregistering toadlets will remove category link`() {
69                 pageToadletRegistry.unregisterToadlets()
70                 verify(pageMaker).removeNavigationCategory("Navigation.Menu.Sone.Name")
71         }
72
73         @Test
74         fun `unregistering toadlets will unregister them from the container`() {
75                 val toadletWithMenuname = createPageToadlet("Test")
76                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadletWithMenuname)
77                 pageToadletRegistry.addPage(page)
78                 pageToadletRegistry.registerToadlets()
79                 pageToadletRegistry.unregisterToadlets()
80                 verify(toadletContainer).unregister(toadletWithMenuname)
81         }
82
83         private fun createPageToadlet(menuName: String? = null) =
84                         mock<PageToadlet>().apply {
85                                 whenever(this.path()).thenReturn("/Sone/")
86                                 whenever(this.menuName).thenReturn(menuName)
87                         }
88
89         private class TestPage : Page<FreenetRequest> {
90                 override fun getPath() = ""
91                 override fun isPrefixPage() = false
92                 override fun handleRequest(freenetRequest: FreenetRequest, response: Response) = response
93         }
94
95 }