1   package com.atlassian.user.impl.delegation;
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.search.page.DefaultPager;
8   import com.atlassian.user.search.page.Pager;
9   import com.atlassian.user.search.page.PagerFactory;
10  import com.atlassian.user.search.page.PagerUtils;
11  import com.mockobjects.dynamic.C;
12  import com.mockobjects.dynamic.Mock;
13  import junit.framework.TestCase;
14  
15  import java.util.ArrayList;
16  import java.util.Arrays;
17  import java.util.List;
18  
19  public class TestDelegatingUserManager extends TestCase
20  {
21      private DelegatingUserManager delegatingUserManager;
22      private Mock mockLeftUserManager;
23      private Mock mockRightUserManager;
24  
25      public void setUp() throws Exception
26      {
27          super.setUp();
28          mockLeftUserManager = new Mock(UserManager.class);
29          mockRightUserManager = new Mock(UserManager.class);
30  
31          delegatingUserManager = new DelegatingUserManager(Arrays.asList(
32              (UserManager) mockLeftUserManager.proxy(), (UserManager) mockRightUserManager.proxy()));
33      }
34  
35      public void testGetUser() throws EntityException
36      {
37          User user = new DefaultUser("testUser");
38  
39          mockLeftUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), null);
40          mockRightUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), user);
41  
42          assertEquals("delegatingUserManager is not delegating calls for getUser(..) correctly",
43              user, delegatingUserManager.getUser("testUser"));
44      }
45  
46      public void testGetUserNames() throws EntityException
47      {
48          ArrayList<String> userList1 = new ArrayList<String>();
49          ArrayList<String> userList2 = new ArrayList<String>();
50  
51          userList1.add("user1");
52          userList1.add("user2");
53          userList1.add("user3");
54  
55          userList2.add("user4");
56          userList2.add("user5");
57          userList2.add("user6");
58  
59          Pager<String> pager1 = new DefaultPager<String>(userList1);
60          Pager<String> pager2 = new DefaultPager<String>(userList2);
61  
62          mockLeftUserManager.expectAndReturn("getUserNames", new DefaultPager<String>(userList1));
63          mockRightUserManager.expectAndReturn("getUserNames", new DefaultPager<String>(userList2));
64  
65          assertPagingIteratorsEqual(
66              "delegatingUserManager is not delegating (and combining) calls for getUsers() correctly",
67              PagerFactory.getPager(pager1, pager2), delegatingUserManager.getUserNames());
68      }
69  
70      private static <T> void assertPagingIteratorsEqual(String message, Pager<T> iterator1, Pager<T> iterator2)
71      {
72          List<T> list1 = PagerUtils.toList(iterator1);
73          List<T> list2 = PagerUtils.toList(iterator2);
74  
75          assertEquals(message, list1, list2);
76      }
77  
78  
79      public void testCreateUserUsingMocks() throws EntityException
80      {
81          User user = new DefaultUser("testUser");
82  
83          mockLeftUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), null);
84          mockRightUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), null);
85          mockLeftUserManager.expectAndReturn("isCreative", true);
86          mockLeftUserManager.expectAndReturn("createUser", C.args(C.eq("testUser")), user);
87  
88          assertEquals("delegatingUserManager is not delegating call for createUser(..) to creatingUserManager",
89              user, delegatingUserManager.createUser("testUser"));
90  
91          mockLeftUserManager.verify();
92          mockRightUserManager.verify();
93      }
94  
95      public void testRemoveUserUsingMocks()
96      {
97          User user = new DefaultUser("testUser");
98  
99          mockLeftUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), null);
100         mockRightUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), user);
101         mockRightUserManager.expect("removeUser", C.args(C.eq(user)));
102 
103         try
104         {
105             delegatingUserManager.removeUser(user);
106         }
107         catch (Exception e)
108         {
109             e.printStackTrace();
110             fail("delegatingUserManager is not delegating call for removeUser(..) to otherUserManager");
111         }
112 
113         mockLeftUserManager.verify();
114         mockRightUserManager.verify();
115     }
116 
117     public void testSaveUserUsingMocks()
118     {
119         User user = new DefaultUser("testUser");
120 
121         mockLeftUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), null);
122         mockRightUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), user);
123         mockRightUserManager.expect("saveUser", C.args(C.eq(user)));
124 
125         try
126         {
127             delegatingUserManager.saveUser(user);
128         }
129         catch (Exception e)
130         {
131             fail("delegatingUserManager is not delegating call for saveUser(..) to otherUserManager");
132         }
133 
134         mockLeftUserManager.verify();
135         mockRightUserManager.verify();
136 
137     }
138 
139 
140     public void testGetConfigurationForUser()
141     {
142         User user = new DefaultUser("testUser");
143 
144         mockLeftUserManager.expectAndReturn("getRepository", user, null);
145         mockRightUserManager.expect("getRepository", user);
146 
147         try
148         {
149             delegatingUserManager.getRepository(user);
150         }
151         catch (Exception e)
152         {
153             fail("delegatingUserManager is not delegating call for getIdentifier(..) to otherUserManager");
154         }
155 
156         mockLeftUserManager.verify();
157         mockRightUserManager.verify();
158     }
159 
160     public void testIsWriteable() throws EntityException
161     {
162         User user = new DefaultUser("testUser");
163 
164         mockLeftUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), null);
165         mockRightUserManager.expectAndReturn("getUser", C.args(C.eq("testUser")), user);
166         mockRightUserManager.expectAndReturn("isReadOnly", C.args(C.eq(user)), true);
167 
168         assertTrue("delegatingUserManager is not delegating call for saveUser(..) to otherUserManager",
169             delegatingUserManager.isReadOnly(user));
170 
171         mockLeftUserManager.verify();
172         mockRightUserManager.verify();
173     }
174 
175     public void testIsCreating()
176     {
177         mockLeftUserManager.expectAndReturn("isCreative", true);
178 
179         assertTrue("delegatingUserManager is not calling isReadOnly() on the creatingUserManager when handling this" +
180             "behaviour", delegatingUserManager.isCreative());
181     }
182 }