edu.northwestern.bioinformatics.studycalendar.grid.PSCRegistrationConsumerTest.java Source code

Java tutorial

Introduction

Here is the source code for edu.northwestern.bioinformatics.studycalendar.grid.PSCRegistrationConsumerTest.java

Source

/*L
 * Copyright Northwestern University.
 *
 * Distributed under the OSI-approved BSD 3-Clause License.
 * See http://ncip.github.io/psc/LICENSE.txt for details.
 */

package edu.northwestern.bioinformatics.studycalendar.grid;

import static org.easymock.EasyMock.expect;
import edu.northwestern.bioinformatics.studycalendar.domain.*;
import edu.northwestern.bioinformatics.studycalendar.domain.delta.AmendmentApproval;
import edu.northwestern.bioinformatics.studycalendar.dao.*;
import edu.northwestern.bioinformatics.studycalendar.security.authorization.PscUser;
import edu.northwestern.bioinformatics.studycalendar.security.authorization.PscUserDetailsService;
import edu.northwestern.bioinformatics.studycalendar.service.*;
import edu.northwestern.bioinformatics.studycalendar.xml.writers.StudySubjectAssignmentXmlSerializer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.easymock.classextension.EasyMock;

import org.springframework.test.AbstractTransactionalSpringContextTests;
import org.springframework.beans.factory.annotation.Required;
import gov.nih.nci.cabig.ctms.audit.domain.DataAuditInfo;
import gov.nih.nci.cabig.ctms.suite.authorization.SuiteRole;
import gov.nih.nci.cabig.ctms.suite.authorization.SuiteRoleMembership;
import gov.nih.nci.cabig.ccts.domain.Registration;
import gov.nih.nci.cagrid.common.Utils;

import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.io.InputStream;
import java.io.Reader;
import java.io.FileReader;
import java.io.InputStreamReader;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import gov.nih.nci.ccts.grid.stubs.types.InvalidRegistrationException;
import gov.nih.nci.ccts.grid.stubs.types.RegistrationConsumptionException;

/**
 * Test class added to validate the clean scripts that were added for CCTS roll-back script requirement
 *
 * @author Saurabh Agrawal
 */
public class PSCRegistrationConsumerTest extends AbstractTransactionalSpringContextTests {

    public static final Log logger = LogFactory.getLog(PSCRegistrationConsumerTest.class);

    private PSCRegistrationConsumer registrationConsumer;
    private String regFile;
    private StudyService studyService;

    private String assignedIdentifier = "TEST_STUDY";
    private String nciCode = "SITE_01";
    private SiteDao siteDao;
    private String shortTitle = "SMOTE_TEST";
    private String longTitle = "Test long title";
    private String assignmentGridId = "sampleRegistration";
    private String subjectGridId = "91dd4580-801b-4874-adeb-a174361bacea";

    private StudySubjectAssignmentDao studySubjectAssignmentDao;
    private SubjectService subjectService;
    private StudyDao studyDao;
    private SubjectDao subjectDao;
    private StudySubjectAssignmentXmlSerializer studySubjectAssignmentXmlSerializer;
    private SiteService siteService;
    private AmendmentService amendmentService;
    private Study study;
    private StudySite studySite;

    private RegistrationGridServiceAuthorizationHelper gridServicesAuthorizationHelper;
    private PscUserDetailsService pscUserDetailsService;
    private PscUser user;
    private PscUser userWithoutRegistrarRole;
    private PscUser userWithIncorrectStudy;
    private PscUser userWithIncorrectStudySite;
    private PscUser userWithAllStudiesAllSites;
    private PscUser userWithStudyAllSites;
    private PscUser userWithAllStudiesStudySite;

    private PscUser userWithStudyCreatorAllSites;

    protected void onSetUpInTransaction() throws Exception {

        DataAuditInfo.setLocal(new DataAuditInfo("test", "localhost", new Date(),
                "/wsrf-psc/services/cagrid/RegistrationConsumer"));
        regFile = System.getProperty("psc.test.sampleRegistrationFile");
        study = studyDao.getByAssignedIdentifier(assignedIdentifier);
        if (study == null) {
            logger.error(String.format("no study found for given identifier %s", assignedIdentifier));
            createStudy(); //create study and re-run the test case..
        }

        gridServicesAuthorizationHelper = EasyMock.createMock(RegistrationGridServiceAuthorizationHelper.class);
        pscUserDetailsService = EasyMock.createMock(PscUserDetailsService.class);

        // User with REGISTRAR role, Study and StudySite
        SuiteRoleMembership suiteRoleMembership = new SuiteRoleMembership(SuiteRole.REGISTRAR, null, null);
        suiteRoleMembership.addSite("SITE_01");
        suiteRoleMembership.addStudy("TEST_STUDY");
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships = Collections.singletonMap(SuiteRole.REGISTRAR,
                suiteRoleMembership);
        user = new PscUser(null, expectedMemberships);

        // User without  REGISTRAR role
        SuiteRoleMembership suiteRoleMembership1 = new SuiteRoleMembership(SuiteRole.STUDY_CREATOR, null, null);
        suiteRoleMembership1.addSite("SITE_01");
        suiteRoleMembership1.addStudy("TEST_STUDY");
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships1 = Collections.singletonMap(SuiteRole.STUDY_CREATOR,
                suiteRoleMembership1);
        userWithoutRegistrarRole = new PscUser(null, expectedMemberships1);

        // User with REGISTRAR role, No Study
        SuiteRoleMembership suiteRoleMembership2 = new SuiteRoleMembership(SuiteRole.REGISTRAR, null, null);
        suiteRoleMembership2.addSite("SITE_01");
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships2 = Collections.singletonMap(SuiteRole.REGISTRAR,
                suiteRoleMembership2);
        userWithIncorrectStudy = new PscUser(null, expectedMemberships2);

        // User with REGISTRAR role,Study and No StudySite
        SuiteRoleMembership suiteRoleMembership3 = new SuiteRoleMembership(SuiteRole.REGISTRAR, null, null);
        suiteRoleMembership3.addStudy("TEST_STUDY");
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships3 = Collections.singletonMap(SuiteRole.REGISTRAR,
                suiteRoleMembership3);
        userWithIncorrectStudySite = new PscUser(null, expectedMemberships3);

        // User with REGISTRAR role, AllStudies and AllSites
        SuiteRoleMembership suiteRoleMembership4 = new SuiteRoleMembership(SuiteRole.REGISTRAR, null, null);
        suiteRoleMembership4.forAllSites();
        suiteRoleMembership4.forAllStudies();
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships4 = Collections.singletonMap(SuiteRole.REGISTRAR,
                suiteRoleMembership4);
        userWithAllStudiesAllSites = new PscUser(null, expectedMemberships4);

        // User with REGISTRAR role, Study and AllSites
        SuiteRoleMembership suiteRoleMembership5 = new SuiteRoleMembership(SuiteRole.REGISTRAR, null, null);
        suiteRoleMembership5.forAllSites();
        suiteRoleMembership5.addStudy("TEST_STUDY");
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships5 = Collections.singletonMap(SuiteRole.REGISTRAR,
                suiteRoleMembership5);
        userWithStudyAllSites = new PscUser(null, expectedMemberships5);

        // User with REGISTRAR role, AllStudies and StudySite
        SuiteRoleMembership suiteRoleMembership6 = new SuiteRoleMembership(SuiteRole.REGISTRAR, null, null);
        suiteRoleMembership6.addSite("SITE_01");
        suiteRoleMembership6.forAllStudies();
        Map<SuiteRole, SuiteRoleMembership> expectedMemberships6 = Collections.singletonMap(SuiteRole.REGISTRAR,
                suiteRoleMembership6);
        userWithAllStudiesStudySite = new PscUser(null, expectedMemberships6);

    }

    public void testApplicationContextLoads() throws Exception {
        ApplicationContext loaded = new ClassPathXmlApplicationContext("classpath:applicationContext-grid.xml");
        assertTrue("No beans loaded", loaded.getBeanDefinitionCount() > 0);
    }

    // User with REGISTRAR role, AllStudies and AllSites
    public void testAuthorizationForRegistrarRoleAllStudiesAllSites() throws Exception {
        logger.info("### Running Authorization test REGISTRAR role, AllStudies and AllSites");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(userWithAllStudiesAllSites);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

            EasyMock.verify(gridServicesAuthorizationHelper);
            EasyMock.verify(pscUserDetailsService);

            assertNotNull("must create assignment", assignment);
            assertNotNull("must create assignment", assignment.getId());
        } catch (Exception ex) {
            ex.printStackTrace();
            fail("Test Failed: Error creating registration: " + ex.getMessage());
        }
        logger.info("### End Authorization test REGISTRAR role, AllStudies and AllSites");
    }

    // User with REGISTRAR role, AllStudies and StudySite
    public void testAuthorizationForRegistrarRoleAllStudiesStudySite() throws Exception {
        logger.info("### Running Authorization test REGISTRAR role, AllStudies and site");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(userWithAllStudiesStudySite);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

            EasyMock.verify(gridServicesAuthorizationHelper);
            EasyMock.verify(pscUserDetailsService);

            assertNotNull("must create assignment", assignment);
            assertNotNull("must create assignment", assignment.getId());
        } catch (Exception ex) {
            ex.printStackTrace();
            fail("Test Failed: Error creating registration: " + ex.getMessage());
        }
        logger.info("### End Authorization test REGISTRAR role, AllStudies and site");
    }

    // User with REGISTRAR role, associated Study and AllSites
    public void testAuthorizationForRegistrarRoleWithCorrectStudyAllSites() throws Exception {
        logger.info("### Running Authorization test REGISTRAR role, associated Study and AllSites");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(userWithStudyAllSites);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

            EasyMock.verify(gridServicesAuthorizationHelper);
            EasyMock.verify(pscUserDetailsService);

            assertNotNull("must create assignment", assignment);
            assertNotNull("must create assignment", assignment.getId());
        } catch (Exception ex) {
            ex.printStackTrace();
            fail("Test Failed: Error creating registration: " + ex.getMessage());
        }
        logger.info("### End Authorization test REGISTRAR role, associated Study and AllSites");
    }

    // test the user with no REGISTRAR role
    public void testAuthorizationForUserWithoutRegistrarRole() throws Exception {
        logger.info("### Running Authorization test with no REGISTRAR role");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(userWithoutRegistrarRole);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            fail("Authorization Failed: RegsitrationConsumer should've thrown an exception!");
        } catch (InvalidRegistrationException e) {
            assertEquals("Test failed:", "Access Denied: user does not have REGISTRAR role", e.getFaultReason());
        }
        StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

        EasyMock.verify(gridServicesAuthorizationHelper);
        EasyMock.verify(pscUserDetailsService);

        assertNull("Authorization Failed: Assignment should haven't been created", assignment);
        logger.info("### End Authorization test with no REGISTRAR role");
    }

    // User with REGISTRAR role,Study and No StudySite
    public void testAuthorizationForRegistrarRoleWithCorrectStudyNoStudySite() throws Exception {
        logger.info("### Running Authorization test REGISTRAR role, associated Study and no studySite");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(userWithIncorrectStudySite);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            fail("Authorization Failed: RegsitrationConsumer should've thrown an exception!");
        } catch (InvalidRegistrationException e) {
            assertEquals("Test failed:",
                    "Access Denied: Registrar is not authorized for the associated StudySite:SITE_01",
                    e.getFaultReason());
        }
        StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

        EasyMock.verify(gridServicesAuthorizationHelper);
        EasyMock.verify(pscUserDetailsService);
        assertNull("Authorization Failed: Assignment should haven't been created", assignment);
        logger.info("### End Authorization test REGISTRAR role, associated Study and no studySite");
    }

    // User with REGISTRAR role, No Study
    public void testAuthorizationForRegistrarRoleWithNoStudy() throws Exception {
        logger.info("### Running Authorization test REGISTRAR role and no study");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(userWithIncorrectStudy);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            fail("Authorization Failed: RegsitrationConsumer should've thrown an exception!");
        } catch (InvalidRegistrationException e) {
            assertEquals("Test failed:", "Access Denied: Registrar is not authorized for the Study:TEST_STUDY",
                    e.getFaultReason());
        }
        StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

        EasyMock.verify(gridServicesAuthorizationHelper);
        EasyMock.verify(pscUserDetailsService);
        assertNull("Authorization Failed: Assignment should haven't been created", assignment);
        logger.info("### End Authorization test REGISTRAR role and no study");
    }

    protected void onTearDownAfterTransaction() throws Exception {
        DataAuditInfo.setLocal(null);
    }

    public void testCreateRegistrationLocal() throws Exception {
        logger.info("### Running test create Registration local method");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(user);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);

        try {
            registrationConsumer.register(registration);
            StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

            EasyMock.verify(gridServicesAuthorizationHelper);
            EasyMock.verify(pscUserDetailsService);

            assertNotNull("must create assignment", assignment);
            assertNotNull("must create assignment", assignment.getId());
        } catch (Exception ex) {
            ex.printStackTrace();
            fail("Error creating registration: " + ex.getMessage());
        }
        logger.info("### End test create Registration local method");
    }

    public void testRollbackRegistrationLocal() throws Exception {
        logger.info("### Running test rollback Registration local method");
        Registration registration = getRegistration();
        registrationConsumer.setGridServicesAuthorizationHelper(gridServicesAuthorizationHelper);
        registrationConsumer.setPscUserDetailsService(pscUserDetailsService);

        expect(gridServicesAuthorizationHelper.getCurrentUsername()).andReturn("John");
        expect(pscUserDetailsService.loadUserByUsername("John")).andReturn(user);

        EasyMock.replay(gridServicesAuthorizationHelper);
        EasyMock.replay(pscUserDetailsService);
        try {
            registrationConsumer.register(registration);
            StudySubjectAssignment assignment = studySubjectAssignmentDao.getByGridId(assignmentGridId);

            EasyMock.verify(gridServicesAuthorizationHelper);
            EasyMock.verify(pscUserDetailsService);

            assertNotNull("must create assignment", assignment);
            assertNotNull("must create assignment", assignment.getId());
            registrationConsumer.rollback(registration);

            Subject subject = subjectDao.findSubjectByPersonId("TEST_MRN");
            assertNull("Subject not deleted", subject);
        } catch (Exception ex) {
            ex.printStackTrace();
            fail("Error creating/rollback registration: " + ex.getMessage());
        }
        logger.info("### End test rollback Registration local method");
    }

    public void setStudySubjectAssignmentXmlSerializer(
            StudySubjectAssignmentXmlSerializer studySubjectAssignmentXmlSerializer) {
        this.studySubjectAssignmentXmlSerializer = studySubjectAssignmentXmlSerializer;
    }

    public void createStudy() throws Exception {
        if (studyDao.getByAssignedIdentifier(assignedIdentifier) == null) {
            logger.debug("creating study for given identifer:" + assignedIdentifier);
            study = TemplateSkeletonCreatorImpl.createBase(shortTitle);
            study.setAssignedIdentifier(assignedIdentifier);
            study.setLongTitle(longTitle);

            Site site = siteDao.getByAssignedIdentifier(nciCode);
            if (site == null) {
                String message = "No site exists for given assigned identifier" + nciCode;
                logger.error(message);
                site = new Site();
                site.setAssignedIdentifier(nciCode);
                site.setName(nciCode);
                siteService.createOrUpdateSite(site);
            }
            studySite = new StudySite();
            studySite.setSite(site);
            studySite.setStudy(study);
            study.addStudySite(studySite);

            TemplateSkeletonCreatorImpl.addEpoch(study, 0, Epoch.create("Treatment"));
            Epoch epoch = new Epoch();
            epoch.setName("Treatment");
            StudySegment child = new StudySegment();
            child.setName("Arm A");
            epoch.addChild(child);
            study.getPlannedCalendar().addEpoch(epoch);

            studyService.save(study);
            amendmentService.amend(study);

            AmendmentApproval approvals = new AmendmentApproval();
            approvals.setAmendment(study.getAmendment());
            approvals.setDate(new Date());

            amendmentService.approve(studySite, approvals);
            logger.info("Created the study :" + study.getId());
        } else {
            logger.debug("study already exists for given identifier : " + assignedIdentifier);
        }
    }

    protected String[] getConfigLocations() {
        String[] configs = { "classpath:applicationContext-grid.xml" };
        return configs;
    }

    private Registration getRegistration() {
        Registration reg = null;
        try {
            InputStream config = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("gov/nih/nci/ccts/grid/client/client-config.wsdd");
            Reader reader = null;
            if (regFile != null) {
                reader = new FileReader(regFile);
            } else {
                reader = new InputStreamReader(Thread.currentThread().getContextClassLoader()
                        .getResourceAsStream("SampleRegistrationMessage.xml"));
            }
            reg = (Registration) Utils.deserializeObject(reader, Registration.class, config);
        } catch (Exception ex) {
            ex.printStackTrace();
            fail("Error deserializing Registration object: " + ex.getMessage());
        }
        return reg;
    }

    public void setStudySubjectAssignmentDao(StudySubjectAssignmentDao studySubjectAssignmentDao) {
        this.studySubjectAssignmentDao = studySubjectAssignmentDao;
    }

    public void setSubjectService(SubjectService subjectService) {
        this.subjectService = subjectService;
    }

    public void setSubjectDao(SubjectDao subjectDao) {
        this.subjectDao = subjectDao;
    }

    @Required
    public void setAmendmentService(AmendmentService amendmentService) {
        this.amendmentService = amendmentService;
    }

    @Required
    public void setStudyService(StudyService studyService) {
        this.studyService = studyService;
    }

    @Required
    public void setSiteDao(SiteDao siteDao) {
        this.siteDao = siteDao;
    }

    @Required
    public void setSiteService(SiteService siteService) {
        this.siteService = siteService;
    }

    @Required
    public void setStudyDao(StudyDao studyDao) {
        this.studyDao = studyDao;
    }

    @Required
    public void setRegistrationConsumer(PSCRegistrationConsumer registrationConsumer) {
        this.registrationConsumer = registrationConsumer;
    }
}