1 package net.pterodactylus.sone.web.ajax
3 import net.pterodactylus.sone.core.Preferences
4 import net.pterodactylus.sone.test.whenever
5 import net.pterodactylus.sone.web.page.FreenetRequest
6 import net.pterodactylus.util.web.Response
7 import org.hamcrest.MatcherAssert.assertThat
8 import org.hamcrest.Matchers.containsString
9 import org.hamcrest.Matchers.equalTo
10 import org.junit.Before
12 import java.io.ByteArrayOutputStream
13 import java.util.concurrent.atomic.AtomicInteger
16 * Unit test for [JsonPage].
18 class JsonPageBaseTest : TestObjects() {
20 private var needsFormPassword = false
21 private val pageCallCounter = AtomicInteger()
22 private var pageResponse = { JsonReturnObject(true).put("foo", "bar") }
23 private val outputStream = ByteArrayOutputStream()
24 private val response = Response(outputStream)
26 private val page = object : JsonPage(webInterface) {
28 override val needsFormPassword get() = this@JsonPageBaseTest.needsFormPassword
30 override fun createJsonObject(request: FreenetRequest) =
31 pageResponse().also { pageCallCounter.incrementAndGet() }
36 fun setupWebInterface() {
37 whenever(webInterface.core).thenReturn(core)
42 whenever(core.preferences).thenReturn(Preferences(eventBus))
46 fun setupFreenetRequest() {
47 whenever(freenetRequest.toadletContext).thenReturn(toadletContext)
51 fun `page returns 403 is full access is required but request is not full access`() {
52 core.preferences.newRequireFullAccess = true
53 page.handleRequest(freenetRequest, response)
54 assertThat(response.statusCode, equalTo(403))
55 assertThat(response.statusText, equalTo("Forbidden"))
56 assertThat(response.contentType, equalTo("application/json"))
57 assertThat(outputStream.toString("UTF-8").asJson(), equalTo(mapOf("success" to false, "error" to "auth-required")))
61 fun `page returns 403 if form password is needed but not supplied`() {
62 needsFormPassword = true
63 page.handleRequest(freenetRequest, response)
64 assertThat(response.statusCode, equalTo(403))
65 assertThat(response.statusText, equalTo("Forbidden"))
66 assertThat(response.contentType, equalTo("application/json"))
67 assertThat(outputStream.toString("UTF-8").asJson(), equalTo(mapOf("success" to false, "error" to "auth-required")))
71 fun `page returns 403 is form password is supplied but incorrect`() {
72 needsFormPassword = true
73 addRequestParameter("formPassword", formPassword + "_false")
74 page.handleRequest(freenetRequest, response)
75 assertThat(response.statusCode, equalTo(403))
76 assertThat(response.statusText, equalTo("Forbidden"))
77 assertThat(response.contentType, equalTo("application/json"))
78 assertThat(outputStream.toString("UTF-8").asJson(), equalTo(mapOf("success" to false, "error" to "auth-required")))
82 fun `page returns 200 if form password is required and correct`() {
83 needsFormPassword = true
84 addRequestParameter("formPassword", formPassword)
85 page.handleRequest(freenetRequest, response)
86 assertThat(response.statusCode, equalTo(200))
87 assertThat(response.statusText, equalTo("OK"))
88 assertThat(response.contentType, equalTo("application/json"))
89 assertThat(outputStream.toString("UTF-8").asJson(), equalTo(mapOf("success" to true, "foo" to "bar")))
93 fun `page returns 403 is login is required but current Sone is null`() {
95 page.handleRequest(freenetRequest, response)
96 assertThat(response.statusCode, equalTo(403))
97 assertThat(response.statusText, equalTo("Forbidden"))
98 assertThat(response.contentType, equalTo("application/json"))
99 assertThat(outputStream.toString("UTF-8").asJson(), equalTo(mapOf("success" to false, "error" to "auth-required")))
103 fun `page returns content if login is required and current Sone is set`() {
104 page.handleRequest(freenetRequest, response)
105 assertThat(pageCallCounter.get(), equalTo(1))
106 assertThat(response.statusCode, equalTo(200))
107 assertThat(response.statusText, equalTo("OK"))
108 assertThat(response.contentType, equalTo("application/json"))
109 assertThat(outputStream.toString("UTF-8").asJson(), equalTo(mapOf("success" to true, "foo" to "bar")))
113 fun `page returns 500 if execution throws exception`() {
114 pageResponse = { throw IllegalStateException("some error occured") }
115 page.handleRequest(freenetRequest, response)
116 assertThat(response.statusCode, equalTo(500))
117 assertThat(response.statusText, equalTo("some error occured"))
118 assertThat(response.contentType, equalTo("text/plain"))
122 fun `page returns stack trace if execution throws exception`() {
123 pageResponse = { throw IllegalStateException() }
124 page.handleRequest(freenetRequest, response)
125 assertThat(outputStream.toString(), containsString("IllegalStateException"))
129 fun `json page is not a prefix page`() {
130 assertThat(page.isPrefixPage, equalTo(false))
133 private fun String.asJson() = objectMapper.readValue(this, Map::class.java) as Map<String, Any>