Add dependency injection configuration to identity accessor
[Sone.git] / src / test / java / net / pterodactylus / sone / template / IdentityAccessorTest.java
1 package net.pterodactylus.sone.template;
2
3 import static java.util.Arrays.asList;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.Matchers.notNullValue;
6 import static org.hamcrest.Matchers.sameInstance;
7 import static org.mockito.Mockito.mock;
8 import static org.mockito.Mockito.when;
9
10 import java.util.HashSet;
11 import java.util.Set;
12
13 import net.pterodactylus.sone.core.Core;
14 import net.pterodactylus.sone.freenet.wot.Identity;
15 import net.pterodactylus.sone.freenet.wot.IdentityManager;
16 import net.pterodactylus.sone.freenet.wot.OwnIdentity;
17
18 import com.google.inject.Binder;
19 import com.google.inject.Guice;
20 import com.google.inject.Injector;
21 import com.google.inject.Module;
22 import org.hamcrest.Matchers;
23 import org.junit.Before;
24 import org.junit.Test;
25
26 /**
27  * Unit test for {@link IdentityAccessor}.
28  *
29  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
30  */
31 public class IdentityAccessorTest {
32
33         private static final String TEST_ID =
34                         "LrNQbyBBZW-7pHqChtp9lfPA7eXFPW~FLbJ2WrvEx5g";
35         private static final String TEST_ID_WITH_CHANGED_LETTER =
36                         "LrMQbyBBZW-7pHqChtp9lfPA7eXFPW~FLbJ2WrvEx5g";
37         private final Core core = mock(Core.class);
38         private final IdentityAccessor accessor = new IdentityAccessor(core);
39         private final IdentityManager identityManager =
40                         mock(IdentityManager.class);
41         private final OwnIdentity identity = mock(OwnIdentity.class);
42
43         @Before
44         public void setupCore() {
45                 when(core.getIdentityManager()).thenReturn(identityManager);
46         }
47
48         @Before
49         public void setupIdentity() {
50                 setupIdentity(identity, TEST_ID, "Test");
51         }
52
53         private void setupIdentity(Identity identity, String id,
54                         String nickname) {
55                 when(identity.getId()).thenReturn(id);
56                 when(identity.getNickname()).thenReturn(nickname);
57         }
58
59         private void serveIdentities(Set<OwnIdentity> identities) {
60                 when(identityManager.getAllOwnIdentities()).thenReturn(identities);
61         }
62
63         @Test
64         public void accessorReturnsTheCorrectlyAbbreviatedNickname() {
65                 OwnIdentity ownIdentity = mock(OwnIdentity.class);
66                 setupIdentity(ownIdentity, TEST_ID_WITH_CHANGED_LETTER, "Test");
67                 serveIdentities(new HashSet(asList(identity, ownIdentity)));
68                 assertThat(accessor.get(null, identity, "uniqueNickname"),
69                                 Matchers.<Object>is("Test@LrN"));
70         }
71
72         @Test
73         public void accessorComparesTheFullLengthIfNecessary() {
74                 OwnIdentity ownIdentity = mock(OwnIdentity.class);
75                 setupIdentity(ownIdentity, TEST_ID, "Test");
76                 serveIdentities(new HashSet(asList(identity, ownIdentity)));
77                 assertThat(accessor.get(null, identity, "uniqueNickname"),
78                                 Matchers.<Object>is("Test@" + TEST_ID));
79         }
80
81         @Test
82         public void reflectionAccessorIsUsedForOtherMembers() {
83                 assertThat(accessor.get(null, identity, "hashCode"),
84                                 Matchers.<Object>is(identity.hashCode()));
85         }
86
87         @Test
88         public void accessorCanBeCreatedByGuice() {
89                 Injector injector = Guice.createInjector(
90                                 new Module() {
91                                         @Override
92                                         public void configure(Binder binder) {
93                                                 binder.bind(Core.class).toInstance(mock(Core.class));
94                                         }
95                                 }
96                 );
97                 assertThat(injector.getInstance(IdentityAccessor.class), notNullValue());
98         }
99
100         @Test
101         public void accessorIsCreatedAsSingleton() {
102                 Injector injector = Guice.createInjector(
103                                 new Module() {
104                                         @Override
105                                         public void configure(Binder binder) {
106                                                 binder.bind(Core.class).toInstance(mock(Core.class));
107                                         }
108                                 }
109                 );
110                 IdentityAccessor firstAccessor = injector.getInstance(IdentityAccessor.class);
111                 IdentityAccessor secondAccessor = injector.getInstance(IdentityAccessor.class);
112                 assertThat(firstAccessor, sameInstance(secondAccessor));
113         }
114
115 }