1   package com.atlassian.user.generic;
2   
3   import com.atlassian.user.EntityException;
4   import com.atlassian.user.User;
5   import com.atlassian.user.UserManager;
6   import com.atlassian.user.impl.DefaultUser;
7   import com.atlassian.user.impl.DuplicateEntityException;
8   import com.atlassian.user.search.page.PagerUtils;
9   import com.atlassian.user.security.password.Credential;
10  
11  import java.util.List;
12  
13  /**
14   * Extend this class and implement the {@link #getUserManager} method
15   * to run these test over other implementions.
16   */
17  public abstract class AbstractTestUserManager extends AbstractSpringTest
18  {
19  
20      /**
21       * Override to return a specific implementation for testing
22       */
23      protected abstract UserManager getUserManager();
24  
25      public final void testCreateUser() throws EntityException
26      {
27          UserManager userManager = getUserManager();
28          User user = userManager.createUser("user");
29  
30          assertNotNull(user);
31          assertEquals(user, userManager.getUser("user"));
32          assertEquals("user", user.getName());
33      }
34  
35      public final void testGetUser() throws EntityException
36      {
37          assertNull("user manager should return null for non existent user", getUserManager().getUser("nonexistentUser"));
38      }
39  
40      public final void testGetAllUsers() throws EntityException
41      {
42          UserManager userManager = getUserManager();
43  
44          User[] users = new User[4];
45          for (int i = 0; i < users.length; i++)
46              users[i] = userManager.createUser("user" + i);
47  
48          List retrievedUserNames = PagerUtils.toList(userManager.getUserNames());
49  
50          assertEquals(users.length, retrievedUserNames.size());
51  
52          // order not checked here, just that the user is in the result
53          for (int i = 0; i < users.length; i++)
54          {
55              assertTrue(retrievedUserNames.contains(users[i].getName()));
56          }
57      }
58  
59      public final void testCannotCreateDuplicateUsers() throws EntityException
60      {
61          UserManager userManager = getUserManager();
62  
63          User user = userManager.createUser("user");
64          try
65          {
66              userManager.createUser(user.getName());
67              fail("The usermanager [" + userManager.getClass() + "] is creating identical users.");
68          }
69          catch (DuplicateEntityException expected)
70          {
71          }
72  
73          assertEquals(1, PagerUtils.count(userManager.getUserNames()));
74      }
75  
76      public final void testGetNonExistentUser() throws EntityException
77      {
78          UserManager userManager = getUserManager();
79  
80          assertNull(userManager.getUser("nemo"));
81      }
82  
83      public final void testGetIdenticalUserEachTime() throws EntityException
84      {
85          UserManager userManager = getUserManager();
86  
87          userManager.createUser("user");
88          assertEquals("Users returned by getUser() should be equal",
89              userManager.getUser("user"), userManager.getUser("user"));
90      }
91  
92      public final void testSaveUser() throws EntityException
93      {
94          UserManager userManager = getUserManager();
95  
96          assertTrue(userManager.isCreative());
97  
98          User user = userManager.createUser(new DefaultUser("zorro", "zorro", "zorro@mexican.rebellion.org"), Credential.NONE);
99  
100         User retrievedUser = userManager.getUser("zorro");
101         assertEquals("userManager.saveUser(user) is not recording info: [" + userManager.getRepository(user).toString() + "]",
102             "zorro@mexican.rebellion.org", retrievedUser.getEmail());
103     }
104 
105     public final void testSaveNullUser() throws Exception
106     {
107         try
108         {
109             getUserManager().saveUser(null);
110             fail("Expected IllegalArgumentException trying to save null user");
111         }
112         catch (IllegalArgumentException expected)
113         {
114         }
115     }
116 
117     public final void testUpdateUser() throws Exception
118     {
119         User createdUser = getUserManager().createUser(new DefaultUser("test", "", ""), Credential.NONE);
120 
121         DefaultUser updatedUser = new DefaultUser(createdUser);
122         updatedUser.setFullName("Test User");
123         updatedUser.setEmail("testuser@example.org");
124         getUserManager().saveUser(updatedUser);
125 
126         User foundUser = getUserManager().getUser("test");
127         assertEquals("test", foundUser.getName());
128         assertEquals("Test User", foundUser.getFullName());
129         assertEquals("testuser@example.org", foundUser.getEmail());
130     }
131 
132     public final void testRemoveUser() throws EntityException
133     {
134         UserManager userManager = getUserManager();
135 
136         User user = userManager.createUser("user");
137         assertNotNull(user);
138         userManager.removeUser(user);
139         assertNull(userManager.getUser("user"));
140 
141         try
142         {
143             userManager.removeUser(user);
144             fail("removing unknown user should throw IllegalArgumentException");
145         }
146         catch (IllegalArgumentException e)
147         {
148             // expected
149         }
150     }
151 
152     public final void testCreateUserWithProperties() throws Exception
153     {
154         DefaultUser user = new DefaultUser("user", "testing 1 23", "spamOverload@somewhere");
155 
156         User createdUser = getUserManager().createUser(user, Credential.NONE);
157         assertEquals(user.getName(), createdUser.getName());
158         assertEquals(user.getFullName(), createdUser.getFullName());
159         assertEquals(user.getEmail(), createdUser.getEmail());
160 
161         User retrievedUser = getUserManager().getUser(user.getName());
162         assertEquals(user.getName(), retrievedUser.getName());
163         assertEquals(user.getFullName(), retrievedUser.getFullName());
164         assertEquals(user.getEmail(), retrievedUser.getEmail());
165     }
166 
167     public void testEquals() throws EntityException
168     {
169         UserManager userManager = getUserManager();
170 
171         User user1 = userManager.createUser("user1");
172         User user2 = userManager.createUser("user2");
173 
174         User retrievedUser1 = userManager.getUser("user1");
175 
176         assertEquals(user1, user1);
177         assertEquals(user1, retrievedUser1);
178         assertEquals(retrievedUser1, user1);
179         assertEquals(user2, user2);
180         assertNotSame("The userManager [" + userManager.getClass().getName() + "] is creating identical users instead of distinct users", user1, user2);
181         assertFalse("The userManager [" + userManager.getClass().getName() + "] is creating identical users instead of distinct users", user1.equals(user2));
182     }
183 
184     public void testHashingOnUser() throws EntityException
185     {
186         UserManager userManager = getUserManager();
187 
188         int hash1 = userManager.createUser("user1").hashCode();
189         int hash2 = userManager.getUser("user1").hashCode();
190         int hash3 = userManager.createUser("user2").hashCode();
191 
192         assertEquals("User object's hashcode is incorrect", hash1, hash2);
193         assertFalse("User object's hashcode is incorrect", hash2 == hash3);
194     }
195 
196     public void testChangeFullName() throws EntityException
197     {
198         DefaultUser user = new DefaultUser("user", "original name", "");
199         User createdUser = getUserManager().createUser(user, Credential.NONE);
200 
201         DefaultUser updatedUser = new DefaultUser(createdUser);
202         updatedUser.setFullName("another name");
203         getUserManager().saveUser(updatedUser);
204 
205         User retrievedUser = getUserManager().getUser("user");
206         assertNotNull(retrievedUser);
207         assertEquals("another name", retrievedUser.getFullName());
208     }
209 }