package com.javaeye.jert.service.test;
import net.sf.hibernate.FlushMode;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate.SessionFactoryUtils;
import org.springframework.orm.hibernate.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import com.javaeye.jert.domain.Database;
import com.javaeye.jert.domain.DrillDownColumn;
import com.javaeye.jert.domain.ReportDefinition;
import com.javaeye.jert.domain.query.QueryBuilder;
import com.javaeye.jert.service.DatabaseService;
import com.javaeye.jert.service.DrillDownColumnService;
import com.javaeye.jert.service.ReportDefinitionService;
/**
* @author firebody
* @since 2005-3-10
* @version $Revision: 1.1 $
*/
public class DrillDownColumnServiceTest extends TestService {
private DrillDownColumnService ddcService;
/* (non-Javadoc)
* @see com.javaeye.jert.service.test.TestService#getContext()
*/
protected ApplicationContext getContext() {
return new ClassPathXmlApplicationContext("com/javaeye/jert/service/test/DrillDownColumnServiceTest.xml");
}
protected void setUp() throws Exception {
super.setUp();
ddcService= (DrillDownColumnService) context.getBean("drillDownColumnService");
}
public void testCRUDDrillDownColumn() throws Exception{
Database db = new Database();
((DatabaseService) context.getBean("databaseService")).createDatabase(db);
ReportDefinition rd = new ReportDefinition();
rd.setDatabase(db);
rd.setName("test report one");
rd.setSql("select * from user");
rd.setQueryType(QueryBuilder.QUERY_TYPE_STATIC);
ReportDefinitionService rs=(ReportDefinitionService)context.getBean("reportDefinitionService");
rs.createReportDefinition(rd);
ReportDefinition rd2 = new ReportDefinition();
rd2.setDatabase(db);
rd2.setName("test report two");
rd2.setSql("select * from user");
rd2.setQueryType(QueryBuilder.QUERY_TYPE_STATIC);
rs.createReportDefinition(rd2);
DrillDownColumn ddc=new DrillDownColumn();
ddc.setName("name");
ddc.setParametersIndex(2);
rd.addDrillDownColumn(ddc);
rd2.addAssociatedDrillDownColumn(ddc);
ddcService.createDrillDownColumn(ddc);
assertEquals(rd.getDrillDownColumns().size(),1);
//getting the stored entity from session is redundant ?
DrillDownColumn stored=ddcService.getDrillDownColumn(ddc.getId());
assertEquals(ddc.getId(),stored.getId());
assertEquals(stored.getName(),"name");
assertEquals(stored.getParametersIndex(),2);
assertEquals(stored.getReportDefinition().getId(),rd.getId());
assertEquals(stored.getToReportDefinition().getId(),rd2.getId());
stored.setName("changed name");
ddcService.updateDrillDownColumn(stored);
assertEquals(stored.getName(),"changed name");
//test for cascade delete all associated DrillDownColumns
this.closeSession();
this.openSession();
rs=(ReportDefinitionService)context.getBean("reportDefinitionService");
rd2=rs.getReportDefinition(rd2.getId());
rs.deleteReportDefinition(rd2);
assertNull(ddcService.getDrillDownColumn(ddc.getId()));
rd=rs.getReportDefinition(rd.getId());
assertEquals(rd.getDrillDownColumns().size(),0);
}
private void openSession() {
SessionFactory sessionFactory = (SessionFactory) context.getBean("sessionFactory");
Session hibSession = SessionFactoryUtils.getSession(sessionFactory, true);
hibSession.setFlushMode(FlushMode.NEVER);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibSession));
}
private void closeSession() {
SessionFactory sessionFactory = (SessionFactory) context.getBean("sessionFactory");
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
SessionFactoryUtils.closeSessionIfNecessary(sessionHolder.getSession(), sessionFactory);
}
}