+ @Test
+ fun `page with redirect target throws redirect exception on handleRequest`() {
+ val page = object : TestPage(templateRenderer, loaders) {
+ override fun getRedirectTarget(request: FreenetRequest) = "foo"
+ }
+ val request = mock<FreenetRequest>()
+ val response = mock<Response>()
+ val pageResponse = page.handleRequest(request, response)
+ assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
+ assertThat(pageResponse.headers, contains(hasHeader("location", "foo")))
+ }
+
+ @Test
+ fun `page with full access only returns unauthorized on handleRequest with non-full access request`() {
+ val page = object : TestPage(templateRenderer, loaders) {
+ override val isFullAccessOnly = true
+ }
+ val request = deepMock<FreenetRequest>()
+ val response = Response(null)
+ val pageResponse = page.handleRequest(request, response)
+ assertThat(pageResponse.statusCode, equalTo(401))
+ }
+
+ @Test
+ fun `page redirects on POST without form password`() {
+ val request = deepMock<FreenetRequest>().apply {
+ whenever(httpRequest.getPartAsStringFailsafe(any(), anyInt())).thenReturn("")
+ whenever(method).thenReturn(POST)
+ }
+ val response = Response(null)
+ val pageResponse = page.handleRequest(request, response)
+ assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
+ assertThat(pageResponse.headers, contains(hasHeader("location", "invalid-form-password")))
+ }
+
+ @Test
+ fun `page redirects on POST with invalid password`() {
+ val request = deepMock<FreenetRequest>().apply {
+ whenever(httpRequest.getPartAsStringFailsafe(any(), anyInt())).thenReturn("invalid")
+ whenever(method).thenReturn(POST)
+ }
+ val response = Response(null)
+ val pageResponse = page.handleRequest(request, response)
+ assertThat(pageResponse.statusCode, anyOf(equalTo(302), equalTo(307)))
+ assertThat(pageResponse.headers, contains(hasHeader("location", "invalid-form-password")))
+ }
+
+ @Test
+ @Dirty
+ fun `freenet template page creates page with correct title`() {
+ val page = object : TestPage(templateRenderer, loaders) {
+ override fun getPageTitle(request: FreenetRequest) = "page title"
+ }
+ val request = deepMock<FreenetRequest>()
+ val pageMakerInteractionFactory = deepMock<PageMakerInteractionFactory>()
+ whenever(pageMakerInteractionFactory.createPageMaker(request.toadletContext, "page title").renderPage()).thenReturn("<page>")
+ setField(page, "pageMakerInteractionFactory", pageMakerInteractionFactory)
+ val response = page.handleRequest(request, Response(ByteArrayOutputStream()))
+ assertThat(response.statusCode, equalTo(200))
+ assertThat((response.content as ByteArrayOutputStream).toString(UTF_8.name()), equalTo("<page>"))
+ }
+
+ @Test
+ fun `template from annotation is loaded`() {
+ verify(loaders).loadTemplate("template-path")
+ }
+
+ @TemplatePath("template-path")
+ @ToadletPath("/test/path")
+ private open class TestPage(templateRenderer: TemplateRenderer, loaders: Loaders) : FreenetTemplatePage(templateRenderer, loaders, "invalid-form-password")
+