1 package net.pterodactylus.sone.web.page
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.*
11 import org.mockito.Mockito.*
13 class FreenetTemplatePageTest {
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)
22 fun `path is exposed correctly`() {
23 assertThat(page.path, equalTo("/test/path"))
27 fun `getPageTitle() default implementation returns empty string`() {
28 assertThat(page.getPageTitle(mock()), equalTo(""))
32 fun `isPrefixPage() default implementation returns false`() {
33 assertThat(page.isPrefixPage, equalTo(false))
37 fun `getStylesheets() default implementation returns empty collection`() {
38 assertThat(page.styleSheets, empty())
42 fun `getShortcutIcon() default implementation returns null`() {
43 assertThat(page.shortcutIcon, nullValue())
47 fun `getRedirectTarget() default implementation returns null`() {
48 assertThat(page.getRedirectTarget(mock()), nullValue())
52 fun `getAdditionalLinkNodes() default implementation returns empty collection`() {
53 assertThat(page.getAdditionalLinkNodes(mock()), empty())
57 fun `isFullAccessOnly() default implementation returns false`() {
58 assertThat(page.isFullAccessOnly, equalTo(false))
62 fun `isLinkExcepted() default implementation returns false`() {
63 assertThat(page.isLinkExcepted(mock()), equalTo(false))
67 fun `isEnabled() returns true if full access only is false`() {
68 assertThat(page.isEnabled(mock()), equalTo(true))
72 fun `isEnabled() returns false if full access only is true`() {
73 val page = object : TestPage(templateRenderer, loaders) {
74 override val isFullAccessOnly = true
76 assertThat(page.isEnabled(mock()), equalTo(false))
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"
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")))
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
96 val request = deepMock<FreenetRequest>()
97 val response = Response(null)
98 val pageResponse = page.handleRequest(request, response)
99 assertThat(pageResponse.statusCode, equalTo(401))
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)
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")))
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)
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")))
127 fun `template from annotation is loaded`() {
128 verify(loaders).loadTemplate("template-path")
131 @TemplatePath("template-path")
132 @ToadletPath("/test/path")
133 private open class TestPage(templateRenderer: TemplateRenderer, loaders: Loaders) : FreenetTemplatePage("/", templateRenderer, loaders, "invalid-form-password")