1 package com.atlassian.user.impl.osuser;
2
3 import com.atlassian.user.EntityException;
4 import com.atlassian.user.User;
5 import com.atlassian.user.UserManager;
6 import com.atlassian.user.generic.AbstractTestUserManager;
7 import com.atlassian.user.generic.JdbcHelper;
8 import com.atlassian.user.impl.osuser.properties.OSUPropertySetFactory;
9 import com.atlassian.user.properties.PropertySetFactory;
10 import com.atlassian.user.security.authentication.Authenticator;
11 import com.opensymphony.module.propertyset.PropertySet;
12 import org.springframework.dao.DataAccessException;
13 import org.springframework.jdbc.core.PreparedStatementCallback;
14
15 import java.sql.PreparedStatement;
16 import java.sql.ResultSet;
17 import java.sql.SQLException;
18 import java.util.Iterator;
19 import java.util.List;
20
21 public class TestOSUserUserManager extends AbstractTestUserManager
22 {
23 private OSUAccessor accessor;
24 private OSUUserManager osuUserManager;
25 private Authenticator osuAuthenticator;
26
27 protected String[] getConfigLocations()
28 {
29 return new String[]{
30 "classpath:com/atlassian/user/impl/osuser/osuserTestContext.xml",
31 "classpath:com/atlassian/user/dataSourceTestContext.xml"
32 };
33 }
34
35 protected UserManager getUserManager()
36 {
37 return osuUserManager;
38 }
39
40 public void setOsuUserManager(OSUUserManager osuUserManager)
41 {
42 this.osuUserManager = osuUserManager;
43 }
44
45 public void setAccessor(OSUAccessor accessor)
46 {
47 this.accessor = accessor;
48 }
49
50 public void setOsuAuthenticator(Authenticator osuAuthenticator)
51 {
52 this.osuAuthenticator = osuAuthenticator;
53 }
54
55 protected void onTearDown() throws Exception
56 {
57
58 deleteUsers();
59 super.onTearDown();
60 deleteUsers();
61
62
63 new JdbcHelper().deleteTable(jdbcTemplate, "OS_PROPERTYENTRY");
64 }
65
66 private void deleteUsers()
67 throws EntityException
68 {
69 for (Iterator i = osuUserManager.getUsers().iterator(); i.hasNext();)
70 {
71 User user = (User) i.next();
72 osuUserManager.removeUser(user);
73 }
74 }
75
76 public void testGetPropertySet() throws Exception
77 {
78 PropertySetFactory propertySetFactory = new OSUPropertySetFactory(accessor.getProfileProvider());
79 User user = getUserManager().createUser("zorro");
80
81 PropertySet propertySet = propertySetFactory.getPropertySet(user);
82 assertNotNull(propertySet);
83
84 getUserManager().removeUser(user);
85 assertNull(propertySetFactory.getPropertySet(user));
86 }
87
88 public void testGetUserReturnsOSUUser() throws EntityException
89 {
90 boolean created = accessor.getCredentialsProvider().create("zorro");
91 assertTrue(created);
92
93 User user = getUserManager().getUser("zorro");
94 assertNotNull(user);
95
96 User osuUser = new OSUUser(new com.opensymphony.user.User("zorro", accessor));
97 assertEquals("The osuserUserManager is not returning users equivalent to the opensymphony osuser construct",
98 user, osuUser);
99 }
100
101 public void testCreateUserCreatesOSUUser() throws EntityException
102 {
103 User userA = getUserManager().createUser("zorro");
104 User userB = new OSUUser(new com.opensymphony.user.User("zorro", accessor));
105 assertEquals("The osuserUserManager is not creating users equivalent to the opensymphony osuser construct",
106 userA, userB);
107 }
108
109
110 public void testNullPasswords() throws Exception
111 {
112 String username = "zorro";
113 User user = getUserManager().createUser(username);
114 assertNotNull(user);
115
116 assertNull(getOSUserPasswordFromJDBC(username));
117
118
119 assertFalse(osuAuthenticator.authenticate("zorro", ""));
120 try
121 {
122 osuAuthenticator.authenticate("zorro", null);
123 fail("Should not be able to authenticate against a null password");
124 }
125 catch (NullPointerException e)
126 {
127
128 }
129
130 User zorroUser = getUserManager().getUser("zorro");
131 assertNotNull(zorroUser);
132
133 getUserManager().alterPassword(zorroUser, "password ");
134 assertFalse(osuAuthenticator.authenticate("zorro", "test"));
135 assertTrue(osuAuthenticator.authenticate("zorro", "password"));
136 assertTrue(osuAuthenticator.authenticate("zorro", "password "));
137 getUserManager().alterPassword(zorroUser, "password");
138 assertTrue(osuAuthenticator.authenticate("zorro", "password"));
139 assertTrue(osuAuthenticator.authenticate("zorro", "password "));
140 assertTrue(osuAuthenticator.authenticate("zorro", " password "));
141 assertFalse(osuAuthenticator.authenticate("zorro", "test"));
142
143 getUserManager().alterPassword(zorroUser, "");
144 try
145 {
146 getUserManager().alterPassword(zorroUser, null);
147 fail("Altering password to null should throw NullPointerException");
148 }
149 catch (NullPointerException e)
150 {
151
152 }
153 }
154
155 private String getOSUserPasswordFromJDBC(final String username) throws Exception
156 {
157 return (String) jdbcTemplate.execute("select passwd from os_user where username = ?", new PreparedStatementCallback()
158 {
159
160 public Object doInPreparedStatement(PreparedStatement preparedStatement) throws SQLException, DataAccessException
161 {
162 preparedStatement.setString(1, username);
163 ResultSet rs = preparedStatement.executeQuery();
164 rs.next();
165 return rs.getString(1);
166 }
167 });
168 }
169
170
171
172
173
174 public void testRemoveOSUserRemovesProperties() throws EntityException
175 {
176 User user = osuUserManager.createUser("user1");
177 user.setFullName("fullname");
178
179
180 JdbcHelper jdbcHelper = new JdbcHelper();
181 List
182 int userCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_USER");
183 int propertyCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_PROPERTYENTRY");
184 assertEquals("creating user should create exactly one entry in OS_USER", 1, userCount);
185 assertEquals("creating user should create exactly one entry in OS_PROPERTYENTRY", 1, propertyCount);
186 assertEquals("creating user should add data to two tables", 2, tables.size());
187 assertTrue("creating user should add data to OS_USER", tables.contains("OS_USER"));
188 assertTrue("creating user should add data to OS_PROPERTYENTRY", tables.contains("OS_PROPERTYENTRY"));
189
190 User retrievedUser = osuUserManager.getUser("user1");
191 osuUserManager.removeUser(retrievedUser);
192 assertNull("removing user should remove it from the user manager", osuUserManager.getUser("user1"));
193 tables = jdbcHelper.getNonEmtpyTables(jdbcTemplate);
194 userCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_USER");
195 propertyCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_PROPERTYENTRY");
196 assertEquals("removing user should remove entry in OS_USER", 0, userCount);
197 assertEquals("removing user should remove entry in OS_PROPERTYENTRY", 0, propertyCount);
198 assertEquals("removing user should remove all data from database", 0, tables.size());
199 }
200
201 }