1 package net.pterodactylus.sone.web.page
3 import net.pterodactylus.sone.main.*
4 import net.pterodactylus.sone.test.*
5 import net.pterodactylus.util.web.*
6 import net.pterodactylus.util.web.Method.*
7 import org.hamcrest.MatcherAssert.*
8 import org.hamcrest.Matchers.*
10 import org.mockito.Mockito.*
12 class FreenetTemplatePageTest {
14 private val templateRenderer = deepMock<TemplateRenderer>()
15 private val loaders = mock<Loaders>()
16 private val page = TestPage(templateRenderer, loaders)
19 fun `path is exposed correctly`() {
20 assertThat(page.path, equalTo("/test/path"))
24 fun `getPageTitle() default implementation returns empty string`() {
25 assertThat(page.getPageTitle(mock()), equalTo(""))
29 fun `isPrefixPage() default implementation returns false`() {
30 assertThat(page.isPrefixPage, equalTo(false))
34 fun `getStylesheets() default implementation returns empty collection`() {
35 assertThat(page.styleSheets, empty())
39 fun `getShortcutIcon() default implementation returns null`() {
40 assertThat(page.shortcutIcon, nullValue())
44 fun `getRedirectTarget() default implementation returns null`() {
45 assertThat(page.getRedirectTarget(mock()), nullValue())
49 fun `getAdditionalLinkNodes() default implementation returns empty collection`() {
50 assertThat(page.getAdditionalLinkNodes(mock()), empty())
54 fun `isFullAccessOnly() default implementation returns false`() {
55 assertThat(page.isFullAccessOnly, equalTo(false))
59 fun `isLinkExcepted() default implementation returns false`() {
60 assertThat(page.isLinkExcepted(mock()), equalTo(false))
64 fun `isEnabled() returns true if full access only is false`() {
65 assertThat(page.isEnabled(mock()), equalTo(true))
69 fun `isEnabled() returns false if full access only is true`() {
70 val page = object : TestPage(templateRenderer, loaders) {
71 override val isFullAccessOnly = true
73 assertThat(page.isEnabled(mock()), equalTo(false))
77 fun `page with redirect target throws redirect exception on handleRequest`() {
78 val page = object : TestPage(templateRenderer, loaders) {
79 override fun getRedirectTarget(request: FreenetRequest) = "foo"
81 val request = mock<FreenetRequest>()
82 val response = mock<Response>()
83 val pageResponse = page.handleRequest(request, response)
84 assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
85 assertThat(pageResponse.headers, contains(hasHeader("location", "foo")))
89 fun `page with full access only returns unauthorized on handleRequest with non-full access request`() {
90 val page = object : TestPage(templateRenderer, loaders) {
91 override val isFullAccessOnly = true
93 val request = deepMock<FreenetRequest>()
94 val response = Response(null)
95 val pageResponse = page.handleRequest(request, response)
96 assertThat(pageResponse.statusCode, equalTo(401))
100 fun `page redirects on POST without form password`() {
101 val request = deepMock<FreenetRequest>().apply {
102 whenever(httpRequest.getPartAsStringFailsafe(any(), anyInt())).thenReturn("")
103 whenever(method).thenReturn(POST)
105 val response = Response(null)
106 val pageResponse = page.handleRequest(request, response)
107 assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
108 assertThat(pageResponse.headers, contains(hasHeader("location", "invalid-form-password")))
112 fun `page redirects on POST with invalid password`() {
113 val request = deepMock<FreenetRequest>().apply {
114 whenever(httpRequest.getPartAsStringFailsafe(any(), anyInt())).thenReturn("invalid")
115 whenever(method).thenReturn(POST)
117 val response = Response(null)
118 val pageResponse = page.handleRequest(request, response)
119 assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
120 assertThat(pageResponse.headers, contains(hasHeader("location", "invalid-form-password")))
124 fun `template from annotation is loaded`() {
125 verify(loaders).loadTemplate("template-path")
128 @TemplatePath("template-path")
129 @ToadletPath("/test/path")
130 private open class TestPage(templateRenderer: TemplateRenderer, loaders: Loaders) : FreenetTemplatePage(templateRenderer, loaders, "invalid-form-password")