package uk.ac.ebi.fg.myequivalents.provenance.db.managers;
import static org.junit.Assert.assertEquals;
import static uk.ac.ebi.fg.myequivalents.provenance.model.ProvenanceRegisterParameter.p;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Arrays;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import org.joda.time.DateTime;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.ebi.fg.myequivalents.access_control.model.User;
import uk.ac.ebi.fg.myequivalents.access_control.model.User.Role;
import uk.ac.ebi.fg.myequivalents.dao.access_control.UserDao;
import uk.ac.ebi.fg.myequivalents.managers.impl.db.DbManagerFactory;
import uk.ac.ebi.fg.myequivalents.managers.interfaces.ServiceManager;
import uk.ac.ebi.fg.myequivalents.provenance.db.dao.ProvenanceRegisterEntryDAO;
import uk.ac.ebi.fg.myequivalents.provenance.model.ProvenanceRegisterEntry;
import uk.ac.ebi.fg.myequivalents.resources.Resources;
/**
* Tests {@link ProvDbServiceManager}.
*
* <dl><dt>date</dt><dd>10 Jun 2014</dd></dl>
* @author Marco Brandizi
*
*/
public class ProvDbServiceManagerTest
{
public static final String testPass = "test.password";
public static final String testSecret = "test.secret";
public static final User editorUser = new User (
"test.editor", "Test Editor", "User", testPass, "test editor notes", Role.EDITOR, testSecret
);
public static final User adminUser = new User (
"test.admin", "Test Admin", "User", testPass, "test admin notes", Role.ADMIN, testSecret
);
private final Logger log = LoggerFactory.getLogger ( this.getClass () );
@BeforeClass
public static void init ()
{
editorUser.setApiPassword ( testSecret );
editorUser.setPassword ( testPass );
adminUser.setApiPassword ( testSecret );
adminUser.setPassword ( testPass );
DbManagerFactory mgrFact = Resources.getInstance ().getMyEqManagerFactory ();
EntityManager em = mgrFact.getEntityManagerFactory ().createEntityManager ();
UserDao userDao = new UserDao ( em );
EntityTransaction ts = em.getTransaction ();
ts.begin ();
userDao.storeUnauthorized ( editorUser );
userDao.storeUnauthorized ( adminUser );
ts.commit ();
}
@AfterClass
public static void cleanUp ()
{
DbManagerFactory mgrFact = (DbManagerFactory) Resources.getInstance ().getMyEqManagerFactory ();
EntityManager em = mgrFact.getEntityManagerFactory ().createEntityManager ();
UserDao userDao = new UserDao ( em );
EntityTransaction ts = em.getTransaction ();
ts.begin ();
userDao.deleteUnauthorized ( editorUser.getEmail () );
userDao.deleteUnauthorized ( adminUser.getEmail () );
ts.commit ();
em = mgrFact.getEntityManagerFactory ().createEntityManager ();
ts = em.getTransaction ();
ts.begin ();
ProvenanceRegisterEntryDAO provDao = new ProvenanceRegisterEntryDAO ( em );
provDao.purgeAll ( new DateTime ().minusMinutes ( 1 ).toDate (), null );
//em.createNativeQuery ( "DELETE FROM provenance_register_parameter" ).executeUpdate ();
//em.createQuery ( "DELETE FROM " + ProvenanceRegisterEntry.class.getName () ).executeUpdate ();
ts.commit ();
em.close ();
}
@Test
public void testCreation () throws Exception
{
DbManagerFactory mgrFact = (DbManagerFactory) Resources.getInstance ().getMyEqManagerFactory ();
Reader xmlIn = new InputStreamReader ( this.getClass ().getResourceAsStream ( "/data/foo_services.xml" ) );
ServiceManager smgr = mgrFact.newServiceManager ( editorUser.getEmail (), testSecret );
smgr.storeServicesFromXML ( xmlIn );
ProvenanceRegisterEntryDAO provDao = new ProvenanceRegisterEntryDAO ( mgrFact.getEntityManagerFactory ().createEntityManager () );
List<ProvenanceRegisterEntry> proves = provDao.find ( null, "%storeServices%", Arrays.asList ( p ( "service", "%.service7" ) ) );
assertEquals ( "Expected provenance records not saved (service7)!", 1, proves.size () );
proves = provDao.find ( null, "%storeServices%", Arrays.asList ( p ( "repository", "test.testmain.addedRepo1" ) ) );
assertEquals ( "Expected provenance records not saved (addedRepo1)!", 1, proves.size () );
// This is how you can use JodaTime to set dates like '10 days ago' and pass them to search methods.
proves = provDao.find ( null, null, new DateTime ().minusDays ( 10 ), new DateTime (),
Arrays.asList ( p ( "serviceCollection", (String) null ) )
);
assertEquals ( "Expected provenance records not saved (servCollections)!", 1, proves.size () );
ProvenanceRegisterEntry prove = proves.get ( 0 );
log.info ( "---- SERVCOLL:\n{}", prove );
assertEquals ( "Fetched provenance record wrong (parameters)", 7, prove.getParameters ().size () );
assertEquals ( "Fetched provenance record wrong (user)", editorUser.getEmail (), prove.getUserEmail () );
}
}