1 package net.pterodactylus.sone.core
3 import com.google.common.eventbus.*
4 import net.pterodactylus.sone.core.event.*
5 import net.pterodactylus.sone.fcp.FcpInterface.*
6 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.*
7 import net.pterodactylus.sone.fcp.event.*
8 import net.pterodactylus.sone.test.*
9 import net.pterodactylus.util.config.*
10 import org.hamcrest.MatcherAssert.*
11 import org.hamcrest.Matchers.*
13 import org.mockito.ArgumentMatchers.any
14 import org.mockito.Mockito.atLeastOnce
15 import org.mockito.Mockito.never
16 import org.mockito.Mockito.verify
19 * Unit test for [Preferences].
21 class PreferencesTest {
23 private val eventBus = mock<EventBus>()
24 private val preferences = Preferences(eventBus)
25 private val eventsCaptor = capture<Any>()
28 fun `preferences retain insertion delay`() {
29 preferences.newInsertionDelay = 15
30 assertThat(preferences.insertionDelay, equalTo(15))
34 fun `preferences sends event on setting insertion delay`() {
35 preferences.newInsertionDelay = 15
36 verify(eventBus, atLeastOnce()).post(eventsCaptor.capture())
37 assertThat(eventsCaptor.allValues, hasItem(InsertionDelayChangedEvent(15)))
40 @Test(expected = IllegalArgumentException::class)
41 fun `invalid insertion delay is rejected`() {
42 preferences.newInsertionDelay = -15
46 fun `no event is sent when invalid insertion delay is set`() {
48 preferences.newInsertionDelay = -15
49 } catch (iae: IllegalArgumentException) {
53 verify(eventBus, never()).post(any())
57 fun `preferences return default value when insertion delay is set to null`() {
58 preferences.newInsertionDelay = null
59 assertThat(preferences.insertionDelay, equalTo(60))
63 fun `preferences start with insertion delay default value`() {
64 assertThat(preferences.insertionDelay, equalTo(60))
68 fun `preferences saves null for default insertion delay setting`() {
69 val configuration = Configuration(MapConfigurationBackend())
70 preferences.saveTo(configuration)
71 assertThat(configuration.getIntValue("Option/InsertionDelay").getValue(null), nullValue())
75 fun `preferences retain posts per page`() {
76 preferences.newPostsPerPage = 15
77 assertThat(preferences.postsPerPage, equalTo(15))
80 @Test(expected = IllegalArgumentException::class)
81 fun `invalid posts per page is rejected`() {
82 preferences.newPostsPerPage = -15
86 fun `preferences return default value when posts per page is set to null`() {
87 preferences.newPostsPerPage = null
88 assertThat(preferences.postsPerPage, equalTo(10))
92 fun `preferences start with posts per page default value`() {
93 assertThat(preferences.postsPerPage, equalTo(10))
97 fun `preferences retain images per page`() {
98 preferences.newImagesPerPage = 15
99 assertThat(preferences.imagesPerPage, equalTo(15))
102 @Test(expected = IllegalArgumentException::class)
103 fun `invalid images per page is rejected`() {
104 preferences.newImagesPerPage = -15
108 fun `preferences return default value when images per page is set to null`() {
109 preferences.newImagesPerPage = null
110 assertThat(preferences.imagesPerPage, equalTo(9))
114 fun `preferences start with images per page default value`() {
115 assertThat(preferences.imagesPerPage, equalTo(9))
119 fun `preferences retain characters per post`() {
120 preferences.newCharactersPerPost = 150
121 assertThat(preferences.charactersPerPost, equalTo(150))
124 @Test(expected = IllegalArgumentException::class)
125 fun `invalid characters per post is rejected`() {
126 preferences.newCharactersPerPost = -15
130 fun `preferences return default value when characters per post is set to null`() {
131 preferences.newCharactersPerPost = null
132 assertThat(preferences.charactersPerPost, equalTo(400))
136 fun `preferences start with characters per post default value`() {
137 assertThat(preferences.charactersPerPost, equalTo(400))
141 fun `preferences retain post cut off length`() {
142 preferences.newPostCutOffLength = 150
143 assertThat(preferences.postCutOffLength, equalTo(150))
146 @Test(expected = IllegalArgumentException::class)
147 fun `invalid post cut off length is rejected`() {
148 preferences.newPostCutOffLength = -15
151 @Test(expected = IllegalArgumentException::class)
152 fun `cut off length of minus one is not allowed`() {
153 preferences.newPostCutOffLength = -1
157 fun `preferences return default value when post cut off length is set to null`() {
158 preferences.newPostCutOffLength = null
159 assertThat(preferences.postCutOffLength, equalTo(200))
163 fun `preferences start with post cut off length default value`() {
164 assertThat(preferences.postCutOffLength, equalTo(200))
168 fun `preferences retain require full access of true`() {
169 preferences.newRequireFullAccess = true
170 assertThat(preferences.requireFullAccess, equalTo(true))
174 fun `preferences retain require full access of false`() {
175 preferences.newRequireFullAccess = false
176 assertThat(preferences.requireFullAccess, equalTo(false))
180 fun `preferences return default value when require full access is set to null`() {
181 preferences.newRequireFullAccess = null
182 assertThat(preferences.requireFullAccess, equalTo(false))
186 fun `preferences start with require full access default value`() {
187 assertThat(preferences.requireFullAccess, equalTo(false))
191 fun `preferences retain fcp interface active of true`() {
192 preferences.newFcpInterfaceActive = true
193 assertThat(preferences.fcpInterfaceActive, equalTo(true))
194 verify(eventBus).post(any(FcpInterfaceActivatedEvent::class.java))
198 fun `preferences retain fcp interface active of false`() {
199 preferences.newFcpInterfaceActive = false
200 assertThat(preferences.fcpInterfaceActive, equalTo(false))
201 verify(eventBus).post(any(FcpInterfaceDeactivatedEvent::class.java))
205 fun `preferences return default value when fcp interface active is set to null`() {
206 preferences.newFcpInterfaceActive = null
207 assertThat(preferences.fcpInterfaceActive, equalTo(false))
208 verify(eventBus).post(any(FcpInterfaceDeactivatedEvent::class.java))
212 fun `preferences start with fcp interface active default value`() {
213 assertThat(preferences.fcpInterfaceActive, equalTo(false))
217 fun `preferences retain fcp full access required of no`() {
218 preferences.newFcpFullAccessRequired = NO
219 assertThat(preferences.fcpFullAccessRequired, equalTo(NO))
220 verifyFullAccessRequiredChangedEvent(NO)
223 private fun verifyFullAccessRequiredChangedEvent(
224 fullAccessRequired: FullAccessRequired) {
225 verify(eventBus).post(eventsCaptor.capture())
226 assertThat(eventsCaptor.value, instanceOf(FullAccessRequiredChanged::class.java))
227 assertThat((eventsCaptor.value as FullAccessRequiredChanged).fullAccessRequired,
228 equalTo(fullAccessRequired))
232 fun `preferences retain fcp full access required of writing`() {
233 preferences.newFcpFullAccessRequired = WRITING
234 assertThat(preferences.fcpFullAccessRequired, equalTo(WRITING))
235 verifyFullAccessRequiredChangedEvent(WRITING)
239 fun `preferences retain fcp full access required of always`() {
240 preferences.newFcpFullAccessRequired = ALWAYS
241 assertThat(preferences.fcpFullAccessRequired, equalTo(ALWAYS))
242 verifyFullAccessRequiredChangedEvent(ALWAYS)
246 fun `preferences return default value when fcp full access required is set to null`() {
247 preferences.newFcpFullAccessRequired = null
248 assertThat(preferences.fcpFullAccessRequired, equalTo(ALWAYS))
249 verifyFullAccessRequiredChangedEvent(ALWAYS)
253 fun `preferences start with fcp full access required default value`() {
254 assertThat(preferences.fcpFullAccessRequired, equalTo(ALWAYS))
258 fun `setting insertion delay to valid value sends change event`() {
259 testPreferencesChangedEvent("InsertionDelay", { preferences.newInsertionDelay = it }, 30)
263 fun `setting posts per page to valid value sends change event`() {
264 testPreferencesChangedEvent("PostsPerPage", { preferences.newPostsPerPage = it }, 31)
267 private fun <T : Any> testPreferencesChangedEvent(name: String, setter: (T) -> Unit, value: T) {
269 verify(eventBus, atLeastOnce()).post(eventsCaptor.capture())
270 assertThat(eventsCaptor.allValues, hasItem(PreferenceChangedEvent(name, value)))