1   package com.atlassian.user.impl.hibernate;
2   
3   import com.atlassian.user.*;
4   import com.atlassian.user.generic.AbstractSpringTest;
5   import com.atlassian.user.impl.DefaultUser;
6   
7   import java.util.Iterator;
8   
9   /**
10   * Ensures methods don't throw LazyInitializationException when dealing with groups that
11   * have come from another Hibernate session (i.e. they were cached or stored in the HTTP session
12   * or something).
13   */
14  public class TestHibernateGroupManagerHandlesDetachedGroups extends AbstractSpringTest
15  {
16      protected ExternalEntityDAO externalEntityDao;
17      protected HibernateUserManager hibernateUserManager;
18      protected HibernateGroupManager hibernateGroupManager;
19  
20      protected UserManager getUserManager()
21      {
22          return hibernateUserManager;
23      }
24  
25      protected GroupManager getGroupManager()
26      {
27          return hibernateGroupManager;
28      }
29  
30      public void setExternalEntityDao(ExternalEntityDAO externalEntityDao)
31      {
32          this.externalEntityDao = externalEntityDao;
33      }
34  
35      public void setHibernateUserManager(HibernateUserManager hibernateUserManager)
36      {
37          this.hibernateUserManager = hibernateUserManager;
38      }
39  
40      public void setHibernateGroupManager(HibernateGroupManager hibernateGroupManager)
41      {
42          this.hibernateGroupManager = hibernateGroupManager;
43      }
44  
45      protected String[] getConfigLocations()
46      {
47          return new String[]{
48              "classpath:com/atlassian/user/impl/hibernate/hibernateTestContext.xml",
49              "classpath:com/atlassian/user/dataSourceTestContext.xml",
50          };
51      }
52  
53      private DefaultHibernateGroup persistentGroup;
54      private User localUser;
55      private User externalUser;
56  
57      protected void onSetUp() throws Exception
58      {
59          super.onSetUp();
60          // first transaction is started be the super.onSetup call
61          Group group = getGroupManager().createGroup("group");
62          localUser = getUserManager().createUser("localUser");
63          externalUser = new DefaultUser("externalUser");
64          getGroupManager().addMembership(group, localUser);
65          getGroupManager().addMembership(group, externalUser);
66          setComplete();
67          endTransaction();
68  
69          // second transaction -- get the group from the database, but without loading the membership collections
70          startNewTransaction();
71          persistentGroup = (DefaultHibernateGroup) getGroupManager().getGroup("group");
72          setComplete();
73          endTransaction();
74  
75          // third transaction (used in tests) -- access lazy-loaded membership collections in persistent, now-detached group
76          startNewTransaction();
77      }
78  
79      protected void onTearDown() throws Exception
80      {
81          deleteUsersAndGroups();
82          super.onTearDown();
83          deleteUsersAndGroups();
84      }
85  
86      protected void deleteUsersAndGroups() throws EntityException
87      {
88          for (Iterator i = getGroupManager().getGroups().iterator(); i.hasNext();)
89          {
90              Group group = (Group) i.next();
91              getGroupManager().removeGroup(group);
92          }
93          for (Iterator i = getUserManager().getUsers().iterator(); i.hasNext();)
94          {
95              User user = (User) i.next();
96              getUserManager().removeUser(user);
97          }
98          externalEntityDao.removeExternalEntity("externalUser");
99      }
100 
101     public void testMembershipCollectionsAreNotInitialised() throws Exception
102     {
103         assertEquals(net.sf.hibernate.collection.Set.class, persistentGroup.getLocalMembers().getClass());
104         assertFalse(((net.sf.hibernate.collection.Set) persistentGroup.getLocalMembers()).wasInitialized());
105         assertEquals(net.sf.hibernate.collection.Set.class, persistentGroup.getExternalMembers().getClass());
106         assertFalse(((net.sf.hibernate.collection.Set) persistentGroup.getExternalMembers()).wasInitialized());
107     }
108 
109     public void testHasExternalMembership() throws Exception
110     {
111         assertTrue(getGroupManager().hasMembership(persistentGroup, externalUser));
112     }
113 
114     public void testHasLocalMembership() throws Exception
115     {
116         assertTrue(getGroupManager().hasMembership(persistentGroup, localUser));
117     }
118 
119     public void testAddExternalMembership() throws Exception
120     {
121         User anotherExternalUser = new DefaultUser("anotherExternalUser");
122         getGroupManager().addMembership(persistentGroup, anotherExternalUser);
123         assertTrue(getGroupManager().hasMembership(persistentGroup, anotherExternalUser));
124     }
125 
126     public void testAddLocalMembership() throws Exception
127     {
128         User anotherLocalUser = getUserManager().createUser("anotherLocalUser");
129         getGroupManager().addMembership(persistentGroup, anotherLocalUser);
130         assertTrue(getGroupManager().hasMembership(persistentGroup, anotherLocalUser));
131     }
132 
133     public void testRemoveExternalMembership() throws Exception
134     {
135         getGroupManager().removeMembership(persistentGroup, externalUser);
136         assertFalse(getGroupManager().hasMembership(persistentGroup, externalUser));
137     }
138 
139     public void testRemoveLocalMembership() throws Exception
140     {
141         getGroupManager().removeMembership(persistentGroup, localUser);
142         assertFalse(getGroupManager().hasMembership(persistentGroup, localUser));
143     }
144 }