Add unit test for JSON base page
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / ajax / JsonPageBaseTest.kt
1 package net.pterodactylus.sone.web.ajax
2
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
11 import org.junit.Test
12 import java.io.ByteArrayOutputStream
13 import java.util.concurrent.atomic.AtomicInteger
14
15 /**
16  * Unit test for [JsonPage].
17  */
18 class JsonPageBaseTest : TestObjects() {
19
20         private var needsFormPassword = false
21         private val pageCallCounter = AtomicInteger()
22         private var pageResponse = { JsonReturnObject(true) }
23         private val outputStream = ByteArrayOutputStream()
24         private val response = Response(outputStream)
25
26         private val page = object : JsonPage("path.html", webInterface) {
27
28                 override fun needsFormPassword() = this@JsonPageBaseTest.needsFormPassword
29
30                 override fun createJsonObject(request: FreenetRequest) =
31                                 pageResponse().also { pageCallCounter.incrementAndGet() }
32
33         }
34
35         @Before
36         fun setupWebInterface() {
37                 whenever(webInterface.core).thenReturn(core)
38         }
39
40         @Before
41         fun setupCore() {
42                 whenever(core.preferences).thenReturn(Preferences(eventBus))
43         }
44
45         @Before
46         fun setupFreenetRequest() {
47                 whenever(freenetRequest.toadletContext).thenReturn(toadletContext)
48         }
49
50         @Test
51         fun `page returns 403 is full access is required but request is not full access`() {
52                 core.preferences.isRequireFullAccess = true
53                 page.handleRequest(freenetRequest, response)
54                 assertThat(response.statusCode, equalTo(403))
55         }
56
57         @Test
58         fun `page returns 403 if form password is needed but not supplied`() {
59                 needsFormPassword = true
60                 page.handleRequest(freenetRequest, response)
61                 assertThat(response.statusCode, equalTo(403))
62         }
63
64         @Test
65         fun `page returns 403 is form password is supplied but incorrect`() {
66                 needsFormPassword = true
67                 addRequestParameter("formPassword", formPassword + "_false")
68                 page.handleRequest(freenetRequest, response)
69                 assertThat(response.statusCode, equalTo(403))
70         }
71
72         @Test
73         fun `page returns 200 if form password is required and correct`() {
74                 needsFormPassword = true
75                 addRequestParameter("formPassword", formPassword)
76                 page.handleRequest(freenetRequest, response)
77                 assertThat(response.statusCode, equalTo(200))
78         }
79
80         @Test
81         fun `page returns 403 is login is required but current Sone is null`() {
82                 unsetCurrentSone()
83                 page.handleRequest(freenetRequest, response)
84                 assertThat(response.statusCode, equalTo(403))
85         }
86
87         @Test
88         fun `page returns content if login is required and current Sone is set`() {
89                 page.handleRequest(freenetRequest, response)
90                 assertThat(response.statusCode, equalTo(200))
91                 assertThat(pageCallCounter.get(), equalTo(1))
92         }
93
94         @Test
95         fun `page returns 500 if execution throws exception`() {
96                 pageResponse = { throw IllegalStateException() }
97                 page.handleRequest(freenetRequest, response)
98                 assertThat(response.statusCode, equalTo(500))
99         }
100
101         @Test
102         fun `page returns stack trace if execution throws exception`() {
103                 pageResponse = { throw IllegalStateException() }
104                 page.handleRequest(freenetRequest, response)
105                 assertThat(outputStream.toString(), containsString("IllegalStateException"))
106         }
107
108         @Test
109         fun `json page is not a prefix page`() {
110             assertThat(page.isPrefixPage, equalTo(false))
111         }
112
113 }