Suppress warnings about unchecked casts
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / web / LoginPageTest.kt
1 package net.pterodactylus.sone.web
2
3 import net.pterodactylus.sone.data.Sone
4 import net.pterodactylus.sone.freenet.wot.Identity
5 import net.pterodactylus.sone.freenet.wot.OwnIdentity
6 import net.pterodactylus.sone.test.mock
7 import net.pterodactylus.sone.test.thenReturnMock
8 import net.pterodactylus.sone.test.whenever
9 import net.pterodactylus.sone.web.WebTestUtils.redirectsTo
10 import net.pterodactylus.util.web.Method.GET
11 import net.pterodactylus.util.web.Method.POST
12 import org.hamcrest.MatcherAssert.assertThat
13 import org.hamcrest.Matchers.contains
14 import org.hamcrest.Matchers.containsInAnyOrder
15 import org.hamcrest.Matchers.equalTo
16 import org.hamcrest.Matchers.nullValue
17 import org.junit.Before
18 import org.junit.Test
19 import org.mockito.Mockito.verify
20
21 /**
22  * Unit test for [LoginPage].
23  */
24 class LoginPageTest : WebPageTest() {
25
26         private val page = LoginPage(template, webInterface)
27
28         private val sones = listOf(createSone("Sone", "Test"), createSone("Test"), createSone("Sone"))
29
30         private fun createSone(vararg contexts: String) = mock<Sone>().apply {
31                 whenever(id).thenReturn(hashCode().toString())
32                 val identity = mock<OwnIdentity>().apply {
33                         whenever(this.contexts).thenReturn(contexts.toSet())
34                         contexts.forEach { whenever(hasContext(it)).thenReturn(true) }
35                 }
36                 whenever(this.identity).thenReturn(identity)
37                 whenever(profile).thenReturnMock()
38         }
39
40         @Before
41         fun setupSones() {
42                 addLocalSone("sone1", sones[0])
43                 addLocalSone("sone2", sones[1])
44                 addLocalSone("sone3", sones[2])
45                 addOwnIdentity(sones[0].identity as OwnIdentity)
46                 addOwnIdentity(sones[1].identity as OwnIdentity)
47                 addOwnIdentity(sones[2].identity as OwnIdentity)
48         }
49
50         @Test
51         @Suppress("UNCHECKED_CAST")
52         fun `get request stores sone and identities without sones in template context`() {
53                 request("", GET)
54                 page.handleRequest(freenetRequest, templateContext)
55                 assertThat(templateContext["sones"] as Iterable<Sone>, containsInAnyOrder(sones[0], sones[1], sones[2]))
56                 assertThat(templateContext["identitiesWithoutSone"] as Iterable<Identity>, contains(sones[1].identity))
57         }
58
59         @Test
60         @Suppress("UNCHECKED_CAST")
61         fun `post request with invalid sone sets sones and identities without sone in template context`() {
62                 request("", POST)
63                 page.handleRequest(freenetRequest, templateContext)
64                 assertThat(templateContext["sones"] as Iterable<Sone>, containsInAnyOrder(sones[0], sones[1], sones[2]))
65                 assertThat(templateContext["identitiesWithoutSone"] as Iterable<Identity>, contains(sones[1].identity))
66         }
67
68         @Test
69         fun `post request with valid sone and redirects to index page`() {
70                 request("", POST)
71                 addHttpRequestParameter("sone-id", "sone2")
72                 expectedException.expect(redirectsTo("index.html"))
73                 try {
74                         page.handleRequest(freenetRequest, templateContext)
75                 } finally {
76                         verify(webInterface).setCurrentSone(toadletContext, sones[1])
77                 }
78         }
79
80         @Test
81         fun `post request with valid sone and target redirects to target page`() {
82                 request("", POST)
83                 addHttpRequestParameter("sone-id", "sone2")
84                 addHttpRequestParameter("target", "foo.html")
85                 expectedException.expect(redirectsTo("foo.html"))
86                 try {
87                         page.handleRequest(freenetRequest, templateContext)
88                 } finally {
89                         verify(webInterface).setCurrentSone(toadletContext, sones[1])
90                 }
91         }
92
93         @Test
94         fun `redirect to index html if a sone is logged in`() {
95                 assertThat(page.getRedirectTarget(freenetRequest), equalTo("index.html"))
96         }
97
98         @Test
99         fun `do not redirect if no sone is logged in`() {
100                 unsetCurrentSone()
101                 assertThat(page.getRedirectTarget(freenetRequest), nullValue())
102         }
103
104         @Test
105         fun `page is not enabled if full access required and request is not full access`() {
106                 core.preferences.isRequireFullAccess = true
107                 assertThat(page.isEnabled(toadletContext), equalTo(false))
108         }
109
110         @Test
111         fun `page is enabled if no full access is required and there is no current sone`() {
112                 unsetCurrentSone()
113                 assertThat(page.isEnabled(toadletContext), equalTo(true))
114         }
115
116         @Test
117         fun `page is not enabled if no full access is required but there is a current sone`() {
118                 assertThat(page.isEnabled(toadletContext), equalTo(false))
119         }
120
121         @Test
122         fun `page is enabled if full access required and request is full access and there is no current sone`() {
123                 core.preferences.isRequireFullAccess = true
124                 unsetCurrentSone()
125                 whenever(toadletContext.isAllowedFullAccess).thenReturn(true)
126                 assertThat(page.isEnabled(toadletContext), equalTo(true))
127         }
128
129         @Test
130         fun `page is not enabled if full access required and request is full access but there is a current sone`() {
131                 core.preferences.isRequireFullAccess = true
132                 whenever(toadletContext.isAllowedFullAccess).thenReturn(true)
133                 assertThat(page.isEnabled(toadletContext), equalTo(false))
134         }
135
136 }