/*
* Sone - IdentityLoaderTest.java - Copyright © 2013–2019 David Roden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package net.pterodactylus.sone.freenet.wot
import com.google.common.base.Optional.*
import net.pterodactylus.sone.test.*
import org.hamcrest.MatcherAssert.*
import org.hamcrest.Matchers.*
import org.junit.*
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
/**
* Unit test for [IdentityLoader].
*/
class IdentityLoaderTest {
private val webOfTrustConnector = mock()
private val identityLoader = IdentityLoader(webOfTrustConnector, Context("Test"))
private val identityLoaderWithoutContext = IdentityLoader(webOfTrustConnector)
@Before
fun setup() {
val ownIdentities = createOwnIdentities()
whenever(webOfTrustConnector.loadAllOwnIdentities()).thenReturn(ownIdentities.toSet())
whenever(webOfTrustConnector.loadTrustedIdentities(eq(ownIdentities[0]), any())).thenReturn(createTrustedIdentitiesForFirstOwnIdentity())
whenever(webOfTrustConnector.loadTrustedIdentities(eq(ownIdentities[1]), any())).thenReturn(createTrustedIdentitiesForSecondOwnIdentity())
whenever(webOfTrustConnector.loadTrustedIdentities(eq(ownIdentities[2]), any())).thenReturn(createTrustedIdentitiesForThirdOwnIdentity())
whenever(webOfTrustConnector.loadTrustedIdentities(eq(ownIdentities[3]), any())).thenReturn(createTrustedIdentitiesForFourthOwnIdentity())
}
private fun createOwnIdentities() = listOf(
createOwnIdentity("O1", "ON1", "OR1", "OI1", listOf("Test", "Test2"), mapOf("KeyA" to "ValueA", "KeyB" to "ValueB")),
createOwnIdentity("O2", "ON2", "OR2", "OI2", listOf("Test"), mapOf("KeyC" to "ValueC")),
createOwnIdentity("O3", "ON3", "OR3", "OI3", listOf("Test2"), mapOf("KeyE" to "ValueE", "KeyD" to "ValueD")),
createOwnIdentity("O4", "ON4", "OR$", "OI4", listOf("Test"), mapOf("KeyA" to "ValueA", "KeyD" to "ValueD"))
)
private fun createTrustedIdentitiesForFirstOwnIdentity() = setOf(
createIdentity("I11", "IN11", "IR11", listOf("Test"), mapOf("KeyA" to "ValueA"))
)
private fun createTrustedIdentitiesForSecondOwnIdentity() = setOf(
createIdentity("I21", "IN21", "IR21", listOf("Test", "Test2"), mapOf("KeyB" to "ValueB"))
)
private fun createTrustedIdentitiesForThirdOwnIdentity() = setOf(
createIdentity("I31", "IN31", "IR31", listOf("Test", "Test3"), mapOf("KeyC" to "ValueC"))
)
private fun createTrustedIdentitiesForFourthOwnIdentity(): Set = emptySet()
private fun createOwnIdentity(id: String, nickname: String, requestUri: String, insertUri: String, contexts: List, properties: Map): OwnIdentity =
DefaultOwnIdentity(id, nickname, requestUri, insertUri).apply {
setContexts(contexts)
this.properties = properties
}
private fun createIdentity(id: String, nickname: String, requestUri: String, contexts: List, properties: Map): Identity =
DefaultIdentity(id, nickname, requestUri).apply {
setContexts(contexts)
this.properties = properties
}
@Test
fun loadingIdentities() {
val ownIdentities = createOwnIdentities()
val identities = identityLoader.loadIdentities()
verify(webOfTrustConnector).loadAllOwnIdentities()
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[0]), eq("Test"))
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[1]), eq("Test"))
verify(webOfTrustConnector, never()).loadTrustedIdentities(eq(ownIdentities[2]), any())
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[3]), eq("Test"))
assertThat(identities.keys, hasSize(4))
assertThat(identities.keys, containsInAnyOrder(ownIdentities[0], ownIdentities[1], ownIdentities[2], ownIdentities[3]))
verifyIdentitiesForOwnIdentity(identities, ownIdentities[0], createTrustedIdentitiesForFirstOwnIdentity())
verifyIdentitiesForOwnIdentity(identities, ownIdentities[1], createTrustedIdentitiesForSecondOwnIdentity())
verifyIdentitiesForOwnIdentity(identities, ownIdentities[2], emptySet())
verifyIdentitiesForOwnIdentity(identities, ownIdentities[3], createTrustedIdentitiesForFourthOwnIdentity())
}
@Test
fun loadingIdentitiesWithoutContext() {
val ownIdentities = createOwnIdentities()
val identities = identityLoaderWithoutContext.loadIdentities()
verify(webOfTrustConnector).loadAllOwnIdentities()
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[0]), eq(null))
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[1]), eq(null))
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[2]), eq(null))
verify(webOfTrustConnector).loadTrustedIdentities(eq(ownIdentities[3]), eq(null))
assertThat(identities.keys, hasSize(4))
val firstOwnIdentity = ownIdentities[0]
val secondOwnIdentity = ownIdentities[1]
val thirdOwnIdentity = ownIdentities[2]
val fourthOwnIdentity = ownIdentities[3]
assertThat(identities.keys, containsInAnyOrder(firstOwnIdentity, secondOwnIdentity, thirdOwnIdentity, fourthOwnIdentity))
verifyIdentitiesForOwnIdentity(identities, firstOwnIdentity, createTrustedIdentitiesForFirstOwnIdentity())
verifyIdentitiesForOwnIdentity(identities, secondOwnIdentity, createTrustedIdentitiesForSecondOwnIdentity())
verifyIdentitiesForOwnIdentity(identities, thirdOwnIdentity, createTrustedIdentitiesForThirdOwnIdentity())
verifyIdentitiesForOwnIdentity(identities, fourthOwnIdentity, createTrustedIdentitiesForFourthOwnIdentity())
}
private fun verifyIdentitiesForOwnIdentity(identities: Map>, ownIdentity: OwnIdentity, trustedIdentities: Set) {
assertThat(identities[ownIdentity], equalTo>(trustedIdentities))
}
}