Merge branch 'release-0.9.7'
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / template / RequestChangeFilterTest.kt
1 package net.pterodactylus.sone.template
2
3 import freenet.support.api.HTTPRequest
4 import net.pterodactylus.sone.test.Matchers.matchesRegex
5 import net.pterodactylus.sone.test.mock
6 import net.pterodactylus.sone.test.whenever
7 import net.pterodactylus.sone.web.page.FreenetRequest
8 import net.pterodactylus.util.template.TemplateContext
9 import org.hamcrest.MatcherAssert.assertThat
10 import org.hamcrest.Matchers.equalTo
11 import org.junit.Before
12 import org.junit.Test
13 import org.mockito.ArgumentMatchers.anyString
14 import java.net.URI
15
16 /**
17  * Unit test for [RequestChangeFilter].
18  */
19 class RequestChangeFilterTest {
20
21         private val filter = RequestChangeFilter()
22         private val templateContext = mock<TemplateContext>()
23         private val freenetRequest = mock<FreenetRequest>()
24         private val httpRequest = mock<HTTPRequest>()
25         private val parameters = mutableMapOf<String, String>()
26
27         @Before
28         fun setupFreenetRequest() {
29                 whenever(freenetRequest.httpRequest).thenReturn(httpRequest)
30                 whenever(freenetRequest.httpRequest.parameterNames).thenAnswer { parameters.keys }
31                 whenever(freenetRequest.httpRequest.getParam(anyString())).thenAnswer { parameters[it.arguments[0]] }
32         }
33
34         @Test
35         fun `filter correctly appends parameter to request URL without parameters`() {
36                 whenever(freenetRequest.uri).thenReturn(URI("/some/path.html"))
37                 val uri = filter.format(templateContext, freenetRequest, mapOf("name" to "name", "value" to "value")) as URI
38                 assertThat(uri, equalTo(URI("/some/path.html?name=value")))
39         }
40
41         @Test
42         fun `filter cuts off old query`() {
43                 whenever(freenetRequest.uri).thenReturn(URI("/some/path.html?foo=bar"))
44                 val uri = filter.format(templateContext, freenetRequest, mapOf("name" to "name", "value" to "value")) as URI
45                 assertThat(uri, equalTo(URI("/some/path.html?name=value")))
46         }
47
48         @Test
49         fun `filter correctly appends parameter to request URL with parameters`() {
50                 parameters["foo"] = "bar"
51                 whenever(freenetRequest.uri).thenReturn(URI("/some/path.html"))
52                 val uri = filter.format(templateContext, freenetRequest, mapOf("name" to "name", "value" to "value")) as URI
53                 assertThat(uri.toString(), matchesRegex("/some/path.html\\?(foo=bar&name=value|name=value&foo=bar)"))
54         }
55
56         @Test
57         fun `filter overwrites existing parameter value`() {
58                 parameters["name"] = "old"
59                 whenever(freenetRequest.uri).thenReturn(URI("/some/path.html"))
60                 val uri = filter.format(templateContext, freenetRequest, mapOf("name" to "name", "value" to "value")) as URI
61                 assertThat(uri, equalTo(URI("/some/path.html?name=value")))
62         }
63
64         @Test
65         fun `filter correctly encodes characters`() {
66                 whenever(freenetRequest.uri).thenReturn(URI("/some/path.html"))
67                 val uri = filter.format(templateContext, freenetRequest, mapOf("name" to "name", "value" to " välue")) as URI
68                 assertThat(uri, equalTo(URI("/some/path.html?name=+v%C3%A4lue")))
69         }
70
71 }