/**
* @Created Sep 10, 2010 1:08:31 PM
* @author r39
*/
package com.philip.journal.core.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Date;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.philip.journal.common.DateUtils;
import com.philip.journal.core.JournalTestCommon;
import com.philip.journal.core.bean.User;
import com.philip.journal.core.exception.JournalException;
/**
* Test class for UserDAO.
*
* @see com.philip.journal.common.DateUtils. This is required by this test class.
*/
public class UserDAOImplTest extends BaseJournalTestDAO {
/** IOC wired User DAO. */
@Autowired
private transient UserDAO userDAO;
/** Test time out and persist maximum allowed time in milliseconds. */
static final int TIMEOUT = 1000;
/** Test artifact. Non existent username. */
private static final String TEST_X_USERNAME = "%!@#%%%!@#";
/**
* Case 1: Username found.
*
* Test method for {@link com.philip.journal.core.dao.UserDAOImpl#readByUsername(java.lang.String)}.
*/
@Test
public void testReadByUsernameCase1()
{
final User user = userDAO.readByUsername(JournalTestCommon.TEST_USERNAME);
assertNotNull("Case 1: Username found.", user);
}
/** Case 2: Username not found. */
@Test
public void testReadByUsernameCase2()
{
final User notUser = userDAO.readByUsername(TEST_X_USERNAME);
assertNull("Case 2: Username not found.", notUser);
}
/** Case 3: Null username. */
@Test
public void testReadByUsernameCase3()
{
final User notUser = userDAO.readByUsername(null);
assertNull("Case 3: Null username.", notUser);
}
/**
* Case 1(N): Null user.
*
* Test method for {@link com.philip.journal.core.dao.UserDAOImpl#save(com.philip.journal.core.bean.User)} .
*/
@Test(timeout = TIMEOUT, expected = JournalException.class)
public void testSaveUserCase1()
{
userDAO.save(null);
}
/**
* Case 2: Normal flow. Existing User. Existing instance must be updated.
* <ol>
* <li>Case 2.1: Correct date set.
* <li>Case 2.2: Correct time set.
* </ol>
*/
@Test(timeout = TIMEOUT)
public void testSaveUserCase2()
{
final User user = userDAO.readByUsername(JournalTestCommon.TEST_USERNAME);
final String genId = getCommon().generateUniqueId();
user.setChecksum(genId);
user.setPassword(genId);
user.setUpdater(user);
userDAO.save(user);
final Date now = new Date();
final long dateDelta = DateUtils.getInstance().getDayDifference(now, user.getUpdateDate());
final long timeDelta = DateUtils.getInstance().getTimeDifference(now, user.getUpdateDate());
assertEquals("Case 2.1: Correct date set." + dateDelta, 0, dateDelta);
assertTrue("Case 2.2: Correct time set.", timeDelta < TIMEOUT);
}
/**
* Case 3: Normal flow. Existing User. Stored instance must be updated.
* <ol>
* <li>Case 3.1: Password updated.
* <li>Case 3.2: Checksum updated.
* <li>Case 3.3: Updater field was set.
* <li>Case 3.4: Correct date set.
* <li>Case 3.5: Correct time set.
* </ol>
*/
@Test(timeout = TIMEOUT)
public void testSaveUserCase3()
{
final User user = userDAO.readByUsername(JournalTestCommon.TEST_USERNAME);
final String genId = getCommon().generateUniqueId();
user.setChecksum(genId);
user.setPassword(genId);
user.setUpdater(user);
userDAO.save(user);
final Date now = new Date();
final long dateDelta = DateUtils.getInstance().getDayDifference(now, user.getUpdateDate());
final long timeDelta = DateUtils.getInstance().getTimeDifference(now, user.getUpdateDate());
final User newUser = userDAO.readByUsername(JournalTestCommon.TEST_USERNAME);
assertEquals("Case 3.1: Password updated.", genId, newUser.getPassword());
assertEquals("Case 3.2: Checksum updated.", genId, newUser.getChecksum());
assertNotNull("Case 3.3: Updater field was set.", newUser.getUpdater());
assertEquals("Case 3.4: Correct date set." + dateDelta, 0, dateDelta);
assertTrue("Case 3.5: Correct time set.", timeDelta < TIMEOUT);
}
public void setUserDAO(final UserDAO pUserDAO) {
this.userDAO = pUserDAO;
}
@Override
protected Object getTargetDAOImpl() {
return userDAO;
}
}