org.alfresco.repo.invitation.AbstractInvitationServiceImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.alfresco.repo.invitation.AbstractInvitationServiceImplTest.java

Source

/*
 * #%L
 * Alfresco Repository
 * %%
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 * %%
 * This file is part of the Alfresco software. 
 * If the software was purchased under a paid Alfresco license, the terms of 
 * the paid license agreement will prevail.  Otherwise, the software is 
 * provided under the following open source license terms:
 * 
 * Alfresco is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Alfresco is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 * #L%
 */

package org.alfresco.repo.invitation;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.mail.internet.MimeMessage;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.executer.MailActionExecuter;
import org.alfresco.repo.management.subsystems.ApplicationContextFactory;
import org.alfresco.repo.processor.TemplateServiceImpl;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.site.SiteModel;
import org.alfresco.repo.workflow.WorkflowAdminServiceImpl;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.Invitation.ResourceType;
import org.alfresco.service.cmr.invitation.InvitationSearchCriteria;
import org.alfresco.service.cmr.invitation.InvitationService;
import org.alfresco.service.cmr.invitation.ModeratedInvitation;
import org.alfresco.service.cmr.invitation.NominatedInvitation;
import org.alfresco.service.cmr.repository.TemplateService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.util.BaseAlfrescoSpringTest;
import org.alfresco.util.PropertyMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.ReflectionUtils;

/**
 * Unit tests of Invitation Service
 */
public abstract class AbstractInvitationServiceImplTest extends BaseAlfrescoSpringTest {
    private static final Log logger = LogFactory.getLog(AbstractInvitationServiceImplTest.class);

    private SiteService siteService;
    private PersonService personService;
    protected InvitationService invitationService;
    private MailActionExecuter mailService;
    private boolean startSendEmails;
    protected InvitationServiceImpl invitationServiceImpl;
    protected WorkflowAdminServiceImpl workflowAdminService;
    private TemplateService templateService;

    protected final static String SITE_SHORT_NAME_INVITE = "InvitationTest";
    protected final static String SITE_SHORT_NAME_RED = "InvitationTestRed";
    protected final static String SITE_SHORT_NAME_BLUE = "InvitationTestBlue";
    public final static String PERSON_FIRSTNAME = "InvitationFirstName123";
    public final static String PERSON_FIRSTNAME_SPACES = "Invitation First\tName\n1\r2\r\n3";
    public final static String PERSON_LASTNAME = "InvitationLastName123";
    public final static String PERSON_LASTNAME_SPACES = "Invitation Last\tName\n1\r2\r\n3";
    public final static String PERSON_JOBTITLE = "JobTitle123";
    public final static String PERSON_ORG = "Organisation123";

    public final static String USER_MANAGER = "InvitationServiceManagerOne";
    public final static String USER_ONE = "InvitationServiceAlice";
    public final static String USER_TWO = "InvitationServiceBob";
    public final static String USER_EVE = "InvitationServiceEve";
    public final static String USER_NOEMAIL = "InvitationServiceNoEmail";
    public final static String USER_ONE_FIRSTNAME = "One";
    public final static String USER_ONE_LASTNAME = "Test";
    public final static String USER_ONE_EMAIL = USER_ONE + "@alfrescotesting.com";
    public final static String USER_TWO_EMAIL = USER_TWO + "@alfrescotesting.com";

    private Collection<String> enabledEngines;
    private Collection<String> visibleEngines;

    /**
     * Called during the transaction setup
     */
    @SuppressWarnings("deprecation")
    @Override
    protected void onSetUpInTransaction() throws Exception {
        super.onSetUpInTransaction();
        this.invitationService = (InvitationService) this.applicationContext.getBean("InvitationService");
        this.siteService = (SiteService) this.applicationContext.getBean("SiteService");
        this.personService = (PersonService) this.applicationContext.getBean("PersonService");
        this.authenticationComponent = (AuthenticationComponent) this.applicationContext
                .getBean("authenticationComponent");
        this.invitationServiceImpl = (InvitationServiceImpl) applicationContext.getBean("invitationService");
        this.workflowAdminService = (WorkflowAdminServiceImpl) applicationContext
                .getBean(WorkflowAdminServiceImpl.NAME);

        this.templateService = (TemplateServiceImpl) applicationContext.getBean("templateService");

        this.startSendEmails = invitationServiceImpl.isSendEmails();

        this.enabledEngines = workflowAdminService.getEnabledEngines();
        this.visibleEngines = workflowAdminService.getVisibleEngines();

        invitationServiceImpl.setSendEmails(true);

        // TODO MER 20/11/2009 Bodge - turn off email sending to prevent errors
        // during unit testing
        // (or sending out email by accident from tests)
        mailService = (MailActionExecuter) ((ApplicationContextFactory) this.applicationContext
                .getBean("OutboundSMTP")).getApplicationContext().getBean("mail");
        mailService.setTestMode(true);

        createPerson(USER_MANAGER, USER_MANAGER + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
        createPerson(USER_ONE, USER_ONE_EMAIL, USER_ONE_FIRSTNAME, USER_ONE_LASTNAME);
        createPerson(USER_TWO, USER_TWO + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
        createPerson(USER_EVE, USER_EVE + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
        createPerson(USER_NOEMAIL, null, USER_NOEMAIL, USER_NOEMAIL);

        this.authenticationComponent.setCurrentUser(USER_MANAGER);

        SiteInfo siteInfo = siteService.getSite(SITE_SHORT_NAME_INVITE);
        if (siteInfo == null) {
            siteInfo = siteService.createSite("InviteSitePreset", SITE_SHORT_NAME_INVITE, "InviteSiteTitle",
                    "InviteSiteDescription", SiteVisibility.MODERATED);

            siteService.setMembership(SITE_SHORT_NAME_INVITE, USER_NOEMAIL, SiteModel.SITE_MANAGER);
        }

        SiteInfo siteInfoRed = siteService.getSite(SITE_SHORT_NAME_RED);
        if (siteInfoRed == null) {
            siteService.createSite("InviteSiteRed", SITE_SHORT_NAME_RED, "InviteSiteTitle", "InviteSiteDescription",
                    SiteVisibility.MODERATED);
        }
        SiteInfo siteInfoBlue = siteService.getSite(SITE_SHORT_NAME_BLUE);
        if (siteInfoBlue == null) {
            siteService.createSite("InviteSiteBlue", SITE_SHORT_NAME_BLUE, "InviteSiteTitle",
                    "InviteSiteDescription", SiteVisibility.MODERATED);
        }

    }

    @Override
    protected void onTearDownInTransaction() throws Exception {
        // Make sure both workflow engines are enabled.and visible

        this.authenticationComponent.setSystemUserAsCurrentUser();

        workflowAdminService.setEnabledEngines(enabledEngines);
        workflowAdminService.setVisibleEngines(visibleEngines);

        //        invitationServiceImpl.setSendEmails(startSendEmails);
        //        siteService.deleteSite(SITE_SHORT_NAME_INVITE);
        //        siteService.deleteSite(SITE_SHORT_NAME_RED);
        //        siteService.deleteSite(SITE_SHORT_NAME_BLUE);
        //        deletePersonByUserName(USER_ONE);
        //        deletePersonByUserName(USER_TWO);
        //        deletePersonByUserName(USER_EVE);
        //        deletePersonByUserName(USER_MANAGER);
        super.onTearDownInTransaction();
    }

    /*
     * end of setup now for some real tests
     */

    /**
     * 
     */
    public void testConfiguration() {
        assertNotNull("Invitation service is null", invitationService);
    }

    /**
     * MNT-9101 An internal user account (disabled) should not be deleted if an
     * associated nominated invitation is cancelled.
     * 
     * @throws Exception
     */
    public void testInternalUserNotDeletedAfterInviteCancelled() throws Exception {
        // Disable our existing User
        boolean enabled = authenticationService.getAuthenticationEnabled(USER_ONE);
        assertTrue("User One authentication disabled", enabled);
        authenticationService.setAuthenticationEnabled(USER_ONE, false);
        enabled = authenticationService.getAuthenticationEnabled(USER_ONE);
        assertTrue("User One authentication enabled", !enabled);

        String inviteeUserName = USER_ONE;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(USER_MANAGER);

        // Invite our existing user
        NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeUserName, resourceType,
                resourceName, inviteeRole, acceptUrl, rejectUrl);

        // Cancel the invite
        invitationService.cancel(nominatedInvitation.getInviteId());

        // Our User and associated Authentication still exists
        assertNotNull("User Exists", personService.getPersonOrNull(USER_ONE));
        assertTrue("Authentication Exists", authenticationService.authenticationExists(USER_ONE));
    }

    /**
     * Ensure that an External user account is deleted when an invite is
     * cancelled
     * 
     * @throws Exception
     */
    public void testExternalUserDeletedAfterInviteCancelled() throws Exception {
        String inviteeFirstName = PERSON_FIRSTNAME;
        String inviteeLastName = PERSON_LASTNAME;
        String inviteeEmail = "123@alfrescotesting.com";
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(USER_MANAGER);

        NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeFirstName,
                inviteeLastName, inviteeEmail, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                rejectUrl);

        String inviteeUsername = nominatedInvitation.getInviteeUserName();

        invitationService.cancel(nominatedInvitation.getInviteId());

        // Our User and Authentication has been removed
        assertNull("Person deleted", personService.getPersonOrNull(inviteeUsername));
        assertFalse("Authentication deleted", authenticationService.authenticationExists(inviteeUsername));
    }

    /**
     * Test nominated user - new user
     * 
     * @throws Exception
     */
    public void testNominatedInvitationNewUser() throws Exception {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND, -1);
        Date startDate = calendar.getTime();

        String inviteeFirstName = PERSON_FIRSTNAME;
        String inviteeLastName = PERSON_LASTNAME;
        String inviteeEmail = "123@alfrescotesting.com";
        String inviteeUserName = null;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(USER_MANAGER);

        NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeFirstName,
                inviteeLastName, inviteeEmail, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                rejectUrl);

        assertNotNull("nominated invitation is null", nominatedInvitation);
        String inviteId = nominatedInvitation.getInviteId();
        assertEquals("first name wrong", inviteeFirstName, nominatedInvitation.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, nominatedInvitation.getInviteeLastName());
        assertEquals("email name wrong", inviteeEmail, nominatedInvitation.getInviteeEmail());

        // Generated User Name should be returned
        inviteeUserName = nominatedInvitation.getInviteeUserName();
        assertNotNull("generated user name is null", inviteeUserName);
        // sentInviteDate should be set to today
        {
            Date sentDate = nominatedInvitation.getSentInviteDate();
            assertTrue("sentDate wrong - too early. Start Date: " + startDate + "\nSent Date: " + sentDate,
                    sentDate.after(startDate));
            assertTrue("sentDate wrong - too lateStart Date: " + startDate + "\nSent Date: " + sentDate,
                    sentDate.before(new Date(new Date().getTime() + 1)));
        }

        assertEquals("resource type name wrong", resourceType, nominatedInvitation.getResourceType());
        assertEquals("resource name wrong", resourceName, nominatedInvitation.getResourceName());
        assertEquals("role  name wrong", inviteeRole, nominatedInvitation.getRoleName());
        assertEquals("server path wrong", serverPath, nominatedInvitation.getServerPath());
        assertEquals("accept URL wrong", acceptUrl, nominatedInvitation.getAcceptUrl());
        assertEquals("reject URL wrong", rejectUrl, nominatedInvitation.getRejectUrl());

        /**
         * Now we have an invitation get it and check the details have been
         * returned correctly.
         */
        {
            NominatedInvitation invitation = (NominatedInvitation) invitationService.getInvitation(inviteId);

            assertNotNull("invitation is null", invitation);
            assertEquals("invite id wrong", inviteId, invitation.getInviteId());
            assertEquals("first name wrong", inviteeFirstName, invitation.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, invitation.getInviteeLastName());
            assertEquals("user name wrong", inviteeUserName, invitation.getInviteeUserName());
            assertEquals("resource type name wrong", resourceType, invitation.getResourceType());
            assertEquals("resource name wrong", resourceName, invitation.getResourceName());
            assertEquals("role  name wrong", inviteeRole, invitation.getRoleName());
            assertEquals("server path wrong", serverPath, invitation.getServerPath());
            assertEquals("accept URL wrong", acceptUrl, invitation.getAcceptUrl());
            assertEquals("reject URL wrong", rejectUrl, invitation.getRejectUrl());

            Date sentDate = invitation.getSentInviteDate();
            // sentInviteDate should be set to today
            assertTrue("sentDate wrong too early", sentDate.after(startDate));
            assertTrue("sentDate wrong - too late", sentDate.before(new Date(new Date().getTime() + 1)));
        }

        /**
         * Check the email itself, and check it
         *  is as we would expect it to be
         */
        {
            MimeMessage msg = mailService.retrieveLastTestMessage();

            assertEquals(1, msg.getAllRecipients().length);
            assertEquals(inviteeEmail, msg.getAllRecipients()[0].toString());

            assertEquals(1, msg.getFrom().length);
            assertEquals(USER_MANAGER + "@alfrescotesting.com", msg.getFrom()[0].toString());

            // Hasn't been sent, so no sent or received date
            assertNull("Not been sent yet", msg.getSentDate());
            assertNull("Not been sent yet", msg.getReceivedDate());

            // TODO - check some more details of the email
            assertTrue((msg.getSubject().indexOf("You have been invited to join the") != -1));
        }

        /**
         * Search for the new invitation
         */
        List<Invitation> invitations = invitationService.listPendingInvitationsForResource(resourceType,
                resourceName);
        assertTrue("invitations is empty", !invitations.isEmpty());

        NominatedInvitation firstInvite = (NominatedInvitation) invitations.get(0);
        assertEquals("invite id wrong", inviteId, firstInvite.getInviteId());
        assertEquals("first name wrong", inviteeFirstName, firstInvite.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, firstInvite.getInviteeLastName());
        assertEquals("user name wrong", inviteeUserName, firstInvite.getInviteeUserName());

        /**
         * Now accept the invitation
         */
        NominatedInvitation acceptedInvitation = (NominatedInvitation) invitationService
                .accept(firstInvite.getInviteId(), firstInvite.getTicket());
        assertEquals("invite id wrong", firstInvite.getInviteId(), acceptedInvitation.getInviteId());
        assertEquals("first name wrong", inviteeFirstName, acceptedInvitation.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, acceptedInvitation.getInviteeLastName());
        assertEquals("user name wrong", inviteeUserName, acceptedInvitation.getInviteeUserName());

        List<Invitation> it4 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
        assertTrue("invitations is not empty", it4.isEmpty());

        /**
         * Now get the invitation that we accepted
         */
        NominatedInvitation acceptedInvitation2 = (NominatedInvitation) invitationService
                .getInvitation(firstInvite.getInviteId());
        assertNotNull("get after accept does not return", acceptedInvitation2);

        /**
         * Now verify access control list
         */
        String roleName = siteService.getMembersRole(resourceName, inviteeUserName);
        assertEquals("role name wrong", roleName, inviteeRole);
        siteService.removeMembership(resourceName, inviteeUserName);

        /**
         * Check that system generated invitations can work as well
         */
        {
            Field faf = mailService.getClass().getDeclaredField("fromAddress");
            faf.setAccessible(true);
            String defaultFromAddress = (String) ReflectionUtils.getField(faf, mailService);

            AuthenticationUtil.setFullyAuthenticatedUser(USER_NOEMAIL);

            // Check invitiation
            NominatedInvitation nominatedInvitation2 = invitationService.inviteNominated(inviteeFirstName,
                    inviteeLastName, USER_TWO_EMAIL, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                    rejectUrl);

            assertNotNull("nominated invitation is null", nominatedInvitation2);
            inviteId = nominatedInvitation.getInviteId();
            assertEquals("first name wrong", inviteeFirstName, nominatedInvitation2.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, nominatedInvitation2.getInviteeLastName());
            assertEquals("email name wrong", USER_TWO_EMAIL, nominatedInvitation2.getInviteeEmail());

            // Check the email
            MimeMessage msg = mailService.retrieveLastTestMessage();

            assertEquals(1, msg.getAllRecipients().length);
            assertEquals(USER_TWO_EMAIL, msg.getAllRecipients()[0].toString());

            assertEquals(1, msg.getFrom().length);
            assertEquals(defaultFromAddress, msg.getFrom()[0].toString());
        }
    }

    // TODO MER START
    /**
     * Test nominated user - new user who rejects invitation
     * 
     * @throws Exception
     */
    public void testNominatedInvitationNewUserReject() throws Exception {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND, -1);
        Date startDate = calendar.getTime();

        String inviteeFirstName = PERSON_FIRSTNAME;
        String inviteeLastName = PERSON_LASTNAME;
        String inviteeEmail = "123@alfrescotesting.com";
        String inviteeUserName = null;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(USER_MANAGER);

        NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeFirstName,
                inviteeLastName, inviteeEmail, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                rejectUrl);

        assertNotNull("nominated invitation is null", nominatedInvitation);
        assertEquals("first name wrong", inviteeFirstName, nominatedInvitation.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, nominatedInvitation.getInviteeLastName());
        assertEquals("email name wrong", inviteeEmail, nominatedInvitation.getInviteeEmail());

        // Generated User Name should be returned
        inviteeUserName = nominatedInvitation.getInviteeUserName();
        assertNotNull("generated user name is null", inviteeUserName);
        // sentInviteDate should be set to today
        {
            Date sentDate = nominatedInvitation.getSentInviteDate();
            assertTrue("sentDate wrong - too earlyStart Date: " + startDate + "\nSent Date: " + sentDate,
                    sentDate.after(startDate));
            assertTrue("sentDate wrong - too lateStart Date: " + startDate + "\nSent Date: " + sentDate,
                    sentDate.before(new Date(new Date().getTime() + 1)));
        }

        /**
         * Now reject the invitation
         */
        NominatedInvitation rejectedInvitation = (NominatedInvitation) invitationService
                .reject(nominatedInvitation.getInviteId(), "dont want it");
        assertEquals("invite id wrong", nominatedInvitation.getInviteId(), rejectedInvitation.getInviteId());
        assertEquals("first name wrong", inviteeFirstName, rejectedInvitation.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, rejectedInvitation.getInviteeLastName());
        assertEquals("user name wrong", inviteeUserName, rejectedInvitation.getInviteeUserName());

        List<Invitation> it4 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
        assertTrue("invitations is not empty", it4.isEmpty());

        /**
         * Now verify access control list inviteeUserName should not exist
         */
        String roleName = siteService.getMembersRole(resourceName, inviteeUserName);
        if (roleName != null) {
            fail("role has been set for a rejected user");
        }

        /**
         * Now verify that the generated user has been removed
         */
        if (personService.personExists(inviteeUserName)) {
            fail("generated user has not been cleaned up");
        }
    }

    // TODO MER END

    /**
     * Test nominated user - new user Creates two separate users with two the
     * same email address.
     * 
     * @throws Exception
     */
    public void testNominatedInvitationNewUserSameEmails() throws Exception {
        String inviteeAFirstName = "John";
        String inviteeALastName = "Smith";

        String inviteeBFirstName = "Jane";
        String inviteeBLastName = "Smith";

        String inviteeEmail = "123@alfrescotesting.com";
        String inviteeAUserName = null;
        String inviteeBUserName = null;

        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(USER_MANAGER);

        NominatedInvitation nominatedInvitationA = invitationService.inviteNominated(inviteeAFirstName,
                inviteeALastName, inviteeEmail, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                rejectUrl);

        assertNotNull("nominated invitation is null", nominatedInvitationA);
        String inviteAId = nominatedInvitationA.getInviteId();
        assertEquals("first name wrong", inviteeAFirstName, nominatedInvitationA.getInviteeFirstName());
        assertEquals("last name wrong", inviteeALastName, nominatedInvitationA.getInviteeLastName());
        assertEquals("email name wrong", inviteeEmail, nominatedInvitationA.getInviteeEmail());

        // Generated User Name should be returned
        inviteeAUserName = nominatedInvitationA.getInviteeUserName();
        assertNotNull("generated user name is null", inviteeAUserName);

        NominatedInvitation nominatedInvitationB = invitationService.inviteNominated(inviteeBFirstName,
                inviteeBLastName, inviteeEmail, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                rejectUrl);

        assertNotNull("nominated invitation is null", nominatedInvitationB);
        String inviteBId = nominatedInvitationB.getInviteId();
        assertEquals("first name wrong", inviteeBFirstName, nominatedInvitationB.getInviteeFirstName());
        assertEquals("last name wrong", inviteeBLastName, nominatedInvitationB.getInviteeLastName());
        assertEquals("email name wrong", inviteeEmail, nominatedInvitationB.getInviteeEmail());

        // Generated User Name should be returned
        inviteeBUserName = nominatedInvitationB.getInviteeUserName();
        assertNotNull("generated user name is null", inviteeBUserName);
        assertFalse("generated user names are the same", inviteeAUserName.equals(inviteeBUserName));

        /**
         * Now accept the invitation
         */
        NominatedInvitation acceptedInvitationA = (NominatedInvitation) invitationService.accept(inviteAId,
                nominatedInvitationA.getTicket());
        assertEquals("invite id wrong", inviteAId, acceptedInvitationA.getInviteId());
        assertEquals("first name wrong", inviteeAFirstName, acceptedInvitationA.getInviteeFirstName());
        assertEquals("last name wrong", inviteeALastName, acceptedInvitationA.getInviteeLastName());
        assertEquals("user name wrong", inviteeAUserName, acceptedInvitationA.getInviteeUserName());

        NominatedInvitation acceptedInvitationB = (NominatedInvitation) invitationService.accept(inviteBId,
                nominatedInvitationB.getTicket());
        assertEquals("invite id wrong", inviteBId, acceptedInvitationB.getInviteId());
        assertEquals("first name wrong", inviteeBFirstName, acceptedInvitationB.getInviteeFirstName());
        assertEquals("last name wrong", inviteeBLastName, acceptedInvitationB.getInviteeLastName());
        assertEquals("user name wrong", inviteeBUserName, acceptedInvitationB.getInviteeUserName());

        /**
         * Now verify access control list
         */
        String roleNameA = siteService.getMembersRole(resourceName, inviteeAUserName);
        assertEquals("role name wrong", roleNameA, inviteeRole);
        String roleNameB = siteService.getMembersRole(resourceName, inviteeBUserName);
        assertEquals("role name wrong", roleNameB, inviteeRole);
        siteService.removeMembership(resourceName, inviteeAUserName);
        siteService.removeMembership(resourceName, inviteeBUserName);
    }

    public void testMNT11775() throws Exception {
        String inviteeUserName = USER_TWO;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String comments = "please sir, let me in!";

        /**
         * New invitation from User TWO
         */
        this.authenticationComponent.setCurrentUser(USER_TWO);
        ModeratedInvitation invitation = invitationService.inviteModerated(comments, inviteeUserName, resourceType,
                resourceName, inviteeRole);

        String invitationId = invitation.getInviteId();

        /**
         * Reject the invitation
         */
        this.authenticationComponent.setCurrentUser(USER_MANAGER);
        invitationService.reject(invitationId, "Go away!");

        /**
         * Negative test attempt to approve an invitation that has been rejected
         */
        try {
            invitationService.approve(invitationId, "Have I not rejected this?");
            fail("rejected invitation not working");
        } catch (Exception e) {
            // An exception should have been thrown
            e.printStackTrace();
            System.out.println(e.toString());
        }

        /**
         * process email message template
         */
        try {
            // Build our model
            Map<String, Serializable> model = new HashMap<String, Serializable>(8, 1.0f);
            model.put("resourceName", resourceName);
            model.put("resourceType", resourceType);
            model.put("inviteeRole", inviteeRole);
            model.put("reviewComments", "Go away!");
            model.put("inviteeUserName", inviteeUserName);

            // Process the template
            String emailMsg = templateService.processTemplate("freemarker",
                    "/alfresco/bootstrap/invite/moderated-reject-email.ftl", model);

            assertNotNull("Email message is null", emailMsg);
            assertTrue("Email message doesn't contain review comment", emailMsg.contains("Go away!"));
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.toString());
            fail("Process email message template exception");
        }
    }

    /**
     * MNT-15614 Site with name "IT" cannot be managed properly
     * 
     * @throws Exception
     */
    public void test_MNT15614() throws Exception {
        String[] siteNames = { "it", "site", "GROUP" };
        String inviteeUserName = USER_ONE;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;

        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());

        for (String siteName : siteNames) {
            SiteInfo siteInfoRed = siteService.getSite(siteName);
            if (siteInfoRed == null) {
                siteService.createSite("InviteSitePreset", siteName, "InviteSiteTitle", "InviteSiteDescription",
                        SiteVisibility.MODERATED);
            }

            // Invite user
            NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeUserName,
                    resourceType, siteName, inviteeRole, acceptUrl, rejectUrl);
            assertNotNull("nominated invitation is null", nominatedInvitation);
        }
    }

    /**
     * Test nominated user - new user with whitespace in name. Related to
     * ETHREEOH-3030.
     */
    public void testNominatedInvitationNewUserWhitespace() throws Exception {
        String inviteeFirstName = PERSON_FIRSTNAME_SPACES;
        String inviteeLastName = PERSON_LASTNAME_SPACES;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeEmail = "123@alfrescotesting.com";
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";
        String expectedUserName = (inviteeFirstName + "_" + inviteeLastName).toLowerCase();
        expectedUserName = expectedUserName.replaceAll("\\s+", "_");
        authenticationComponent.setCurrentUser(USER_MANAGER);

        NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeFirstName,
                inviteeLastName, inviteeEmail, resourceType, resourceName, inviteeRole, serverPath, acceptUrl,
                rejectUrl);

        assertNotNull("nominated invitation is null", nominatedInvitation);
        assertEquals("Wrong username!", expectedUserName, nominatedInvitation.getInviteeUserName());

        String inviteId = nominatedInvitation.getInviteId();

        // Now we have an invitation get it and check the details have been
        // returned correctly.
        NominatedInvitation invitation = (NominatedInvitation) invitationService.getInvitation(inviteId);
        assertNotNull("invitation is null", invitation);
        assertEquals("first name wrong", inviteeFirstName, invitation.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, invitation.getInviteeLastName());
        assertEquals("user name wrong", expectedUserName, invitation.getInviteeUserName());

        // Now accept the invitation
        NominatedInvitation acceptedInvitation = (NominatedInvitation) invitationService
                .accept(invitation.getInviteId(), invitation.getTicket());

        assertEquals("first name wrong", inviteeFirstName, acceptedInvitation.getInviteeFirstName());
        assertEquals("last name wrong", inviteeLastName, acceptedInvitation.getInviteeLastName());
        assertEquals("user name wrong", expectedUserName, acceptedInvitation.getInviteeUserName());

        // Now verify access control list
        String roleName = siteService.getMembersRole(resourceName, expectedUserName);
        assertEquals("role name wrong", roleName, inviteeRole);
        siteService.removeMembership(resourceName, expectedUserName);
    }

    /**
     * If requireAcceptance=true skip to C1
     * 
     * A1. Create a Nominated Invitation (for existing user, USER_ONE)
     * A2. Read it
     * A3. Search for it.
     * A4. Cancel it
     * A5. Search for it again (and fail to find it)
     * 
     * B1. Create a Nominated Invitation
     * B2. Read it
     * B3. Search for it
     * B4. Reject it
     * 
     * C1. Create a Nominated Invitation
     * C2. Read it
     * C3. Accept it
     * C4. Verify ACL
     * 
     * @param requireAcceptance true if a workflow requiring acceptance is being used
     * @throws Exception
     */
    protected void testNominatedInvitationExistingUser(boolean requireAcceptance) throws Exception {
        String inviteeUserName = USER_ONE;
        String inviteeEmail = USER_ONE_EMAIL;
        String inviteeFirstName = USER_ONE_FIRSTNAME;
        String inviteeLastName = USER_ONE_LASTNAME;

        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        authenticationComponent.setCurrentUser(USER_MANAGER);

        if (requireAcceptance) {
            NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeUserName,
                    resourceType, resourceName, inviteeRole, serverPath, acceptUrl, rejectUrl);

            assertNotNull("nominated invitation is null", nominatedInvitation);
            String inviteId = nominatedInvitation.getInviteId();
            assertEquals("user name wrong", inviteeUserName, nominatedInvitation.getInviteeUserName());
            assertEquals("resource type name wrong", resourceType, nominatedInvitation.getResourceType());
            assertEquals("resource name wrong", resourceName, nominatedInvitation.getResourceName());
            assertEquals("role  name wrong", inviteeRole, nominatedInvitation.getRoleName());
            assertEquals("server path wrong", serverPath, nominatedInvitation.getServerPath());
            assertEquals("accept URL wrong", acceptUrl, nominatedInvitation.getAcceptUrl());
            assertEquals("reject URL wrong", rejectUrl, nominatedInvitation.getRejectUrl());

            // These values should be read from the person record
            assertEquals("first name wrong", inviteeFirstName, nominatedInvitation.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, nominatedInvitation.getInviteeLastName());
            assertEquals("email name wrong", inviteeEmail, nominatedInvitation.getInviteeEmail());

            /**
             * Now we have an invitation get it and check the details have been
             * returned correctly.
             */
            NominatedInvitation invitation = (NominatedInvitation) invitationService.getInvitation(inviteId);

            assertNotNull("invitation is null", invitation);
            assertEquals("invite id wrong", inviteId, invitation.getInviteId());
            assertEquals("user name wrong", inviteeUserName, nominatedInvitation.getInviteeUserName());
            assertEquals("resource type name wrong", resourceType, invitation.getResourceType());
            assertEquals("resource name wrong", resourceName, invitation.getResourceName());
            assertEquals("role  name wrong", inviteeRole, invitation.getRoleName());
            assertEquals("server path wrong", serverPath, invitation.getServerPath());
            assertEquals("accept URL wrong", acceptUrl, invitation.getAcceptUrl());
            assertEquals("reject URL wrong", rejectUrl, invitation.getRejectUrl());

            // These values should have been read from the DB
            assertEquals("first name wrong", inviteeFirstName, invitation.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, invitation.getInviteeLastName());
            assertEquals("email name wrong", inviteeEmail, invitation.getInviteeEmail());

            /**
             * Search for the new invitation
             */
            List<Invitation> invitations = invitationService.listPendingInvitationsForResource(resourceType,
                    resourceName);
            assertTrue("invitations is empty", !invitations.isEmpty());

            NominatedInvitation firstInvite = (NominatedInvitation) invitations.get(0);
            assertEquals("invite id wrong", inviteId, firstInvite.getInviteId());
            assertEquals("first name wrong", inviteeFirstName, firstInvite.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, firstInvite.getInviteeLastName());
            assertEquals("user name wrong", inviteeUserName, firstInvite.getInviteeUserName());

            /**
             * Now cancel the invitation
             */
            NominatedInvitation canceledInvitation = (NominatedInvitation) invitationService.cancel(inviteId);
            assertEquals("invite id wrong", inviteId, canceledInvitation.getInviteId());
            assertEquals("first name wrong", inviteeFirstName, canceledInvitation.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, canceledInvitation.getInviteeLastName());
            assertEquals("user name wrong", inviteeUserName, canceledInvitation.getInviteeUserName());

            /**
             * Do the query again - should no longer find anything
             */
            List<Invitation> it2 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
            assertTrue("invitations is not empty", it2.isEmpty());

            /**
             * Now invite and reject
             */
            NominatedInvitation secondInvite = invitationService.inviteNominated(inviteeUserName, resourceType,
                    resourceName, inviteeRole, serverPath, acceptUrl, rejectUrl);

            NominatedInvitation rejectedInvitation = (NominatedInvitation) invitationService
                    .cancel(secondInvite.getInviteId());
            assertEquals("invite id wrong", secondInvite.getInviteId(), rejectedInvitation.getInviteId());
            assertEquals("user name wrong", inviteeUserName, rejectedInvitation.getInviteeUserName());

            List<Invitation> it3 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
            assertTrue("invitations is not empty", it3.isEmpty());
        }

        /**
         * Now invite and accept
         */
        NominatedInvitation thirdInvite = invitationService.inviteNominated(inviteeUserName, resourceType,
                resourceName, inviteeRole, serverPath, acceptUrl, rejectUrl);
        if (requireAcceptance) {
            NominatedInvitation acceptedInvitation = (NominatedInvitation) invitationService
                    .accept(thirdInvite.getInviteId(), thirdInvite.getTicket());
            assertEquals("invite id wrong", thirdInvite.getInviteId(), acceptedInvitation.getInviteId());
            assertEquals("first name wrong", inviteeFirstName, acceptedInvitation.getInviteeFirstName());
            assertEquals("last name wrong", inviteeLastName, acceptedInvitation.getInviteeLastName());
            assertEquals("user name wrong", inviteeUserName, acceptedInvitation.getInviteeUserName());
        }

        List<Invitation> it4 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
        assertTrue("invitations is not empty", it4.isEmpty());

        /**
         * Now verify access control list
         */
        String roleName = siteService.getMembersRole(resourceName, inviteeUserName);
        assertEquals("role name wrong", inviteeRole, roleName);
        siteService.removeMembership(resourceName, inviteeUserName);
    }

    public void testNominatedInvitationExistingUser() throws Exception {
        this.invitationServiceImpl.setNominatedInvitationWorkflowId(
                WorkflowModelNominatedInvitation.WORKFLOW_DEFINITION_NAME_ACTIVITI_INVITE);
        testNominatedInvitationExistingUser(true);
    }

    /**
     * Create a moderated invitation Get it Search for it Cancel it Create a
     * moderated invitation Reject the invitation Create a moderated invitation
     * Approve the invitation
     */
    public void testModeratedInvitation() {
        String inviteeUserName = USER_TWO;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String comments = "please sir, let me in!";

        this.authenticationComponent.setCurrentUser(USER_TWO);
        ModeratedInvitation invitation = invitationService.inviteModerated(comments, inviteeUserName, resourceType,
                resourceName, inviteeRole);

        assertNotNull("moderated invitation is null", invitation);
        String inviteId = invitation.getInviteId();
        assertEquals("user name wrong", inviteeUserName, invitation.getInviteeUserName());
        assertEquals("role  name wrong", inviteeRole, invitation.getRoleName());
        assertEquals("comments", comments, invitation.getInviteeComments());
        assertEquals("resource type name wrong", resourceType, invitation.getResourceType());
        assertEquals("resource name wrong", resourceName, invitation.getResourceName());

        /**
         * Now we have an invitation get it and check the details have been
         * returned correctly.
         */
        ModeratedInvitation mi2 = (ModeratedInvitation) invitationService.getInvitation(inviteId);
        assertEquals("invite id", inviteId, mi2.getInviteId());
        assertEquals("user name wrong", inviteeUserName, mi2.getInviteeUserName());
        assertEquals("role  name wrong", inviteeRole, mi2.getRoleName());
        assertEquals("comments", comments, mi2.getInviteeComments());
        assertEquals("resource type name wrong", resourceType, mi2.getResourceType());
        assertEquals("resource name wrong", resourceName, mi2.getResourceName());

        /**
         * Search for the new invitation
         */
        List<Invitation> invitations = invitationService.listPendingInvitationsForResource(resourceType,
                resourceName);
        assertTrue("invitations is empty", !invitations.isEmpty());

        ModeratedInvitation firstInvite = (ModeratedInvitation) invitations.get(0);
        assertEquals("invite id wrong", inviteId, firstInvite.getInviteId());

        /**
         * Cancel the invitation
         */
        ModeratedInvitation canceledInvitation = (ModeratedInvitation) invitationService.cancel(inviteId);
        assertEquals("invite id wrong", inviteId, canceledInvitation.getInviteId());
        assertEquals("comments wrong", comments, canceledInvitation.getInviteeComments());

        /**
         * Should now be no invitation
         */
        List<Invitation> inv2 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
        assertTrue("After cancel invitations is not empty", inv2.isEmpty());

        /**
         * New invitation
         */
        this.authenticationComponent.setCurrentUser(USER_TWO);
        ModeratedInvitation invite2 = invitationService.inviteModerated(comments, inviteeUserName, resourceType,
                resourceName, inviteeRole);

        String secondInvite = invite2.getInviteId();

        this.authenticationComponent.setCurrentUser(USER_MANAGER);
        invitationService.reject(secondInvite, "This is a test reject");

        /**
         * New invitation
         */
        this.authenticationComponent.setCurrentUser(USER_TWO);
        ModeratedInvitation invite3 = invitationService.inviteModerated(comments, inviteeUserName, resourceType,
                resourceName, inviteeRole);

        String thirdInvite = invite3.getInviteId();

        this.authenticationComponent.setCurrentUser(USER_MANAGER);
        invitationService.approve(thirdInvite, "Welcome in");

        /**
         * Now verify access control list
         */
        String roleName = siteService.getMembersRole(resourceName, inviteeUserName);
        assertEquals("role name wrong", inviteeRole, roleName);
        siteService.removeMembership(resourceName, inviteeUserName);

    }

    /**
     * Test the approval of a moderated invitation
     */
    public void testModeratedApprove() {
        String inviteeUserName = USER_TWO;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String comments = "please sir, let me in!";

        /**
         * New invitation from User TWO
         */
        this.authenticationComponent.setCurrentUser(USER_TWO);
        ModeratedInvitation invitation = invitationService.inviteModerated(comments, inviteeUserName, resourceType,
                resourceName, inviteeRole);

        String invitationId = invitation.getInviteId();

        /**
         * Negative test Attempt to approve without the necessary role
         */
        try {
            invitationService.approve(invitationId, "No Way Hosea!");
            fail("excetion not thrown");

        } catch (Exception e) {
            // An exception should have been thrown
            e.printStackTrace();
            System.out.println(e.toString());
        }

        /**
         * Approve the invitation
         */
        this.authenticationComponent.setCurrentUser(USER_MANAGER);
        invitationService.approve(invitationId, "Come on in");

        /**
         * Now verify access control list contains user two
         */
        String roleName = siteService.getMembersRole(resourceName, inviteeUserName);
        assertEquals("role name wrong", inviteeRole, roleName);

        /**
         * Negative test attempt to approve an invitation that has aready been
         * approved
         */
        try {
            invitationService.approve(invitationId, "Have I not already done this?");
            fail("duplicate approve excetion not thrown");
        } catch (Exception e) {
            // An exception should have been thrown
            e.printStackTrace();
            System.out.println(e.toString());
        }
        /**
         * Negative test User is already a member of the site
         */
        siteService.removeMembership(resourceName, inviteeUserName);
    }

    /**
     * Tests of Moderated Reject
     */
    public void testModeratedReject() {
        String inviteeUserName = USER_TWO;
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String comments = "please sir, let me in!";

        /**
         * New invitation from User TWO
         */
        this.authenticationComponent.setCurrentUser(USER_TWO);
        ModeratedInvitation invitation = invitationService.inviteModerated(comments, inviteeUserName, resourceType,
                resourceName, inviteeRole);

        String invitationId = invitation.getInviteId();

        /**
         * Negative test Attempt to reject without the necessary role
         */
        try {
            invitationService.reject(invitationId, "No Way Hosea!");
            fail("excetion not thrown");

        } catch (Exception e) {
            // An exception should have been thrown
            e.printStackTrace();
            System.out.println(e.toString());
        }

        /**
         * Reject the invitation
         */
        this.authenticationComponent.setCurrentUser(USER_MANAGER);
        invitationService.reject(invitationId, "Go away!");

        /**
         * Negative test attempt to approve an invitation that has been rejected
         */
        try {
            invitationService.approve(invitationId, "Have I not rejected this?");
            fail("rejected invitation not working");
        } catch (Exception e) {
            // An exception should have been thrown
            e.printStackTrace();
            System.out.println(e.toString());
        }
    }

    /**
     * Test search invitation
     */
    public void testSearchInvitation() {
        /**
         * Make up a tree of invitations and then search Resource, User,
         * Workflow 1) RED, One, Moderated 2) RED, One, Nominated 3) BLUE, One,
         * Nominated 4) RED, Two, Moderated
         */
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String comments = "please sir, let me in!";
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        this.authenticationComponent.setCurrentUser(USER_MANAGER);
        invitationService.inviteModerated(comments, USER_ONE, resourceType, SITE_SHORT_NAME_RED, inviteeRole);

        invitationService.inviteNominated(USER_ONE, resourceType, SITE_SHORT_NAME_RED, inviteeRole, serverPath,
                acceptUrl, rejectUrl);

        NominatedInvitation invitationThree = invitationService.inviteNominated(USER_ONE, resourceType,
                SITE_SHORT_NAME_BLUE, inviteeRole, serverPath, acceptUrl, rejectUrl);
        String threeId = invitationThree.getInviteId();

        invitationService.inviteModerated(comments, USER_TWO, resourceType, SITE_SHORT_NAME_RED, inviteeRole);

        /**
         * Search for invitations for BLUE
         */
        List<Invitation> resOne = invitationService.listPendingInvitationsForResource(ResourceType.WEB_SITE,
                SITE_SHORT_NAME_BLUE);
        assertEquals("blue invites not 1", 1, resOne.size());
        assertEquals("blue id wrong", threeId, resOne.get(0).getInviteId());

        /**
         * Search for invitations for RED
         */
        List<Invitation> resTwo = invitationService.listPendingInvitationsForResource(ResourceType.WEB_SITE,
                SITE_SHORT_NAME_RED);
        assertEquals("red invites not 3", 3, resTwo.size());

        /**
         * Search for invitations for USER_ONE
         */
        List<Invitation> resThree = invitationService.listPendingInvitationsForInvitee(USER_ONE);
        assertEquals("user one does not have 3 invitations", 3, resThree.size());

        /**
         * Search for invitations for USER_TWO
         */
        List<Invitation> resFour = invitationService.listPendingInvitationsForInvitee(USER_TWO);
        assertEquals("user two does not have 1 invitations", 1, resFour.size());

        /**
         * Search for user1's nominated invitations
         */
        InvitationSearchCriteriaImpl crit1 = new InvitationSearchCriteriaImpl();
        crit1.setInvitee(USER_ONE);
        crit1.setInvitationType(InvitationSearchCriteria.InvitationType.NOMINATED);

        List<Invitation> resFive = invitationService.searchInvitation(crit1);
        assertEquals("user one does not have 2 nominated", 2, resFive.size());

        // now limit the search to 1 returned value
        List<Invitation> limitRes = invitationService.searchInvitation(crit1, 1);
        assertEquals("user one does not have 1 nominated", 1, limitRes.size());

        /**
         * Search with an empty criteria - should find all open invitations
         */
        InvitationSearchCriteria crit2 = new InvitationSearchCriteriaImpl();
        invitationService.searchInvitation(crit2);
        assertTrue("search everything returned 0 elements", resFive.size() > 0);

        // now search everything but limit the results to 3
        invitationService.searchInvitation(crit2, 3);
        assertTrue("search everything returned 0 or more than 3 elements",
                resFive.size() > 0 && resFive.size() <= 3);

        InvitationSearchCriteriaImpl crit3 = new InvitationSearchCriteriaImpl();
        crit3.setInviter(USER_MANAGER);
        crit3.setInvitationType(InvitationSearchCriteria.InvitationType.NOMINATED);

        List<Invitation> res3 = invitationService.searchInvitation(crit3);
        assertEquals("user one does not have 2 nominated", 2, res3.size());

        //now limit the search to 1 result
        res3 = invitationService.searchInvitation(crit3, 1);
        assertEquals("user one does not have 1 nominated", 1, res3.size());
    }

    /**
     * test that the search limiter works
     */
    public void testSearchInvitationWithLimit() throws Exception {
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        authenticationComponent.setCurrentUser(USER_MANAGER);

        // Create 10 invites
        for (int i = 0; i < 10; i++) {
            invitationService.inviteNominated(USER_ONE, resourceType, resourceName, inviteeRole, serverPath,
                    acceptUrl, rejectUrl);
        }

        // Invite USER_TWO
        NominatedInvitation inviteForUserTwo = invitationService.inviteNominated(USER_TWO, resourceType,
                resourceName, inviteeRole, serverPath, acceptUrl, rejectUrl);

        InvitationSearchCriteriaImpl query = new InvitationSearchCriteriaImpl();
        query.setInvitee(USER_TWO);

        // search all of them
        List<Invitation> results = invitationService.searchInvitation(query, 0);
        assertEquals(1, results.size());
        assertEquals(inviteForUserTwo.getInviteId(), results.get(0).getInviteId());

        query = new InvitationSearchCriteriaImpl();
        query.setInvitee(USER_ONE);

        final int MAX_SEARCH = 3;
        // only search for the first MAX_SEARCH
        results = invitationService.searchInvitation(query, MAX_SEARCH);
        assertEquals(MAX_SEARCH, results.size());
    }

    public void disabled_test100Invites() throws Exception {
        Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
        String resourceName = SITE_SHORT_NAME_INVITE;
        String inviteeRole = SiteModel.SITE_COLLABORATOR;
        String serverPath = "wibble";
        String acceptUrl = "froob";
        String rejectUrl = "marshmallow";

        authenticationComponent.setCurrentUser(USER_MANAGER);

        // Create 1000 invites
        for (int i = 0; i < 1000; i++) {
            invitationService.inviteNominated(USER_ONE, resourceType, resourceName, inviteeRole, serverPath,
                    acceptUrl, rejectUrl);
        }

        // Invite USER_TWO 
        NominatedInvitation invite = invitationService.inviteNominated(USER_TWO, resourceType, resourceName,
                inviteeRole, serverPath, acceptUrl, rejectUrl);

        InvitationSearchCriteriaImpl query = new InvitationSearchCriteriaImpl();
        query.setInvitee(USER_TWO);

        long start = System.currentTimeMillis();
        List<Invitation> results = invitationService.searchInvitation(query);
        long end = System.currentTimeMillis();
        System.out.println("Invitation Search took " + (end - start) + "ms.");

        assertEquals(1, results.size());
        assertEquals(invite.getInviteId(), results.get(0).getInviteId());
        this.setComplete();
        this.endTransaction();

    }

    public void testGetInvitation() {
        try {
            /**
             * Get an invitation that does not exist.
             */
            invitationService.getInvitation("jbpm$99999999");
            fail("should have thrown an exception");
        } catch (Exception e) {
            // should have gone here
        }
    }

    private void createPerson(String userName, String emailAddress, String firstName, String lastName) {
        // if user with given user name doesn't already exist then create user
        if (this.authenticationService.authenticationExists(userName) == false) {
            // create user
            this.authenticationService.createAuthentication(userName, "password".toCharArray());
        }

        // if person node with given user name doesn't already exist then create
        // person
        if (this.personService.personExists(userName) == false) {
            // create person properties
            PropertyMap personProps = new PropertyMap();
            personProps.put(ContentModel.PROP_USERNAME, userName);
            personProps.put(ContentModel.PROP_FIRSTNAME, firstName);
            personProps.put(ContentModel.PROP_LASTNAME, lastName);
            personProps.put(ContentModel.PROP_EMAIL, emailAddress);
            personProps.put(ContentModel.PROP_JOBTITLE, PERSON_JOBTITLE);
            personProps.put(ContentModel.PROP_ORGANIZATION, PERSON_ORG);

            // create person node for user
            this.personService.createPerson(personProps);
        }
    }

    private void deletePersonByUserName(String userName) {
        // delete person node associated with given user name
        // if one exists
        if (this.personService.personExists(userName)) {
            this.personService.deletePerson(userName);
        }
    }
}