package org.opencb.opencga.catalog.managers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.opencb.commons.datastore.core.ObjectMap;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryResult;
import org.opencb.commons.test.GenericTest;
import org.opencb.opencga.catalog.CatalogManagerExternalResource;
import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.models.Project;
import org.opencb.opencga.catalog.models.Study;
import org.opencb.opencga.catalog.models.acls.permissions.StudyAclEntry;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
/**
* Created by pfurio on 28/11/16.
*/
public class ProjectManagerTest extends GenericTest {
public final static String PASSWORD = "asdf";
@Rule
public ExpectedException thrown = ExpectedException.none();
@Rule
public CatalogManagerExternalResource catalogManagerResource = new CatalogManagerExternalResource();
protected CatalogManager catalogManager;
protected String sessionIdUser;
protected String sessionIdUser2;
protected String sessionIdUser3;
private long project1;
private long project2;
private long project3;
private long studyId;
private long studyId2;
private long studyId3;
@Before
public void setUp() throws IOException, CatalogException {
catalogManager = catalogManagerResource.getCatalogManager();
setUpCatalogManager(catalogManager);
}
public void setUpCatalogManager(CatalogManager catalogManager) throws IOException, CatalogException {
catalogManager.createUser("user", "User Name", "mail@ebi.ac.uk", PASSWORD, "", null, null);
catalogManager.createUser("user2", "User2 Name", "mail2@ebi.ac.uk", PASSWORD, "", null, null);
catalogManager.createUser("user3", "User3 Name", "user.2@e.mail", PASSWORD, "ACME", null, null);
sessionIdUser = catalogManager.login("user", PASSWORD, "127.0.0.1").first().getId();
sessionIdUser2 = catalogManager.login("user2", PASSWORD, "127.0.0.1").first().getId();
sessionIdUser3 = catalogManager.login("user3", PASSWORD, "127.0.0.1").first().getId();
project1 = catalogManager.getProjectManager().create("Project about some genomes", "1000G", "", "ACME", "Homo sapiens",
null, null, "GRCh38", new QueryOptions(), sessionIdUser).first().getId();
project2 = catalogManager.getProjectManager().create("Project Management Project", "pmp", "life art intelligent system",
"myorg", "Homo sapiens", null, null, "GRCh38", new QueryOptions(),
sessionIdUser2).first().getId();
project3 = catalogManager.getProjectManager().create("project 1", "p1", "", "", "Homo sapiens",
null, null, "GRCh38", new QueryOptions(), sessionIdUser3).first().getId();
studyId = catalogManager.createStudy(project1, "Phase 1", "phase1", Study.Type.TRIO, "Done", sessionIdUser).first().getId();
studyId2 = catalogManager.createStudy(project1, "Phase 3", "phase3", Study.Type.CASE_CONTROL, "d", sessionIdUser).first().getId();
studyId3 = catalogManager.createStudy(project2, "Study 1", "s1", Study.Type.CONTROL_SET, "", sessionIdUser2).first().getId();
}
@Test
public void getSharedProjects() throws CatalogException {
QueryResult<Project> queryResult = catalogManager.getProjectManager().getSharedProjects("user", null, sessionIdUser);
assertEquals(0, queryResult.getNumResults());
// Create a new study in project2 with some dummy permissions for user
long s2 = catalogManager.createStudy(project2, "Study 2", "s2", Study.Type.CONTROL_SET, "", sessionIdUser2).first().getId();
catalogManager.createStudyAcls(Long.toString(s2), "user", StudyAclEntry.StudyPermissions.VIEW_STUDY.toString(), null,
sessionIdUser2);
queryResult = catalogManager.getProjectManager().getSharedProjects("user", null, sessionIdUser);
assertEquals(1, queryResult.getNumResults());
assertEquals(1, queryResult.first().getStudies().size());
assertEquals("s2", queryResult.first().getStudies().get(0).getAlias());
// Add permissions to a group were user belongs
catalogManager.getStudyManager().createGroup(Long.toString(studyId3), "@member", "user", sessionIdUser2);
catalogManager.createStudyAcls(Long.toString(studyId3), "@member", StudyAclEntry.StudyPermissions.VIEW_STUDY.toString(), null,
sessionIdUser2);
queryResult = catalogManager.getProjectManager().getSharedProjects("user", null, sessionIdUser);
assertEquals(1, queryResult.getNumResults());
assertEquals(2, queryResult.first().getStudies().size());
assertEquals("user2@pmp", queryResult.first().getAlias());
// Add permissions to user in a study of user3
long s3 = catalogManager.createStudy(project3, "StudyProject3", "s3", Study.Type.CONTROL_SET, "", sessionIdUser3).first().getId();
catalogManager.createStudyAcls(Long.toString(s3), "user", StudyAclEntry.StudyPermissions.VIEW_STUDY.toString(), null,
sessionIdUser3);
queryResult = catalogManager.getProjectManager().getSharedProjects("user", null, sessionIdUser);
assertEquals(2, queryResult.getNumResults());
for (Project project : queryResult.getResult()) {
if (project.getId() == project2) {
assertEquals(2, project.getStudies().size());
} else {
assertEquals(1, project.getStudies().size());
}
}
}
@Test
public void updateOrganismInProject() throws CatalogException {
Project pr = catalogManager.getProjectManager().create("Project about some genomes", "project2", "", "ACME", "Homo sapiens",
null, null, "GRCh38", null, sessionIdUser).first();
long myProject = pr.getId();
assertEquals("Homo sapiens", pr.getOrganism().getScientificName());
assertEquals("", pr.getOrganism().getCommonName());
assertEquals("GRCh38", pr.getOrganism().getAssembly());
assertEquals(-1, pr.getOrganism().getTaxonomyCode());
ObjectMap objectMap = new ObjectMap();
objectMap.put(ProjectDBAdaptor.QueryParams.ORGANISM_TAXONOMY_CODE.key(), 55);
QueryResult<Project> update = catalogManager.getProjectManager().update(myProject, objectMap, null, sessionIdUser);
assertEquals(1, update.getNumResults());
assertEquals("Homo sapiens", update.first().getOrganism().getScientificName());
assertEquals("", update.first().getOrganism().getCommonName());
assertEquals("GRCh38", update.first().getOrganism().getAssembly());
assertEquals(55, update.first().getOrganism().getTaxonomyCode());
objectMap = new ObjectMap();
objectMap.put(ProjectDBAdaptor.QueryParams.ORGANISM_COMMON_NAME.key(), "common");
update = catalogManager.getProjectManager().update(myProject, objectMap, null, sessionIdUser);
assertEquals(1, update.getNumResults());
assertEquals("Homo sapiens", update.first().getOrganism().getScientificName());
assertEquals("common", update.first().getOrganism().getCommonName());
assertEquals("GRCh38", update.first().getOrganism().getAssembly());
assertEquals(55, update.first().getOrganism().getTaxonomyCode());
objectMap = new ObjectMap();
objectMap.put(ProjectDBAdaptor.QueryParams.ORGANISM_ASSEMBLY.key(), "assembly");
thrown.expect(CatalogException.class);
thrown.expectMessage("Cannot update organism");
catalogManager.getProjectManager().update(myProject, objectMap, null, sessionIdUser);
}
}