Add unit test for login page
[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         fun `post request with invalid sone sets sones and identities without sone in template context`() {
61                 request("", POST)
62                 page.handleRequest(freenetRequest, templateContext)
63                 assertThat(templateContext["sones"] as Iterable<Sone>, containsInAnyOrder(sones[0], sones[1], sones[2]))
64                 assertThat(templateContext["identitiesWithoutSone"] as Iterable<Identity>, contains(sones[1].identity))
65         }
66
67         @Test
68         fun `post request with valid sone and redirects to index page`() {
69                 request("", POST)
70                 addHttpRequestParameter("sone-id", "sone2")
71                 expectedException.expect(redirectsTo("index.html"))
72                 try {
73                         page.handleRequest(freenetRequest, templateContext)
74                 } finally {
75                         verify(webInterface).setCurrentSone(toadletContext, sones[1])
76                 }
77         }
78
79         @Test
80         fun `post request with valid sone and target redirects to target page`() {
81                 request("", POST)
82                 addHttpRequestParameter("sone-id", "sone2")
83                 addHttpRequestParameter("target", "foo.html")
84                 expectedException.expect(redirectsTo("foo.html"))
85                 try {
86                         page.handleRequest(freenetRequest, templateContext)
87                 } finally {
88                         verify(webInterface).setCurrentSone(toadletContext, sones[1])
89                 }
90         }
91
92         @Test
93         fun `redirect to index html if a sone is logged in`() {
94                 assertThat(page.getRedirectTarget(freenetRequest), equalTo("index.html"))
95         }
96
97         @Test
98         fun `do not redirect if no sone is logged in`() {
99                 unsetCurrentSone()
100                 assertThat(page.getRedirectTarget(freenetRequest), nullValue())
101         }
102
103         @Test
104         fun `page is not enabled if full access required and request is not full access`() {
105                 core.preferences.isRequireFullAccess = true
106                 assertThat(page.isEnabled(toadletContext), equalTo(false))
107         }
108
109         @Test
110         fun `page is enabled if no full access is required and there is no current sone`() {
111                 unsetCurrentSone()
112                 assertThat(page.isEnabled(toadletContext), equalTo(true))
113         }
114
115         @Test
116         fun `page is not enabled if no full access is required but there is a current sone`() {
117                 assertThat(page.isEnabled(toadletContext), equalTo(false))
118         }
119
120         @Test
121         fun `page is enabled if full access required and request is full access and there is no current sone`() {
122                 core.preferences.isRequireFullAccess = true
123                 unsetCurrentSone()
124                 whenever(toadletContext.isAllowedFullAccess).thenReturn(true)
125                 assertThat(page.isEnabled(toadletContext), equalTo(true))
126         }
127
128         @Test
129         fun `page is not enabled if full access required and request is full access but there is a current sone`() {
130                 core.preferences.isRequireFullAccess = true
131                 whenever(toadletContext.isAllowedFullAccess).thenReturn(true)
132                 assertThat(page.isEnabled(toadletContext), equalTo(false))
133         }
134
135 }