1 package net.pterodactylus.sone.database.memory
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
15 * Unit test for [ConfigurationLoader].
17 class ConfigurationLoaderTest {
19 private val configuration = mock<Configuration>()
20 private val configurationLoader = ConfigurationLoader(configuration)
22 private fun setupStringValue(attribute: String, value: String? = null): Value<String?> =
24 whenever(configuration.getStringValue(attribute)).thenReturn(this)
27 private fun setupLongValue(attribute: String, value: Long? = null): Value<Long?> =
29 whenever(configuration.getLongValue(attribute)).thenReturn(this)
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"))
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"))
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"))
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())
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())
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?>>(
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())
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())