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