Remove @author tags
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / database / memory / ConfigurationLoaderTest.kt
1 package net.pterodactylus.sone.database.memory
2
3 import net.pterodactylus.sone.test.TestValue.from
4 import net.pterodactylus.sone.test.mock
5 import net.pterodactylus.sone.test.whenever
6 import net.pterodactylus.util.config.Configuration
7 import net.pterodactylus.util.config.Value
8 import org.hamcrest.MatcherAssert.assertThat
9 import org.hamcrest.Matchers.containsInAnyOrder
10 import org.hamcrest.Matchers.equalTo
11 import org.hamcrest.Matchers.nullValue
12 import org.junit.Test
13
14 /**
15  * Unit test for [ConfigurationLoader].
16  */
17 class ConfigurationLoaderTest {
18
19         private val configuration = mock<Configuration>()
20         private val configurationLoader = ConfigurationLoader(configuration)
21
22         private fun setupStringValue(attribute: String, value: String? = null): Value<String?> =
23                         from(value).apply {
24                                 whenever(configuration.getStringValue(attribute)).thenReturn(this)
25                         }
26
27         private fun setupLongValue(attribute: String, value: Long? = null): Value<Long?> =
28                         from(value).apply {
29                                 whenever(configuration.getLongValue(attribute)).thenReturn(this)
30                         }
31
32         @Test
33         fun `loader can load known posts`() {
34                 setupStringValue("KnownPosts/0/ID", "Post2")
35                 setupStringValue("KnownPosts/1/ID", "Post1")
36                 setupStringValue("KnownPosts/2/ID")
37                 val knownPosts = configurationLoader.loadKnownPosts()
38                 assertThat(knownPosts, containsInAnyOrder("Post1", "Post2"))
39         }
40
41         @Test
42         fun `loader can load known post replies`() {
43                 setupStringValue("KnownReplies/0/ID", "PostReply2")
44                 setupStringValue("KnownReplies/1/ID", "PostReply1")
45                 setupStringValue("KnownReplies/2/ID")
46                 val knownPosts = configurationLoader.loadKnownPostReplies()
47                 assertThat(knownPosts, containsInAnyOrder("PostReply1", "PostReply2"))
48         }
49
50         @Test
51         fun `loader can load bookmarked posts`() {
52                 setupStringValue("Bookmarks/Post/0/ID", "Post2")
53                 setupStringValue("Bookmarks/Post/1/ID", "Post1")
54                 setupStringValue("Bookmarks/Post/2/ID")
55                 val knownPosts = configurationLoader.loadBookmarkedPosts()
56                 assertThat(knownPosts, containsInAnyOrder("Post1", "Post2"))
57         }
58
59         @Test
60         fun `loader can save bookmarked posts`() {
61                 val post1 = setupStringValue("Bookmarks/Post/0/ID")
62                 val post2 = setupStringValue("Bookmarks/Post/1/ID")
63                 val post3 = setupStringValue("Bookmarks/Post/2/ID")
64                 val originalPosts = setOf("Post1", "Post2")
65                 configurationLoader.saveBookmarkedPosts(originalPosts)
66                 val extractedPosts = setOf(post1.value, post2.value)
67                 assertThat(extractedPosts, containsInAnyOrder("Post1", "Post2"))
68                 assertThat(post3.value, nullValue())
69         }
70
71         @Test
72         fun `loader can load Sone following times`() {
73                 setupStringValue("SoneFollowingTimes/0/Sone", "Sone1")
74                 setupLongValue("SoneFollowingTimes/0/Time", 1000L)
75                 setupStringValue("SoneFollowingTimes/1/Sone", "Sone2")
76                 setupLongValue("SoneFollowingTimes/1/Time", 2000L)
77                 setupStringValue("SoneFollowingTimes/2/Sone")
78                 assertThat(configurationLoader.getSoneFollowingTime("Sone1"), equalTo(1000L))
79                 assertThat(configurationLoader.getSoneFollowingTime("Sone2"), equalTo(2000L))
80                 assertThat(configurationLoader.getSoneFollowingTime("Sone3"), nullValue())
81         }
82
83         @Test
84         fun `loader can overwrite existing Sone following time`() {
85                 val sone1Id = setupStringValue("SoneFollowingTimes/0/Sone", "Sone1")
86                 val sone1Time = setupLongValue("SoneFollowingTimes/0/Time", 1000L)
87                 val sone2Id = setupStringValue("SoneFollowingTimes/1/Sone", "Sone2")
88                 val sone2Time = setupLongValue("SoneFollowingTimes/1/Time", 2000L)
89                 setupStringValue("SoneFollowingTimes/2/Sone")
90                 configurationLoader.setSoneFollowingTime("Sone1", 3000L)
91                 assertThat(listOf(sone1Id.value to sone1Time.value, sone2Id.value to sone2Time.value), containsInAnyOrder<Pair<String?, Long?>>(
92                                 "Sone1" to 3000L,
93                                 "Sone2" to 2000L
94                 ))
95         }
96
97         @Test
98         fun `loader can remove Sone following time`() {
99                 val sone1Id = setupStringValue("SoneFollowingTimes/0/Sone", "Sone1")
100                 val sone1Time = setupLongValue("SoneFollowingTimes/0/Time", 1000L)
101                 val sone2Id = setupStringValue("SoneFollowingTimes/1/Sone", "Sone2")
102                 val sone2Time = setupLongValue("SoneFollowingTimes/1/Time", 2000L)
103                 setupStringValue("SoneFollowingTimes/2/Sone")
104                 configurationLoader.removeSoneFollowingTime("Sone1")
105                 assertThat(sone1Id.value, equalTo("Sone2"))
106                 assertThat(sone1Time.value, equalTo(2000L))
107                 assertThat(sone2Id.value, nullValue())
108         }
109
110         @Test
111         fun `sone with missing following time is not loaded`() {
112                 setupStringValue("SoneFollowingTimes/0/Sone", "Sone1")
113                 setupLongValue("SoneFollowingTimes/0/Time", 1000L)
114                 setupStringValue("SoneFollowingTimes/1/Sone", "Sone2")
115                 setupLongValue("SoneFollowingTimes/1/Time")
116                 setupStringValue("SoneFollowingTimes/2/Sone")
117                 assertThat(configurationLoader.getSoneFollowingTime("Sone1"), equalTo(1000L))
118                 assertThat(configurationLoader.getSoneFollowingTime("Sone2"), nullValue())
119                 assertThat(configurationLoader.getSoneFollowingTime("Sone3"), nullValue())
120         }
121
122 }