♻️ Extract page implementation for tests
[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 org.junit.*
9 import org.junit.rules.*
10 import org.mockito.Mockito.*
11 import kotlin.test.Test
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<FreenetRequest>()
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         @Test
84         fun `adding a debug page will not add it to the container`() {
85                 val toadlet = createPageToadlet()
86                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadlet)
87                 pageToadletRegistry.addDebugPage(page)
88                 pageToadletRegistry.registerToadlets()
89                 verify(toadletContainer, never()).register(toadlet, null, "/Sone/", true, false)
90         }
91
92         @Test
93         fun `adding a debug page and activating debug mode will add it to the container`() {
94                 val toadlet = createPageToadlet()
95                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadlet)
96                 pageToadletRegistry.addDebugPage(page)
97                 pageToadletRegistry.registerToadlets()
98                 pageToadletRegistry.activateDebugMode()
99                 verify(toadletContainer).register(toadlet, null, "/Sone/", true, false)
100         }
101
102         @Test
103         fun `adding a debug page and activating debug mode twice will add it to the container once`() {
104                 val toadlet = createPageToadlet()
105                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadlet)
106                 pageToadletRegistry.addDebugPage(page)
107                 pageToadletRegistry.registerToadlets()
108                 pageToadletRegistry.activateDebugMode()
109                 pageToadletRegistry.activateDebugMode()
110                 verify(toadletContainer, times(1)).register(toadlet, null, "/Sone/", true, false)
111         }
112
113         @Test
114         fun `debug pages are ungegistered from the container`() {
115                 val toadlet = createPageToadlet()
116                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadlet)
117                 pageToadletRegistry.addDebugPage(page)
118                 pageToadletRegistry.registerToadlets()
119                 pageToadletRegistry.activateDebugMode()
120                 pageToadletRegistry.unregisterToadlets()
121                 verify(toadletContainer).unregister(toadlet)
122         }
123
124         @Test
125         fun `inactive debug pages are not ungegistered from the container`() {
126                 val toadlet = createPageToadlet()
127                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadlet)
128                 pageToadletRegistry.addDebugPage(page)
129                 pageToadletRegistry.registerToadlets()
130                 pageToadletRegistry.unregisterToadlets()
131                 verify(toadletContainer, never()).unregister(toadlet)
132         }
133
134         @Test
135         fun `debug page can not be added after registering`() {
136                 val toadlet = createPageToadlet()
137                 whenever(pageToadletFactory.createPageToadlet(page)).thenReturn(toadlet)
138                 pageToadletRegistry.registerToadlets()
139                 expectedException.expect(IllegalStateException::class.java)
140                 pageToadletRegistry.addDebugPage(page)
141         }
142
143         private fun createPageToadlet(menuName: String? = null) =
144                         mock<PageToadlet>().apply {
145                                 whenever(this.path()).thenReturn("/Sone/")
146                                 whenever(this.menuName).thenReturn(menuName)
147                         }
148
149 }