🔀 Merge “release/v81” into “master”
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / freenet / wot / PluginWebOfTrustConnectorTest.kt
1 package net.pterodactylus.sone.freenet.wot
2
3 import freenet.support.*
4 import freenet.support.api.*
5 import net.pterodactylus.sone.freenet.*
6 import net.pterodactylus.sone.freenet.plugin.*
7 import net.pterodactylus.sone.test.*
8 import org.hamcrest.*
9 import org.hamcrest.MatcherAssert.*
10 import org.hamcrest.Matchers.*
11 import org.hamcrest.core.*
12 import kotlin.test.*
13
14 /**
15  * Unit test for [PluginWebOfTrustConnector].
16  */
17 class PluginWebOfTrustConnectorTest {
18
19         private val ownIdentity = DefaultOwnIdentity("id", "nickname", "requestUri", "insertUri")
20
21         @Test
22         fun `wot plugin can be pinged`() {
23                 createPluginConnector("Ping")
24                                 .connect { ping() }
25         }
26
27         @Test
28         fun `own identities are returned correctly`() {
29                 val ownIdentities = createPluginConnector("GetOwnIdentities") {
30                         put("Identity0", "id-0")
31                         put("RequestURI0", "request-uri-0")
32                         put("InsertURI0", "insert-uri-0")
33                         put("Nickname0", "nickname-0")
34                         put("Contexts0.Context0", "id-0-context-0")
35                         put("Properties0.Property0.Name", "id-0-property-0-name")
36                         put("Properties0.Property0.Value", "id-0-property-0-value")
37                         put("Identity1", "id-1")
38                         put("RequestURI1", "request-uri-1")
39                         put("InsertURI1", "insert-uri-1")
40                         put("Nickname1", "nickname-1")
41                         put("Contexts1.Context0", "id-1-context-0")
42                         put("Properties1.Property0.Name", "id-1-property-0-name")
43                         put("Properties1.Property0.Value", "id-1-property-0-value")
44                 }.connect { loadAllOwnIdentities() }
45                 assertThat(ownIdentities, containsInAnyOrder(
46                                 isOwnIdentity("id-0", "nickname-0", "request-uri-0", "insert-uri-0", contains("id-0-context-0"), hasEntry("id-0-property-0-name", "id-0-property-0-value")),
47                                 isOwnIdentity("id-1", "nickname-1", "request-uri-1", "insert-uri-1", contains("id-1-context-0"), hasEntry("id-1-property-0-name", "id-1-property-0-value"))
48                 ))
49         }
50
51         @Test
52         fun `trusted identities are requested with correct own identity`() {
53                 createPluginConnector("GetIdentitiesByScore", hasField("Truster", equalTo("id")))
54                                 .connect { loadTrustedIdentities(ownIdentity) }
55         }
56
57         @Test
58         fun `trusted identities are requested with correct selection parameter`() {
59                 createPluginConnector("GetIdentitiesByScore", hasField("Selection", equalTo("+")))
60                                 .connect { loadTrustedIdentities(ownIdentity) }
61         }
62
63         @Test
64         fun `trusted identities are requested with empty context if null context requested`() {
65                 createPluginConnector("GetIdentitiesByScore", hasField("Context", equalTo("")))
66                                 .connect { loadTrustedIdentities(ownIdentity) }
67         }
68
69         @Test
70         fun `trusted identities are requested with context if context requested`() {
71                 createPluginConnector("GetIdentitiesByScore", hasField("Context", equalTo("TestContext")))
72                                 .connect { loadTrustedIdentities(ownIdentity, "TestContext") }
73         }
74
75         @Test
76         fun `trusted identities are requested with trust values`() {
77                 createPluginConnector("GetIdentitiesByScore", hasField("WantTrustValues", equalTo("true")))
78                                 .connect { loadTrustedIdentities(ownIdentity) }
79         }
80
81         @Test
82         fun `empty list of trusted identities is returned correctly`() {
83                 val trustedIdentities = createPluginConnector("GetIdentitiesByScore")
84                                 .connect { loadTrustedIdentities(ownIdentity) }
85                 assertThat(trustedIdentities, empty())
86         }
87
88         @Test
89         fun `trusted identities without context, properties, or trust value are returned correctly`() {
90                 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
91                         put("Identity0", "id0")
92                         put("Nickname0", "nickname0")
93                         put("RequestURI0", "request-uri0")
94                         put("Identity1", "id1")
95                         put("Nickname1", "nickname1")
96                         put("RequestURI1", "request-uri1")
97                 }.connect { loadTrustedIdentities(ownIdentity) }
98                 assertThat(trustedIdentities, contains(
99                                 allOf(
100                                                 isIdentity("id0", "nickname0", "request-uri0", empty<String>(), isEmptyMap()),
101                                                 isTrusted(ownIdentity, isTrust(null, null, null))
102                                 ),
103                                 allOf(
104                                                 isIdentity("id1", "nickname1", "request-uri1", empty<String>(), isEmptyMap()),
105                                                 isTrusted(ownIdentity, isTrust(null, null, null))
106                                 )
107                 ))
108         }
109
110         @Test
111         fun `trusted identity without nickname is returned correctly`() {
112                 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
113                         put("Identity0", "id0")
114                         put("RequestURI0", "request-uri0")
115                 }.connect { loadTrustedIdentities(ownIdentity) }
116                 assertThat(trustedIdentities, contains(
117                                 allOf(
118                                                 isIdentity("id0", null, "request-uri0", empty<String>(), isEmptyMap()),
119                                                 isTrusted(ownIdentity, isTrust(null, null, null))
120                                 )
121                 ))
122         }
123
124         @Test
125         fun `trusted identity with contexts is returned correctly`() {
126                 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
127                         put("Identity0", "id0")
128                         put("Nickname0", "nickname0")
129                         put("RequestURI0", "request-uri0")
130                         put("Contexts0.Context0", "Context0")
131                         put("Contexts0.Context1", "Context1")
132                 }.connect { loadTrustedIdentities(ownIdentity) }
133                 assertThat(trustedIdentities, contains(
134                                 isIdentity("id0", "nickname0", "request-uri0", containsInAnyOrder("Context0", "Context1"), isEmptyMap())
135                 ))
136         }
137
138         @Test
139         fun `trusted identity with properties is returned correctly`() {
140                 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
141                         put("Identity0", "id0")
142                         put("Nickname0", "nickname0")
143                         put("RequestURI0", "request-uri0")
144                         put("Properties0.Property0.Name", "foo")
145                         put("Properties0.Property0.Value", "bar")
146                         put("Properties0.Property1.Name", "baz")
147                         put("Properties0.Property1.Value", "quo")
148                 }.connect { loadTrustedIdentities(ownIdentity) }
149                 assertThat(trustedIdentities, contains(
150                                 isIdentity("id0", "nickname0", "request-uri0", empty(), allOf(hasEntry("foo", "bar"), hasEntry("baz", "quo")))
151                 ))
152         }
153
154         @Test
155         fun `trusted identity with trust value is returned correctly`() {
156                 val trustedIdentities = createPluginConnector("GetIdentitiesByScore") {
157                         put("Identity0", "id0")
158                         put("Nickname0", "nickname0")
159                         put("RequestURI0", "request-uri0")
160                         put("Trust0", "12")
161                         put("Score0", "34")
162                         put("Rank0", "56")
163                 }.connect { loadTrustedIdentities(ownIdentity) }
164                 assertThat(trustedIdentities, contains(
165                                 allOf(
166                                                 isIdentity("id0", "nickname0", "request-uri0", empty(), isEmptyMap()),
167                                                 isTrusted(ownIdentity, isTrust(12, 34, 56))
168                                 )
169                 ))
170         }
171
172         @Test
173         fun `adding a context sends the correct own identity id`() {
174                 createPluginConnector("AddContext", hasField("Identity", equalTo(ownIdentity.id)))
175                                 .connect { addContext(ownIdentity, "TestContext") }
176         }
177
178         @Test
179         fun `adding a context sends the correct context`() {
180                 createPluginConnector("AddContext", hasField("Context", equalTo("TestContext")))
181                                 .connect { addContext(ownIdentity, "TestContext") }
182         }
183
184         @Test
185         fun `removing a context sends the correct own identity id`() {
186                 createPluginConnector("RemoveContext", hasField("Identity", equalTo(ownIdentity.id)))
187                                 .connect { removeContext(ownIdentity, "TestContext") }
188         }
189
190         @Test
191         fun `removing a context sends the correct context`() {
192                 createPluginConnector("RemoveContext", hasField("Context", equalTo("TestContext")))
193                                 .connect { removeContext(ownIdentity, "TestContext") }
194         }
195
196         @Test
197         fun `setting a property sends the correct identity id`() {
198                 createPluginConnector("SetProperty", hasField("Identity", equalTo(ownIdentity.id)))
199                                 .connect { setProperty(ownIdentity, "TestProperty", "TestValue") }
200         }
201
202         @Test
203         fun `setting a property sends the correct property name`() {
204                 createPluginConnector("SetProperty", hasField("Property", equalTo("TestProperty")))
205                                 .connect { setProperty(ownIdentity, "TestProperty", "TestValue") }
206         }
207
208         @Test
209         fun `setting a property sends the correct property value`() {
210                 createPluginConnector("SetProperty", hasField("Value", equalTo("TestValue")))
211                                 .connect { setProperty(ownIdentity, "TestProperty", "TestValue") }
212         }
213
214         @Test
215         fun `removing a property sends the correct identity id`() {
216                 createPluginConnector("RemoveProperty", hasField("Identity", equalTo(ownIdentity.id)))
217                                 .connect { removeProperty(ownIdentity, "TestProperty") }
218         }
219
220         @Test
221         fun `removing a property sends the correct property name`() {
222                 createPluginConnector("RemoveProperty", hasField("Property", equalTo("TestProperty")))
223                                 .connect { removeProperty(ownIdentity, "TestProperty") }
224         }
225
226 }
227
228 private fun <R> PluginConnector.connect(block: PluginWebOfTrustConnector.() -> R) =
229                 PluginWebOfTrustConnector(this).let(block)
230
231 fun createPluginConnector(message: String, fieldsMatcher: Matcher<SimpleFieldSet> = IsAnything<SimpleFieldSet>(), build: SimpleFieldSetBuilder.() -> Unit = {}) =
232                 object : PluginConnector {
233                         override suspend fun sendRequest(pluginName: String, fields: SimpleFieldSet, data: Bucket?) =
234                                         if ((pluginName != wotPluginName) || (fields.get("Message") != message)) {
235                                                 throw PluginException()
236                                         } else {
237                                                 assertThat(fields, fieldsMatcher)
238                                                 PluginReply(SimpleFieldSetBuilder().apply(build).get(), null)
239                                         }
240                 }
241
242 private const val wotPluginName = "plugins.WebOfTrust.WebOfTrust"