Started work on componentizing the current user management.
[utils] / security / src / test / java / org / wamblee / usermgt / hibernate / HibernateUserSetTest.java
1 /*
2  * Copyright 2005 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */ 
16
17 package org.wamblee.usermgt.hibernate;
18
19 import java.sql.ResultSet;
20 import java.sql.SQLException;
21 import java.util.Set;
22
23 import javax.sql.DataSource;
24
25 import org.wamblee.cache.Cache;
26 import org.wamblee.general.BeanKernel;
27 import org.wamblee.system.adapters.DefaultContainer;
28 import org.wamblee.system.adapters.ObjectConfiguration;
29 import org.wamblee.system.core.Component;
30 import org.wamblee.system.core.Scope;
31 import org.wamblee.usermgt.Group;
32 import org.wamblee.usermgt.GroupSet;
33 import org.wamblee.usermgt.InMemoryUserSetTest;
34 import org.wamblee.usermgt.User;
35 import org.wamblee.usermgt.UserMgtException;
36 import org.wamblee.usermgt.UserSet;
37 import org.wamblee.usermgt.UsermgtHibernateMappingFiles;
38 import org.wamblee.usermgt.UsermgtSpringConfigFiles;
39
40 /**
41  * Tests for {@link org.wamblee.usermgt.hibernate.HibernateGroupSet} 
42  *
43  * @author Erik Brakkee
44  */
45 public class HibernateUserSetTest extends InMemoryUserSetTest {
46     
47     private static final String USER_TABLE = "USERS";
48     private static final String GROUP_TABLE = "GROUPS"; 
49     
50     private static final String USER_QUERY = "select * from " + USER_TABLE + " where name = ?";
51     private static final String GROUP_QUERY = "select * from " + GROUP_TABLE + " where name = ?"; 
52
53     public HibernateUserSetTest() { 
54         super(UsermgtSpringConfigFiles.class, UsermgtHibernateMappingFiles.class);
55     }
56     
57     private DefaultContainer _container;
58     private Scope _scope;
59     
60     private DataSource _datasource; 
61     
62     /* (non-Javadoc)
63      * @see org.wamblee.usermgt.InMemoryUserSetTest#setUp()
64      */
65     @Override
66     protected void setUp() throws Exception {
67         super.setUp();
68         
69         _container = new DefaultContainer("top");
70         Component ds = new ExternalDatasourceComponent("datasource");
71         _container.addComponent(ds);
72         
73         ObjectConfiguration config = new ObjectConfiguration(HibernateUserSetTest.class); 
74         config.getSetterConfig().clear().add("datasource");
75         _container.addComponent("testcase", this, config);
76         _scope = _container.start();
77         
78         Object my = _scope.getInterfaceImplementation(ds.getProvidedInterfaces()[0], Object.class);
79         
80         clearUserCache();
81     }
82     
83     public void setDatasource(DataSource aDatasource) { 
84         _datasource = aDatasource; 
85     }
86     
87     
88     @Override
89     protected void tearDown() throws Exception {
90         _container.stop(_scope);
91         super.tearDown();
92     }
93
94     /**
95      * Clears the user cache.  
96      */
97     private void clearUserCache() {
98         BeanKernel.getBeanFactory().find("userCache", Cache.class).clear();
99     }
100     
101     /* (non-Javadoc)
102      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupCount(int)
103      */
104     @Override
105     protected void checkUserCount(int aSize) throws SQLException {
106         super.flush();
107         super.checkUserCount(aSize);
108         assertEquals(aSize, getTableSize(USER_TABLE));
109     }
110     
111     /* (non-Javadoc)
112      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupExists(java.lang.String)
113      */
114     @Override
115     protected void checkUserExists(String aUser) throws SQLException {
116         flush(); 
117         ResultSet result = executeQuery(USER_QUERY, aUser);
118         assertEquals(1, countResultSet(result));
119     }
120     
121     /* (non-Javadoc)
122      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupNotExists(java.lang.String)
123      */
124     @Override
125     protected void checkUserNotExists(String aUser) throws SQLException {
126        flush(); 
127        ResultSet result = executeQuery(USER_QUERY, aUser); 
128        assertEquals(0, countResultSet(result));
129     }
130     
131     /* (non-Javadoc)
132      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupCount(int)
133      */
134     @Override
135     protected void checkGroupCount(int aSize) throws SQLException {
136         super.flush(); 
137         assertEquals(aSize, getTableSize(GROUP_TABLE));
138     }
139     
140     /* (non-Javadoc)
141      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupExists(java.lang.String)
142      */
143     @Override
144     protected void checkGroupExists(String aGroup) throws SQLException {
145         flush(); 
146        
147         ResultSet result = executeQuery(GROUP_QUERY, aGroup);
148         assertEquals(1, countResultSet(result));
149     }
150     
151     /* (non-Javadoc)
152      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupNotExists(java.lang.String)
153      */
154     @Override
155     protected void checkGroupNotExists(String aGroup) throws SQLException {
156        flush(); 
157        ResultSet result = executeQuery(GROUP_QUERY, aGroup); 
158        assertEquals(0, countResultSet(result));
159     }
160     
161     /* (non-Javadoc)
162      * @see org.wamblee.usermgt.InMemoryGroupSetTest#createGroupSet()
163      */
164     @Override
165     protected UserSet createUserSet() {
166         return BeanKernel.getBeanFactory().find(UserSet.class); 
167     }
168     
169     /* (non-Javadoc)
170      * @see org.wamblee.usermgt.InMemoryUserSetTest#createGroupSet()
171      */
172     @Override
173     protected GroupSet createGroupSet() {
174         return BeanKernel.getBeanFactory().find(GroupSet.class);
175     }
176
177     /**
178      * Reproduction of a bug. 
179      * Create a user which is in group1
180      * Add it to a second group group2.
181      * Remove the user from group1.
182      * Verify the user is in group2. 
183      */
184     public void testVerifyAddRemove() throws SQLException, UserMgtException {
185         cleanDatabase(); // just to be sure.
186         GroupSet groups = getGroups(); 
187         assertEquals(0, groups.size()); 
188         Group group1 = createGroup("group1");
189         Group group2 = createGroup("group2");
190         groups.add(group1); 
191         groups.add(group2); 
192         checkGroupExists("group1"); 
193         checkGroupExists("group2");
194         
195         User user = createUser("user", PASSWORD, group1);
196         getUsers().add(user);    
197         checkUserExists("user");
198      
199         addUserToGroup(user, group2);
200         getUsers().userModified(user);
201         clearUserCache(); 
202         User user2 = getUsers().find("user");
203         Set<Group> userGroups = user2.getGroups();
204         assertTrue(user2.isInGroup("group1")); 
205         assertTrue(user2.isInGroup("group2"));
206         assertEquals(2, userGroups.size());
207         
208         removeUserFromGroup(user, group1); 
209         getUsers().userModified(user); 
210         clearUserCache(); 
211         user2 = getUsers().find("user"); 
212         userGroups = user2.getGroups();
213         assertFalse(user2.isInGroup("group1")); 
214         assertTrue(user2.isInGroup("group2"));
215         assertEquals(1, userGroups.size());
216     }
217     
218 }