package fr.gael.dhus.database.dao;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
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 fr.gael.dhus.database.dao.interfaces.HibernateDao;
import fr.gael.dhus.database.object.Search;
import fr.gael.dhus.util.CheckIterator;
import fr.gael.dhus.util.TestContextLoader;
@ContextConfiguration (locations = "classpath:fr/gael/dhus/spring/context-test.xml", loader = TestContextLoader.class)
@DirtiesContext (classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class TestSearchDao extends TestAbstractHibernateDao<Search, String>
{
@Autowired
private SearchDao dao;
@Override
protected HibernateDao<Search, String> getHibernateDao ()
{
return dao;
}
@Override
protected int howMany ()
{
return 4;
}
@Override
public void create ()
{
String value = "search_value";
String complete = "search_complete";
String footprint = "search_footprint";
String polygone = "polygone";
String france = "France";
Search search = new Search ();
search.setValue (value);
search.setComplete (complete);
search.setFootprint (footprint);
search.setNotify (false);
search.getAdvanced ().put (polygone, france);
search = dao.create (search);
Assert.assertEquals (dao.count (), (howMany () + 1));
Assert.assertNotNull (search);
Assert.assertEquals (search.getAdvanced ().get (polygone), france);
Assert.assertEquals (search.getComplete (), complete);
Assert.assertEquals (search.getValue (), value);
Assert.assertFalse (search.isNotify ());
}
@Override
public void read ()
{
Search s = dao.read ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0");
Assert.assertNotNull (s);
Assert.assertEquals (s.getValue (), "value0");
Assert.assertEquals (s.getAdvanced ().get ("advanceKey"), "advanceValue");
}
@Override
public void update ()
{
String id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1";
Search s = dao.read (id);
boolean notify = !s.isNotify ();
String advancedKey = "toto";
String advancedValue = "titi";
s.setNotify (notify);
s.getAdvanced ().put (advancedKey, advancedValue);
dao.update (s);
s = dao.read (id);
Assert.assertEquals (s.isNotify (), notify);
Assert.assertEquals (s.getAdvanced ().get (advancedKey), advancedValue);
}
private int countAdvanced (final String sid)
{
return dao.getHibernateTemplate ().execute (
new HibernateCallback<Integer> ()
{
@Override
public Integer doInHibernate (Session session)
throws HibernateException, SQLException
{
String hql =
"SELECT count(*) FROM SEARCH_ADVANCED WHERE SEARCH_UUID = ?";
SQLQuery query = session.createSQLQuery (hql);
query.setString (0, sid);
return ((BigInteger) query.uniqueResult ()).intValue ();
}
});
}
@Override
public void delete ()
{
String sid = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0";
Search search = dao.read (sid);
Assert.assertNotNull (search);
Assert.assertFalse (search.getAdvanced ().isEmpty ());
dao.delete (search);
Assert.assertEquals (dao.count (), (howMany () - 1));
Assert.assertNull (dao.read (sid));
Assert.assertEquals (countAdvanced (sid), 0);
}
@Override
public void scroll ()
{
String hql = "WHERE notify IS FALSE";
Iterator<Search> it = dao.scroll (hql, -1, -1).iterator ();
Assert.assertTrue (CheckIterator.checkElementNumber (it, 2));
}
@Override
public void first ()
{
String hql = "FROM Search WHERE notify IS TRUE ORDER BY uuid DESC";
Search search = dao.first (hql);
Assert.assertNotNull (search);
Assert.assertEquals (search.getUUID (), "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2");
}
// TODO merge others test
}