0b8ef045f2f4c05428c31a82d830e7d4758d26d2
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / main / SoneModuleTest.kt
1 package net.pterodactylus.sone.main
2
3 import com.google.common.base.*
4 import com.google.common.eventbus.*
5 import com.google.inject.Guice.*
6 import com.google.inject.name.Names.*
7 import freenet.l10n.*
8 import net.pterodactylus.sone.database.*
9 import net.pterodactylus.sone.database.memory.*
10 import net.pterodactylus.sone.freenet.wot.*
11 import net.pterodactylus.sone.test.*
12 import net.pterodactylus.util.config.*
13 import net.pterodactylus.util.version.Version
14 import org.hamcrest.MatcherAssert.*
15 import org.hamcrest.Matchers.*
16 import java.io.*
17 import java.util.concurrent.atomic.*
18 import kotlin.test.*
19
20 const val versionString = "v80"
21
22 class SoneModuleTest {
23
24         private val currentDir: File = File(".")
25         private val pluginVersion = Version("", 80)
26         private val pluginYear = 2019
27         private val pluginHomepage = "home://page"
28         private val l10n = deepMock<PluginL10n>()
29         private val sonePlugin = mock<SonePlugin>().apply {
30                 whenever(version).thenReturn(versionString)
31                 whenever(year).thenReturn(pluginYear)
32                 whenever(homepage).thenReturn(pluginHomepage)
33                 whenever(l10n()).thenReturn(l10n)
34         }
35
36         private val injector by lazy { createInjector(SoneModule(sonePlugin)) }
37
38         @AfterTest
39         fun removePropertiesFromCurrentDirectory() {
40                 File(currentDir, "sone.properties").delete()
41         }
42
43         @Test
44         fun `creator binds configuration when no file is present`() {
45                 File(currentDir, "sone.properties").delete()
46                 assertThat(injector.getInstance<Configuration>(), notNullValue())
47         }
48
49         @Test
50         fun `creator binds first start to true when no file is present`() {
51                 File(currentDir, "sone.properties").delete()
52                 assertThat(injector.getInstance(named("FirstStart")), equalTo(true))
53         }
54
55         @Test
56         fun `config file is created in current directory if not present`() {
57                 File(currentDir, "sone.properties").delete()
58                 val configuration = injector.getInstance<Configuration>()
59                 configuration.save()
60                 assertThat(File(currentDir, "sone.properties").exists(), equalTo(true))
61         }
62
63         @Test
64         fun `creator binds configuration when file is present`() {
65                 File(currentDir, "sone.properties").writeText("Option=old")
66                 assertThat(injector.getInstance<Configuration>().getStringValue("Option").value, equalTo("old"))
67         }
68
69         @Test
70         fun `creator binds first start to false when file is present`() {
71                 File(currentDir, "sone.properties").writeText("Option=old")
72                 assertThat(injector.getInstance(named("FirstStart")), equalTo(false))
73         }
74
75         @Test
76         fun `invalid config file leads to new config being created`() {
77                 File(currentDir, "sone.properties").writeText("Option=old\nbroken")
78                 val configuration = injector.getInstance<Configuration>()
79                 assertThat(configuration.getStringValue("Option").getValue(null), nullValue())
80         }
81
82         @Test
83         fun `invalid config file leads to new config being set to true`() {
84                 File(currentDir, "sone.properties").writeText("Option=old\nbroken")
85                 assertThat(injector.getInstance(named("NewConfig")), equalTo(true))
86         }
87
88         @Test
89         fun `valid config file leads to new config being set to false`() {
90                 File(currentDir, "sone.properties").writeText("Option=old")
91                 assertThat(injector.getInstance(named("NewConfig")), equalTo(false))
92         }
93
94         @Test
95         fun `event bus is bound`() {
96                 assertThat(injector.getInstance<EventBus>(), notNullValue())
97         }
98
99         @Test
100         fun `context is bound`() {
101                 assertThat(injector.getInstance<Context>().context, equalTo("Sone"))
102         }
103
104         @Test
105         fun `optional context is bound`() {
106                 assertThat(injector.getInstance<Optional<Context>>().get().context, equalTo("Sone"))
107         }
108
109         @Test
110         fun `sone plugin is bound`() {
111                 assertThat(injector.getInstance(), sameInstance(sonePlugin))
112         }
113
114         @Test
115         fun `version is bound`() {
116                 assertThat(injector.getInstance(), equalTo(pluginVersion))
117         }
118
119         @Test
120         fun `plugin version is bound`() {
121                 assertThat(injector.getInstance(), equalTo(PluginVersion(versionString)))
122         }
123
124         @Test
125         fun `plugin year is bound`() {
126                 assertThat(injector.getInstance(), equalTo(PluginYear(pluginYear)))
127         }
128
129         @Test
130         fun `plugin homepage in bound`() {
131                 assertThat(injector.getInstance(), equalTo(PluginHomepage(pluginHomepage)))
132         }
133
134         @Test
135         fun `database is bound correctly`() {
136                 assertThat(injector.getInstance<Database>(), instanceOf(MemoryDatabase::class.java))
137         }
138
139         @Test
140         fun `base l10n is bound correctly`() {
141                 assertThat(injector.getInstance(), sameInstance(l10n.base))
142         }
143
144         @Test
145         fun `default loader is used without dev options`() {
146                 assertThat(injector.getInstance<Loaders>(), instanceOf(DefaultLoaders::class.java))
147         }
148
149         @Test
150         fun `default loaders are used if no path is given`() {
151                 File(currentDir, "sone.properties").writeText("Developer.LoadFromFilesystem=true")
152                 assertThat(injector.getInstance<Loaders>(), instanceOf(DefaultLoaders::class.java))
153         }
154
155         @Test
156         fun `debug loaders are used if path is given`() {
157                 File(currentDir, "sone.properties").writeText("Developer.LoadFromFilesystem=true\nDeveloper.FilesystemPath=/tmp")
158                 assertThat(injector.getInstance<Loaders>(), instanceOf(DebugLoaders::class.java))
159         }
160
161         class TestObject {
162                 val ref: AtomicReference<Any?> = AtomicReference()
163                 @Subscribe
164                 fun testEvent(event: Any?) {
165                         ref.set(event)
166                 }
167         }
168
169         @Test
170         fun `created objects are registered with event bus`() {
171                 val eventBus: EventBus = injector.getInstance()
172                 val testObject = injector.getInstance<TestObject>()
173                 val event = Any()
174                 eventBus.post(event)
175                 assertThat(testObject.ref.get(), sameInstance(event))
176         }
177
178 }