✨ Add @ToadletPath annotation
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / page / FreenetTemplatePageTest.kt
1 package net.pterodactylus.sone.web.page
2
3 import net.pterodactylus.sone.main.*
4 import net.pterodactylus.sone.test.*
5 import net.pterodactylus.util.template.*
6 import net.pterodactylus.util.web.*
7 import net.pterodactylus.util.web.Method.*
8 import org.hamcrest.MatcherAssert.*
9 import org.hamcrest.Matchers.*
10 import org.junit.*
11 import org.mockito.Mockito.*
12
13 class FreenetTemplatePageTest {
14
15         private val templateContextFactory = deepMock<TemplateContextFactory>()
16         private val templateRenderer = deepMock<TemplateRenderer>()
17         private val loaders = mock<Loaders>()
18         private val template = mock<Template>()
19         private val page = TestPage(templateRenderer, loaders)
20
21         @Test
22         fun `path is exposed correctly`() {
23                 assertThat(page.path, equalTo("/test/path"))
24         }
25
26         @Test
27         fun `getPageTitle() default implementation returns empty string`() {
28                 assertThat(page.getPageTitle(mock()), equalTo(""))
29         }
30
31         @Test
32         fun `isPrefixPage() default implementation returns false`() {
33                 assertThat(page.isPrefixPage, equalTo(false))
34         }
35
36         @Test
37         fun `getStylesheets() default implementation returns empty collection`() {
38                 assertThat(page.styleSheets, empty())
39         }
40
41         @Test
42         fun `getShortcutIcon() default implementation returns null`() {
43                 assertThat(page.shortcutIcon, nullValue())
44         }
45
46         @Test
47         fun `getRedirectTarget() default implementation returns null`() {
48                 assertThat(page.getRedirectTarget(mock()), nullValue())
49         }
50
51         @Test
52         fun `getAdditionalLinkNodes() default implementation returns empty collection`() {
53                 assertThat(page.getAdditionalLinkNodes(mock()), empty())
54         }
55
56         @Test
57         fun `isFullAccessOnly() default implementation returns false`() {
58                 assertThat(page.isFullAccessOnly, equalTo(false))
59         }
60
61         @Test
62         fun `isLinkExcepted() default implementation returns false`() {
63                 assertThat(page.isLinkExcepted(mock()), equalTo(false))
64         }
65
66         @Test
67         fun `isEnabled() returns true if full access only is false`() {
68                 assertThat(page.isEnabled(mock()), equalTo(true))
69         }
70
71         @Test
72         fun `isEnabled() returns false if full access only is true`() {
73                 val page = object : TestPage(templateRenderer, loaders) {
74                         override val isFullAccessOnly = true
75                 }
76                 assertThat(page.isEnabled(mock()), equalTo(false))
77         }
78
79         @Test
80         fun `page with redirect target throws redirect exception on handleRequest`() {
81                 val page = object : TestPage(templateRenderer, loaders) {
82                         override fun getRedirectTarget(request: FreenetRequest) = "foo"
83                 }
84                 val request = mock<FreenetRequest>()
85                 val response = mock<Response>()
86                 val pageResponse = page.handleRequest(request, response)
87                 assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
88                 assertThat(pageResponse.headers, contains(hasHeader("location", "foo")))
89         }
90
91         @Test
92         fun `page with full access only returns unauthorized on handleRequest with non-full access request`() {
93                 val page = object : TestPage(templateRenderer, loaders) {
94                         override val isFullAccessOnly = true
95                 }
96                 val request = deepMock<FreenetRequest>()
97                 val response = Response(null)
98                 val pageResponse = page.handleRequest(request, response)
99                 assertThat(pageResponse.statusCode, equalTo(401))
100         }
101
102         @Test
103         fun `page redirects on POST without form password`() {
104                 val request = deepMock<FreenetRequest>().apply {
105                         whenever(httpRequest.getPartAsStringFailsafe(any(), anyInt())).thenReturn("")
106                         whenever(method).thenReturn(POST)
107                 }
108                 val response = Response(null)
109                 val pageResponse = page.handleRequest(request, response)
110                 assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
111                 assertThat(pageResponse.headers, contains(hasHeader("location", "invalid-form-password")))
112         }
113
114         @Test
115         fun `page redirects on POST with invalid password`() {
116                 val request = deepMock<FreenetRequest>().apply {
117                         whenever(httpRequest.getPartAsStringFailsafe(any(), anyInt())).thenReturn("invalid")
118                         whenever(method).thenReturn(POST)
119                 }
120                 val response = Response(null)
121                 val pageResponse = page.handleRequest(request, response)
122                 assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
123                 assertThat(pageResponse.headers, contains(hasHeader("location", "invalid-form-password")))
124         }
125
126         @Test
127         fun `template from annotation is loaded`() {
128                 verify(loaders).loadTemplate("template-path")
129         }
130
131         @TemplatePath("template-path")
132         @ToadletPath("/test/path")
133         private open class TestPage(templateRenderer: TemplateRenderer, loaders: Loaders) : FreenetTemplatePage("/", templateRenderer, loaders, "invalid-form-password")
134
135 }