package fr.gael.dhus.database.dao;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.testng.Assert;
import org.testng.annotations.Test;
import fr.gael.dhus.database.dao.interfaces.HibernateDao;
import fr.gael.dhus.database.object.FileScanner;
import fr.gael.dhus.database.object.Preference;
import fr.gael.dhus.database.object.Role;
import fr.gael.dhus.database.object.Search;
import fr.gael.dhus.database.object.User;
import fr.gael.dhus.database.object.restriction.AccessRestriction;
import fr.gael.dhus.database.object.restriction.LockedAccessRestriction;
import fr.gael.dhus.util.CheckIterator;
import fr.gael.dhus.util.TestContextLoader;
/*
* used from spring-test v 3.2.2 (current version on DHuS 3.2.1)
* @WebAppConfiguration
* @ContextHierarchy(
* @ContextConfiguration(locations = "classpath:spring/context-test.xml"))
*/
@ContextConfiguration (locations = "classpath:fr/gael/dhus/spring/context-test.xml", loader = TestContextLoader.class)
@DirtiesContext (classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class TestUserDao extends TestAbstractHibernateDao<User, String>
{
@Autowired
private FileScannerDao fsDao;
@Autowired
private UserDao dao;
@Override
protected HibernateDao<User, String> getHibernateDao ()
{
return dao;
}
@Override
protected int howMany ()
{
return 6;
}
@Override
public void create ()
{
String username = "usErTesT";
List<Role> roles =
Arrays.asList (Role.SEARCH, Role.DOWNLOAD, Role.UPLOAD);
AccessRestriction lock = new LockedAccessRestriction ();
lock.setBlockingReason ("Max connection exceeded !");
User user = new User ();
user.setUsername (username);
user.setPassword ("pwd");
user.setRoles (roles);
user.setDeleted (false);
user.setEmail ("usertest@gael.fr");
user.addRestriction (lock);
user = dao.create (user);
Assert.assertEquals (dao.count (), (howMany () + 1));
Assert.assertNotNull (user);
Assert.assertTrue (user.getRoles ().containsAll (roles));
Assert.assertFalse (user.isDeleted ());
Assert.assertTrue (user.getUsername ().equalsIgnoreCase (username));
Assert.assertEquals (user.getRestrictions ().size (), 1);
}
@Override
public void read ()
{
User user = dao.read ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0");
Assert.assertNotNull (user);
Set<AccessRestriction> restrictions = user.getRestrictions ();
Preference preferences = user.getPreferences ();
Assert.assertTrue (user.getUsername ().equalsIgnoreCase ("koko"));
Assert.assertEquals (restrictions.size (), 1);
Assert.assertEquals (preferences.getFileScanners ().size (), 2);
Assert.assertEquals (preferences.getSearches ().size (), 2);
}
@Override
public void update ()
{
String uid = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0";
String lastname = "Lambert";
String advancedSearchKey = "advanceKey";
String advancedSearchValue = "France";
User user = dao.read (uid);
Assert.assertNotNull (user);
user.setLastname (lastname);
user.getRestrictions ().clear ();
for (Search search : user.getPreferences ().getSearches ())
{
search.getAdvanced ().put (advancedSearchKey, advancedSearchValue);
}
dao.update (user);
user = dao.read (uid);
Assert.assertEquals (user.getLastname (), lastname);
Assert.assertTrue (user.getRestrictions ().isEmpty ());
for (Search search : user.getPreferences ().getSearches ())
{
Assert.assertEquals (search.getAdvanced ().get (advancedSearchKey),
advancedSearchValue);
}
}
@Override
public void delete ()
{
String uid = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0";
User user = dao.read (uid);
Assert.assertNotNull (user);
dao.delete (user);
Assert.assertEquals (dao.count (), (howMany () - 1));
Assert.assertNull (dao.read (uid));
Assert.assertEquals (countRestriction (user), 0);
Assert
.assertEquals (
countInTable ("PREFERENCES", "UUID", user.getPreferences ().getUUID ()),
0);
Assert.assertEquals (countInTable ("USER_ROLES", "USER_UUID", uid), 0);
Assert.assertEquals (
countInTable ("SEARCH_PREFERENCES", "PREFERENCE_UUID", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"), 0);
Assert.assertEquals (
countInTable ("FILE_SCANNER_PREFERENCES", "PREFERENCE_UUID", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"), 0);
Assert.assertEquals (countInTable ("SEARCHES", "UUID", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"), 0);
Assert.assertEquals (countInTable ("SEARCHES", "UUID", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2"), 0);
Assert.assertEquals (countInTable ("FILE_SCANNER", "ID", 0L), 0);
Assert.assertEquals (countInTable ("FILE_SCANNER", "ID", 2L), 0);
}
@Test
public void removeFileScanner()
{
Assert.assertEquals (countInTable ("FILE_SCANNER_PREFERENCES", "PREFERENCE_UUID", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"), 2);
Assert.assertEquals (countInTable ("FILE_SCANNER", "ID", 0L), 1);
User user = dao.read ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1");
dao.removeFileScanner (user, 0L);
Assert.assertEquals (countInTable ("FILE_SCANNER_PREFERENCES", "PREFERENCE_UUID", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"), 1);
Assert.assertEquals (fsDao.read (0L), null);
}
private int countInTable (final String table, final String IdName,
final Long id)
{
return dao.getHibernateTemplate ().execute (
new HibernateCallback<Integer> ()
{
@Override
public Integer doInHibernate (Session session)
throws HibernateException, SQLException
{
String sql =
"SELECT count(*) FROM " + table + " WHERE " + IdName + " = ?";
Query query = session.createSQLQuery (sql);
query.setLong (0, id);
return ((BigInteger) query.uniqueResult ()).intValue ();
}
});
}
private int countInTable (final String table, final String IdName,
final String uuid)
{
return dao.getHibernateTemplate ().execute (
new HibernateCallback<Integer> ()
{
@Override
public Integer doInHibernate (Session session)
throws HibernateException, SQLException
{
String sql =
"SELECT count(*) FROM " + table + " WHERE " + IdName + " = ?";
Query query = session.createSQLQuery (sql);
query.setString (0, uuid);
return ((BigInteger) query.uniqueResult ()).intValue ();
}
});
}
@Test
public void getUserSearches ()
{
List<Search> s = dao.getUserSearches (dao.read ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"));
Assert.assertEquals (s.size (), 2);
}
@Test
public void getFileScanners ()
{
Set<FileScanner> s = dao.getFileScanners (dao.read ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0"));
Assert.assertEquals (s.size (), 2);
}
private int countRestriction (final User user)
{
return dao.getHibernateTemplate ().execute (
new HibernateCallback<Integer> ()
{
@Override
public Integer doInHibernate (Session session)
throws HibernateException, SQLException
{
String sql =
"SELECT count(*) FROM ACCESS_RESTRICTION "
+ "WHERE UUID IN (:restriction)";
Query query = session.createSQLQuery (sql);
query.setParameterList ("restriction", user.getRestrictions ());
return ((BigInteger) query.uniqueResult ()).intValue ();
}
});
}
@Test
public void userCode ()
{
User u = new User ();
u.setUsername ("testCode");
dao.create (u);
String code = dao.computeUserCode (u);
System.out.println (code);
User u2 = dao.getUserFromUserCode (code);
Assert.assertNotEquals (u2, null);
System.out.println (u2.getUUID ());
Assert.assertEquals (u2.getUUID (), u.getUUID ());
}
@Override
public void scroll ()
{
String hql = "WHERE deleted IS FALSE";
Iterator<User> it = dao.scroll (hql, -1, -1).iterator ();
Assert.assertTrue (CheckIterator.checkElementNumber (it, 5));
}
@Override
public void first ()
{
String hql = "FROM User ORDER BY username DESC";
User user = dao.first (hql);
Assert.assertNotNull (user);
Assert.assertEquals (user.getUsername (), "~public data");
}
}