1 package net.pterodactylus.sone.web.ajax
3 import com.fasterxml.jackson.databind.JsonNode
4 import net.pterodactylus.sone.data.Sone
5 import net.pterodactylus.sone.data.Sone.SoneStatus.downloading
6 import net.pterodactylus.sone.data.Sone.SoneStatus.inserting
7 import net.pterodactylus.sone.freenet.L10nFilter
8 import net.pterodactylus.sone.freenet.L10nText
9 import net.pterodactylus.sone.test.deepMock
10 import net.pterodactylus.sone.test.mock
11 import net.pterodactylus.sone.test.whenever
12 import net.pterodactylus.sone.text.TimeText
13 import net.pterodactylus.sone.text.TimeTextConverter
14 import net.pterodactylus.sone.utils.jsonArray
15 import net.pterodactylus.util.notify.Notification
16 import org.hamcrest.MatcherAssert.assertThat
17 import org.hamcrest.Matchers.allOf
18 import org.hamcrest.Matchers.containsInAnyOrder
19 import org.hamcrest.Matchers.emptyIterable
20 import org.hamcrest.Matchers.equalTo
21 import org.hamcrest.Matchers.hasEntry
22 import org.junit.Before
24 import org.mockito.ArgumentMatchers.any
25 import org.mockito.ArgumentMatchers.anyLong
26 import java.util.TimeZone
29 * Unit test for [GetStatusAjaxPage].
31 class GetStatusAjaxPageTest: JsonPageTest() {
33 private val timeTextConverter = mock<TimeTextConverter>()
34 private val l10nFilter = mock<L10nFilter>()
35 override var page: JsonPage = GetStatusAjaxPage(webInterface, elementLoader, timeTextConverter, l10nFilter, TimeZone.getTimeZone("UTC"))
38 fun setupTimeTextConverter() {
39 whenever(timeTextConverter.getTimeText(anyLong())).thenAnswer { TimeText(L10nText(it.getArgument<Long>(0).toString()), it.getArgument(0)) }
40 whenever(l10nFilter.format(any(), any(), any())).thenAnswer { it.getArgument<L10nText>(1).text }
44 fun `page returns correct path`() {
45 assertThat(page.path, equalTo("getStatus.ajax"))
49 fun `page does not require form password`() {
50 assertThat(page.needsFormPassword(), equalTo(false))
54 fun `page does not require login`() {
55 assertThat(page.requiresLogin(), equalTo(false))
59 fun `page returns correct attribute “loggedIn” if sone is logged in`() {
60 assertThat(json.get("loggedIn").asText(), equalTo("true"))
64 fun `page returns correct attribute “loggedIn” if sone is not logged in`() {
66 assertThat(json.get("loggedIn").asText(), equalTo("false"))
70 fun `page returns options for sone if sone is logged in`() {
71 assertThat(json.get("options").toMap(), allOf(
72 hasEntry("ShowNotification/NewSones", "false"),
73 hasEntry("ShowNotification/NewPosts", "false"),
74 hasEntry("ShowNotification/NewReplies", "false")
79 fun `page returns empty options if sone is not logged in`() {
81 assertThat(json.get("options"), emptyIterable())
85 fun `page returns empty sones object if no sone is logged in and no sones parameter is given`() {
87 assertThat(json.get("sones"), emptyIterable())
91 fun `page returns a sones object with the current sone if not other sones parameter is given`() {
92 assertThat(json.get("sones").elements().asSequence().map { it.toMap() }.toList(), containsInAnyOrder(
93 mapOf<String, String?>("id" to "soneId", "name" to "Sone_Id", "local" to "true", "status" to "idle", "modified" to "false", "locked" to "false", "lastUpdatedUnknown" to "false", "lastUpdated" to "Jan 1, 1970, 00:00:01", "lastUpdatedText" to "1000")
98 fun `page returns some sones objects with the current sone and some sones given as sones parameter`() {
99 addSone(deepMock<Sone>().mock("sone1", "Sone 1", false, 2000, downloading))
100 addSone(deepMock<Sone>().mock("sone3", "Sone 3", true, 3000, inserting))
101 addRequestParameter("soneIds", "sone1,sone2,sone3")
102 assertThat(json.get("sones").elements().asSequence().map { it.toMap() }.toList(), containsInAnyOrder(
103 mapOf<String, String?>("id" to "soneId", "name" to "Sone_Id", "local" to "true", "status" to "idle", "modified" to "false", "locked" to "false", "lastUpdatedUnknown" to "false", "lastUpdated" to "Jan 1, 1970, 00:00:01", "lastUpdatedText" to "1000"),
104 mapOf("id" to "sone1", "name" to "Sone 1", "local" to "false", "status" to "downloading", "modified" to "false", "locked" to "false", "lastUpdatedUnknown" to "false", "lastUpdated" to "Jan 1, 1970, 00:00:02", "lastUpdatedText" to "2000"),
105 mapOf("id" to "sone3", "name" to "Sone 3", "local" to "true", "status" to "inserting", "modified" to "false", "locked" to "false", "lastUpdatedUnknown" to "false", "lastUpdated" to "Jan 1, 1970, 00:00:03", "lastUpdatedText" to "3000")
110 fun `page returns correct notifications hash`() {
111 val notifications = listOf(
112 mock<Notification>().apply { whenever(this.createdTime).thenReturn(2000) },
113 mock<Notification>().apply { whenever(this.createdTime).thenReturn(1000) }
115 addNotification(*notifications.toTypedArray())
116 assertThat(json.get("notificationHash").asInt(), equalTo(notifications.sortedBy { it.createdTime }.hashCode()))
120 fun `page returns new posts`() {
121 addNewPost("post1", "sone1", 1000)
122 addNewPost("post2", "sone2", 2000, "sone1")
123 assertThat(json.get("newPosts").elements().asSequence().map { it.toMap() }.toList(), containsInAnyOrder(
124 mapOf("id" to "post1", "sone" to "sone1", "time" to "1000", "recipient" to null),
125 mapOf("id" to "post2", "sone" to "sone2", "time" to "2000", "recipient" to "sone1")
130 fun `page returns new replies`() {
131 addNewReply("reply1", "sone1", "post1", "sone11")
132 addNewReply("reply2", "sone2", "post2", "sone22")
133 assertThat(json.get("newReplies").elements().asSequence().map { it.toMap() }.toList(), containsInAnyOrder(
134 mapOf<String, String?>("id" to "reply1", "sone" to "sone1", "post" to "post1", "postSone" to "sone11"),
135 mapOf("id" to "reply2", "sone" to "sone2", "post" to "post2", "postSone" to "sone22")
140 fun `page returns information about loaded elements`() {
141 addLinkedElement("KSK@test.png", loading = false, failed = false)
142 addLinkedElement("KSK@test.html", loading = true, failed = false)
143 addLinkedElement("KSK@test.jpeg", loading = false, failed = true)
144 addRequestParameter("elements", jsonArray("KSK@test.png", "KSK@test.html", "KSK@test.jpeg").toString())
145 assertThat(json.get("linkedElements").elements().asSequence().map { it.toMap() }.toList(), containsInAnyOrder(
146 mapOf<String, String?>("link" to "KSK@test.png", "loading" to "false", "failed" to "false"),
147 mapOf("link" to "KSK@test.html", "loading" to "true", "failed" to "false"),
148 mapOf("link" to "KSK@test.jpeg", "loading" to "false", "failed" to "true")
152 private fun JsonNode.toMap() = fields().asSequence().map { it.key!! to if (it.value.isNull) null else it.value.asText()!! }.toMap()