Java tutorial
///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2013 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.user; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.junit.Test; import org.projectforge.test.TestBase; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import de.micromata.hibernate.history.HistoryEntry; import de.micromata.hibernate.history.delta.PropertyDelta; public class UserTest extends TestBase { private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(UserTest.class); private GroupDao groupDao; private TransactionTemplate txTemplate; public void setGroupDao(final GroupDao groupDao) { this.groupDao = groupDao; } public void setTxTemplate(final TransactionTemplate txTemplate) { this.txTemplate = txTemplate; } @Test public void testUserDO() { logon(TEST_ADMIN_USER); final PFUserDO user = userDao.getInternalByName(TEST_ADMIN_USER); assertEquals(user.getUsername(), TEST_ADMIN_USER); final UserGroupCache cache = userDao.getUserGroupCache(); final PFUserDO user1 = getUser("user1"); final String groupnames = cache.getGroupnames(user1.getId()); assertEquals("Groupnames", "group1; group2", groupnames); assertEquals(true, cache.isUserMemberOfGroup(user1.getId(), getGroupId("group1"))); assertEquals(false, cache.isUserMemberOfGroup(user1.getId(), getGroupId("group3"))); final GroupDO group = cache.getGroup(getGroupId("group1")); assertEquals("group1", group.getName()); final PFUserDO admin = getUser(ADMIN); assertEquals("Administrator", true, cache.isUserMemberOfAdminGroup(admin.getId())); assertEquals("Not administrator", false, cache.isUserMemberOfAdminGroup(user1.getId())); } @Test public void testGetUserDisplayname() { final PFUserDO user = new PFUserDO(); user.setUsername("hurzel"); assertEquals("getUserDisplayname", "hurzel", user.getUserDisplayname()); user.setLastname("Reinhard"); assertEquals("getFullname", "Reinhard", user.getFullname()); assertEquals("getUserDisplayname", "Reinhard (hurzel)", user.getUserDisplayname()); user.setFirstname("Kai"); assertEquals("getFullname", "Kai Reinhard", user.getFullname()); assertEquals("getUserDisplayname", "Kai Reinhard (hurzel)", user.getUserDisplayname()); } @Test public void testSaveAndUpdate() { logon(TEST_ADMIN_USER); PFUserDO user = new PFUserDO(); user.setUsername("UserTest"); user.setPassword("Hurzel"); user.setDescription("Description"); final Serializable id = userDao.save(user); user = userDao.getById(id); assertEquals("UserTest", user.getUsername()); assertNull(user.getPassword()); // Not SHA, should be ignored. assertEquals("Description", user.getDescription()); user.setDescription("Description\ntest"); user.setPassword("secret"); userDao.update(user); user = userDao.getById(id); assertEquals("Description\ntest", user.getDescription()); assertNull(user.getPassword()); // Not SHA, should be ignored. user.setPassword("SHA{...}"); userDao.update(user); user = userDao.getById(id); assertEquals("SHA{...}", user.getPassword()); } @Test public void testCopyValues() { final PFUserDO src = new PFUserDO(); src.setPassword("test"); src.setUsername("usertest"); final PFUserDO dest = new PFUserDO(); dest.copyValuesFrom(src); assertNull(dest.getPassword()); assertEquals("usertest", dest.getUsername()); log.error("Last error message about not encrypted password is OK for this test!"); src.setPassword("SHA{9B4DDF20612345C5FC7A9355022E07368CDDF23A}"); dest.copyValuesFrom(src); assertEquals("SHA{9B4DDF20612345C5FC7A9355022E07368CDDF23A}", dest.getPassword()); } @Test public void testPasswordQuality() { assertEquals("Empty password not allowed.", UserDao.MESSAGE_KEY_PASSWORD_QUALITY_CHECK, userDao.checkPasswordQuality(null)); assertEquals("Password with less than 6 characters not allowed.", UserDao.MESSAGE_KEY_PASSWORD_QUALITY_CHECK, userDao.checkPasswordQuality("")); assertEquals("Password with less than 6 characters not allowed.", UserDao.MESSAGE_KEY_PASSWORD_QUALITY_CHECK, userDao.checkPasswordQuality("o2345")); assertEquals("Password must have one non letter at minimum.", UserDao.MESSAGE_KEY_PASSWORD_QUALITY_CHECK, userDao.checkPasswordQuality("ProjectForge")); assertEquals("Password must have one letter at minimum.", UserDao.MESSAGE_KEY_PASSWORD_QUALITY_CHECK, userDao.checkPasswordQuality("123456")); assertEquals("Password must have one letter at minimum.", UserDao.MESSAGE_KEY_PASSWORD_QUALITY_CHECK, userDao.checkPasswordQuality("1234567")); assertNull("Password OK.", userDao.checkPasswordQuality("kjh!id")); assertNull("Password OK.", userDao.checkPasswordQuality("kjh8idsf")); assertNull("Password OK.", userDao.checkPasswordQuality(" 5 g ")); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void history() { logon(TEST_ADMIN_USER); txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { initTestDB.addUser("UserTest.historyUser1a"); initTestDB.addUser("UserTest.historyUser1b"); initTestDB.addUser("UserTest.historyUser2a"); initTestDB.addUser("UserTest.historyUser2b"); initTestDB.addGroup("UserTest.historyGroup1", new String[] { "UserTest.historyUser1a", "UserTest.historyUser1b" }); initTestDB.addGroup("UserTest.historyGroup2", (String[]) null); initTestDB.addGroup("UserTest.historyGroup3", (String[]) null); return null; } }); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { // Checking history entries of user for new group: HistoryEntry[] historyEntries = userDao.getHistoryEntries(getUser("UserTest.historyUser1a")); assertEquals(2, historyEntries.length); // insert and update assignedGroups final HistoryEntry entry = historyEntries[0]; // Update assignedGroups entry assertEquals(1, entry.getDelta().size()); assertEquals("", entry.getDelta().get(0).getOldValue()); assertGroupIds(new String[] { "UserTest.historyGroup1" }, entry.getDelta().get(0).getNewValue()); // Checking history entries of new group: historyEntries = groupDao.getHistoryEntries(getGroup("UserTest.historyGroup1")); assertEquals(1, historyEntries.length); // insert return null; } }); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { // (Un)assigning groups: final PFUserDO user = userDao.internalGetById(getUserId("UserTest.historyUser1a")); final Set<GroupDO> groupsToAssign = new HashSet<GroupDO>(); groupsToAssign.add(getGroup("UserTest.historyGroup2")); groupsToAssign.add(getGroup("UserTest.historyGroup3")); final Set<GroupDO> groupsToUnassign = new HashSet<GroupDO>(); groupsToUnassign.add(getGroup("UserTest.historyGroup1")); groupDao.assignGroups(user, groupsToAssign, groupsToUnassign); return null; } }); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { // Checking history of updated user: HistoryEntry[] historyEntries = userDao.getHistoryEntries(getUser("UserTest.historyUser1a")); assertEquals(3, historyEntries.length); assertUserHistoryEntry(historyEntries[0], new String[] { "UserTest.historyGroup2", "UserTest.historyGroup3" }, new String[] { "UserTest.historyGroup1" }); // Checking history entries of updated groups: historyEntries = groupDao.getHistoryEntries(getGroup("UserTest.historyGroup1")); final GroupDO group = groupDao.internalGetById(getGroupId("UserTest.historyGroup1")); final Set<PFUserDO> users = group.getAssignedUsers(); assertEquals(1, users.size()); // Assigned users are: "UserTest.historyUser1b" assertEquals("2 history entries (1 insert and 1 assigned users", 2, historyEntries.length); // insert and update assignedUsers assertGroupHistoryEntry(historyEntries[0], null, new String[] { "UserTest.historyUser1a" }); return null; } }); } @Test public void testUniqueUsernameDO() { final Serializable[] ids = new Integer[2]; txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { PFUserDO user = createTestUser("42"); ids[0] = userDao.internalSave(user); user = createTestUser("100"); ids[1] = userDao.internalSave(user); return null; } }); txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { final PFUserDO user = createTestUser("42"); assertTrue("Username should already exist.", userDao.doesUsernameAlreadyExist(user)); user.setUsername("5"); assertFalse("Signature should not exist.", userDao.doesUsernameAlreadyExist(user)); userDao.internalSave(user); return null; } }); txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { final PFUserDO dbBook = userDao.internalGetById(ids[1]); final PFUserDO user = new PFUserDO(); user.copyValuesFrom(dbBook); assertFalse("Signature does not exist.", userDao.doesUsernameAlreadyExist(user)); user.setUsername("42"); assertTrue("Signature does already exist.", userDao.doesUsernameAlreadyExist(user)); user.setUsername("4711"); assertFalse("Signature does not exist.", userDao.doesUsernameAlreadyExist(user)); userDao.internalUpdate(user); return null; } }); txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(final TransactionStatus status) { final PFUserDO user = userDao.internalGetById(ids[1]); assertFalse("Signature does not exist.", userDao.doesUsernameAlreadyExist(user)); return null; } }); } private PFUserDO createTestUser(final String username) { final PFUserDO user = new PFUserDO(); user.setUsername(username); return user; } /** * Checks if the history entry contains all and only all expected entries in old and new value. * @param entry * @param expectedAssignedUserNames * @param expectedUnassignedUserNames */ void assertGroupHistoryEntry(final HistoryEntry entry, final String[] expectedAssignedUserNames, final String[] expectedUnassignedUserNames) { final List<PropertyDelta> list = entry.getDelta(); assertEquals(1, list.size()); final PropertyDelta delta = list.get(0); assertUserIds(expectedUnassignedUserNames, delta.getOldValue()); assertUserIds(expectedAssignedUserNames, delta.getNewValue()); } /** * Checks if the history entry contains all and only all expected entries in old and new value. * @param entry * @param expectedAssignedGroupNames * @param expectedUnassignedGroupNames */ void assertUserHistoryEntry(final HistoryEntry entry, final String[] expectedAssignedGroupNames, final String[] expectedUnassignedGroupNames) { final List<PropertyDelta> list = entry.getDelta(); assertEquals(1, list.size()); final PropertyDelta delta = list.get(0); assertGroupIds(expectedUnassignedGroupNames, delta.getOldValue()); assertGroupIds(expectedAssignedGroupNames, delta.getNewValue()); } /** * Convert expectedGroupNames in list of expected group ids: {2,4,7} Asserts that all group ids in groupssString are expected and vice * versa. * @param expectedGroupNames * @param groupsString csv of groups, e. g. {2,4,7} */ void assertGroupIds(final String[] expectedGroupNames, final String groupsString) { if (expectedGroupNames == null) { assertTrue(StringUtils.isEmpty(groupsString)); } final String[] expectedGroups = new String[expectedGroupNames.length]; for (int i = 0; i < expectedGroupNames.length; i++) { expectedGroups[i] = getGroup(expectedGroupNames[i]).getId().toString(); } assertIds(expectedGroups, groupsString); } /** * Convert expectedUserNames in list of expected users ids: {2,4,7} Asserts that all user ids in usersString are expected and vice versa. * @param expectedUserNames * @param groupsString csv of groups, e. g. {2,4,7} */ void assertUserIds(final String[] expectedUserNames, final String usersString) { if (expectedUserNames == null) { assertTrue(StringUtils.isEmpty(usersString)); return; } final String[] expectedUsers = new String[expectedUserNames.length]; for (int i = 0; i < expectedUserNames.length; i++) { expectedUsers[i] = getUser(expectedUserNames[i]).getId().toString(); } assertIds(expectedUsers, usersString); } private void assertIds(final String[] expectedEntries, final String csvString) { final String[] entries = StringUtils.split(csvString, ','); for (final String expected : expectedEntries) { assertTrue("'" + expected + "' expected in: " + ArrayUtils.toString(entries), ArrayUtils.contains(entries, expected)); } for (final String entry : entries) { assertTrue("'" + entry + "' doesn't expected in: " + ArrayUtils.toString(expectedEntries), ArrayUtils.contains(expectedEntries, entry)); } } }