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 * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net)
19 class ConfigurationLoaderTest {
21 private val configuration = mock<Configuration>()
22 private val configurationLoader = ConfigurationLoader(configuration)
24 private fun setupStringValue(attribute: String, value: String? = null): Value<String?> =
26 whenever(configuration.getStringValue(attribute)).thenReturn(this)
29 private fun setupLongValue(attribute: String, value: Long? = null): Value<Long?> =
31 whenever(configuration.getLongValue(attribute)).thenReturn(this)
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"))
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"))
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"))
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())
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())
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?>>(
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())
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())