package org.genedb.db.loading.auxiliary;
import static org.junit.Assert.*;
import org.gmod.schema.feature.Polypeptide;
import org.gmod.schema.feature.PolypeptideDomain;
import org.gmod.schema.mapped.DbXRef;
import org.gmod.schema.mapped.FeatureDbXRef;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.jdbc.Work;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.SortedSet;
import java.util.TreeSet;
public class DomainLoaderTest {
private static final Logger logger = Logger.getLogger(DomainLoaderTest.class);
private static DomainLoader loader;
@BeforeClass
public static void setup() throws IOException, HibernateException, SQLException, ClassNotFoundException, Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[] {"Load.xml", "AuxTest.xml"});
loader = ctx.getBean("domainloader", DomainLoader.class);
assertTrue(loader.processOptionIfValid("key-type", "polypeptide"));
loader.analysisProgramVersion = "unknown";
loader.notFoundNotFatal = true;
}
@Test
public void testPfamDomains() throws HibernateException, SQLException, IOException {
loader.analysisProgram = "pfam_scan";
loader.clear("Pfalciparum", "pfam_scan");
new Load(loader).load("test/data/Pfalciparum.pfam");
SessionFactory sessionFactory = loader.getSessionFactory();
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
try {
Polypeptide polypeptide = (Polypeptide) session.createQuery(
"from Polypeptide where uniquename = 'MAL13P1.114:pep'"
).uniqueResult();
assertNotNull(polypeptide);
assertEquals("MAL13P1.114:pep", polypeptide.getUniqueName());
SortedSet<PolypeptideDomain> allDomains = polypeptide.getDomains();
assertNotNull(allDomains);
SortedSet<PolypeptideDomain> pfamDomains = new TreeSet<PolypeptideDomain>();
for(PolypeptideDomain domain : allDomains) {
assertNotNull(domain);
if (domain.getAnalysisFeature() != null && domain.getAnalysisFeature().getAnalysis().getProgram().equals("pfam_scan")) {
pfamDomains.add(domain);
}
}
assertEquals(2, pfamDomains.size());
PolypeptideDomain domain = pfamDomains.first();
assertNotNull(domain);
assertEquals("MAL13P1.114:pep:Pfam:PF00308", domain.getUniqueName());
DbXRef dbxref = domain.getDbXRef();
assertNotNull(dbxref);
assertEquals("Pfam", dbxref.getDb().getName());
assertEquals("PF00308", dbxref.getAccession());
assertEquals("Bac_DnaA", dbxref.getDescription());
// No InterPro dbxrefs
Collection<FeatureDbXRef> featureDbXRefs = domain.getFeatureDbXRefs();
assertNotNull(featureDbXRefs);
assertEquals(0, featureDbXRefs.size());
} finally {
SessionFactoryUtils.releaseSession(session, sessionFactory);
}
}
@Test
public void testInterProDomains() throws HibernateException, SQLException, IOException {
loader.analysisProgram = "iprscan";
loader.clear("Pfalciparum", "iprscan");
new Load(loader).load("test/data/Pfalciparum-20090107-subset.interpro");
SessionFactory sessionFactory = loader.getSessionFactory();
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
try {
Polypeptide polypeptide = (Polypeptide) session.createQuery(
"from Polypeptide where uniquename = 'PFC0495w:pep'"
).uniqueResult();
assertNotNull(polypeptide);
assertEquals("PFC0495w:pep", polypeptide.getUniqueName());
logger.info(String.format("InterProTest: Getting domains for polypeptide %s", polypeptide.getUniqueName()));
SortedSet<PolypeptideDomain> domains = polypeptide.getDomains();
assertNotNull(domains);
assertEquals(1, domains.size());
PolypeptideDomain domain = domains.first();
assertNotNull(domain);
assertEquals("PFC0495w:pep:PRINTS:IPR001461", domain.getUniqueName());
DbXRef dbxref = domain.getDbXRef();
assertNotNull(dbxref);
assertEquals("PRINTS", dbxref.getDb().getName());
assertEquals("PR00792", dbxref.getAccession());
logger.info(String.format("InterProTest: Getting featureDbXrefs for domain %s", domain.getUniqueName()));
Collection<FeatureDbXRef> featureDbXRefs = domain.getFeatureDbXRefs();
assertNotNull(featureDbXRefs);
assertEquals(1, featureDbXRefs.size());
FeatureDbXRef featureDbXRef = featureDbXRefs.iterator().next();
DbXRef interproDbXRef = featureDbXRef.getDbXRef();
assertNotNull(interproDbXRef);
assertEquals("InterPro", interproDbXRef.getDb().getName());
assertEquals("IPR001461", interproDbXRef.getAccession());
} finally {
SessionFactoryUtils.releaseSession(session, sessionFactory);
}
}
@AfterClass
@Transactional
public static void shutdownDatabase() throws HibernateException, SQLException {
Session session = SessionFactoryUtils.getSession(loader.getSessionFactory(), true);
session.doWork(new Work() {
public void execute(Connection connection) {
try {
connection.createStatement().execute("shutdown");
} catch (SQLException e) {
logger.error("Failed to shutdown database", e);
}
}
});
}
}