diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitation.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitation.lib.ftl index fd31738fff..3c28a3306a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitation.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitation.lib.ftl @@ -1,19 +1,31 @@ <#-- renders an invitation object which can be either a MODERATED or NOMINATED invitation--> -<#macro invitationJSON invitation> +<#macro invitationJSON invitation avatars={"" : ""} > <#escape x as jsonUtils.encodeJSONString(x)> { "inviteId": "${invitation.inviteId}", "inviteeUserName": "${invitation.inviteeUserName}", - <#if invitation.roleName??>"roleName": "${invitation.roleName}", + "invitee": + { + <#if invitation.inviteeFirstName??>"firstName": "${invitation.inviteeFirstName}", + <#if invitation.inviteeLastName??>"lastName": "${invitation.inviteeLastName}", + <#if invitation.inviteeEmail??>"email": "${invitation.inviteeEmail}", + <#assign userName = invitation.inviteeUserName> + <#if avatars[userName]??>"avatar" : "${avatars[userName]}", + "userName": "${invitation.inviteeUserName}" + }, <#-- Moderated invitation properties --> <#if invitation.inviteeComments??>"inviteeComments": "${invitation.inviteeComments}", + <#if invitation.roleName??>"roleName": "${invitation.roleName}", <#-- Nominated invitation properties --> <#if invitation.acceptURL??>"acceptURL": "${invitation.acceptURL}", - <#if invitation.acceptURL??>"rejectURL": "${invitation.rejectURL}", - <#if invitation.sentInviteDateAsISO8601??>"sentInviteDate" : { "iso8601" : "${invitation.sentInviteDateAsISO8601}" }, - <#if invitation.inviteeFirstName??>"inviteeFirstName": "${invitation.inviteeFirstName}", - <#if invitation.inviteeLastName??>"inviteeLastName": "${invitation.inviteeLastName}", - <#if invitation.inviteeEmail??>"inviteeEmail": "${invitation.inviteeEmail}", + <#if invitation.rejectURL??>"rejectURL": "${invitation.rejectURL}", + <#if invitation.sentInviteDateAsISO8601??> + "sentInviteDate" : + { + "iso8601" : "${invitation.sentInviteDateAsISO8601}" + }, + + <#if invitation.inviterUserName??>"inviterUserName": "${invitation.inviterUserName}", <#-- put a mandatory property at the end to deal cleanly with training commas --> "resourceType": "${invitation.resourceType}", "resourceName": "${invitation.resourceName}", diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.desc.xml index d359836fb9..4c2e5c98b6 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.desc.xml @@ -1,7 +1,7 @@ List Invitations With no parameters, returns all open invitations (which could be a large number).
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.js index f6dd93342b..f45da443ec 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.js @@ -34,8 +34,28 @@ function main() var invites = invitations.listInvitations(props); + //Get the avatars for the invitees. + var avatars = new Object(); + for (var i = 0; i0) + { + var avatar = 'api/node/'; + avatar = avatar + assocs[0].nodeRef.toString(); + avatar = avatar + '/content/thumbnails/avatar'; + avatars[userName] = avatar; + } + } + } // Pass the information to the template model.invitations = invites; + model.avatars = avatars; } main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.json.ftl index 1f422f89e8..213e99e3ed 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/invitation/invitations.get.json.ftl @@ -4,7 +4,7 @@ { "data": [ <#list invitations as invitation> - <@invitationLib.invitationJSON invitation=invitation /> + <@invitationLib.invitationJSON invitation=invitation avatars=avatars/> <#if invitation_has_next>, ] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.js index b638528b78..1bcb454922 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.js @@ -24,9 +24,26 @@ function main() return; } + var avatars = new Object(); + // Get the avatar. + var userName = invitation.inviteeUserName; + var person = people.getPerson(userName); + if (person != undefined && person !=null) + { + var assocs = person.assocs['{http://www.alfresco.org/model/content/1.0}avatar']; + if (assocs !=null && assocs.length>0) + { + var avatar = 'api/node/'; + avatar = avatar + assocs[0].nodeRef.toString(); + avatar = avatar + '/content/thumbnails/avatar'; + avatars[userName] = avatar; + } + } + // Pass the model to the template model.invitation = invitation; model.site = site; + model.avatars=avatars; } main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.json.ftl index 748a2d2025..1dee5928b7 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.get.json.ftl @@ -1,5 +1,5 @@ <#-- Get Invitation --> <#import "../../invitation/invitation.lib.ftl" as invitationLib/> { - "data":<@invitationLib.invitationJSON invitation=invitation /> + "data":<@invitationLib.invitationJSON invitation=invitation avatars=avatars /> } diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.post.json.ftl index 247d463fe8..d1c0afcfe3 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.post.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitation.post.json.ftl @@ -1,5 +1,5 @@ <#-- Create / Post / Invitation --> <#import "../../invitation/invitation.lib.ftl" as invitationLib/> { - "data":<@invitationLib.invitationJSON invitation=invitation /> + "data":<@invitationLib.invitationJSON invitation=invitation /> } \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.js index 4d5b52a511..55189acd1d 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.js @@ -30,10 +30,32 @@ function main () props.invitationType = invitationType } - var invitations = site.listInvitations(props); + var invites = site.listInvitations(props); + + //Get the avatars for the invitees. + var avatars = new Object(); + for (var i = 0; i0) + { + var avatar = 'api/node/'; + avatar = avatar + assocs[0].nodeRef.toString(); + avatar = avatar + '/content/thumbnails/avatar'; + avatars[userName] = avatar; + } + } + } + // Pass the information to the template - model.invitations = invitations; + model.invitations = invites; + model.avatars = avatars; } main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.json.ftl index 7f94a663f4..8108aa1ac7 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/invitation/invitations.get.json.ftl @@ -4,7 +4,7 @@ { "data": [ <#list invitations as invitation> - <@invitationLib.invitationJSON invitation=invitation /> + <@invitationLib.invitationJSON invitation=invitation avatars=avatars /> <#if invitation_has_next>, ] diff --git a/source/java/org/alfresco/repo/web/scripts/invitation/InvitationTest.java b/source/java/org/alfresco/repo/web/scripts/invitation/InvitationTest.java index f3065a1649..445b168f2f 100644 --- a/source/java/org/alfresco/repo/web/scripts/invitation/InvitationTest.java +++ b/source/java/org/alfresco/repo/web/scripts/invitation/InvitationTest.java @@ -19,22 +19,28 @@ package org.alfresco.repo.web.scripts.invitation; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.alfresco.model.ContentModel; -import org.alfresco.repo.action.executer.MailActionExecuter; +import org.alfresco.repo.action.executer.TestModeable; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.web.scripts.BaseWebScriptTest; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.site.SiteVisibility; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; import org.alfresco.util.GUID; import org.alfresco.util.PropertyMap; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.springframework.extensions.webscripts.TestWebScriptServer.DeleteRequest; import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest; @@ -49,144 +55,166 @@ import org.springframework.extensions.webscripts.TestWebScriptServer.Response; * @author Mark Rogers */ public class InvitationTest extends BaseWebScriptTest -{ +{ + private final static QName avatarQName = QName.createQName(NamespaceService.APP_MODEL_1_0_URI, "test"); + private MutableAuthenticationService authenticationService; private AuthenticationComponent authenticationComponent; private PersonService personService; - private SiteService siteService; private NodeService nodeService; - - private static final String USER_ONE = "InvitationTestOne"; - private static final String USER_TWO = "InvitationTestTwo"; - private static final String USER_THREE = "InvitationTestThree"; - + + private String userOne = "InvitationTestOne" + GUID.generate(); + private String userTwo = "InvitationTestTwo" + GUID.generate(); + private String userThree = "InvitationTestThree" + GUID.generate(); + private static final String URL_SITES = "/api/sites"; private static final String URL_INVITATIONS = "/api/invitations"; - private List createdSites = new ArrayList(5); private List createdInvitations = new ArrayList(10); - + private TestModeable mailActionExecutor; + + private final Map> userProperties = new HashMap>(3); + private class Tracker { - public Tracker(String inviteId, String siteName) - { - this.inviteId = inviteId; - this.siteName = siteName; - } - public String inviteId; - public String siteName; + public Tracker(String inviteId, String siteName) + { + this.inviteId = inviteId; + this.siteName = siteName; + } + + public String inviteId; + public String siteName; } - + @Override protected void setUp() throws Exception { super.setUp(); - - this.authenticationService = (MutableAuthenticationService)getServer().getApplicationContext().getBean("AuthenticationService"); - this.authenticationComponent = (AuthenticationComponent)getServer().getApplicationContext().getBean("authenticationComponent"); - this.personService = (PersonService)getServer().getApplicationContext().getBean("PersonService"); - this.siteService = (SiteService)getServer().getApplicationContext().getBean("SiteService"); - this.nodeService = (NodeService)getServer().getApplicationContext().getBean("NodeService"); - - // TODO MER 20/11/2009 Bodge - turn off email sending to prevent errors during unit testing + + this.authenticationService = (MutableAuthenticationService) getServer().getApplicationContext().getBean( + "AuthenticationService"); + this.authenticationComponent = (AuthenticationComponent) getServer().getApplicationContext().getBean( + "authenticationComponent"); + this.personService = (PersonService) getServer().getApplicationContext().getBean("PersonService"); + this.nodeService = (NodeService) getServer().getApplicationContext().getBean("NodeService"); + + // TODO MER 20/11/2009 Bodge - turn off email sending to prevent errors + // during unit testing // (or sending out email by accident from tests) - MailActionExecuter mail = (MailActionExecuter) getServer().getApplicationContext().getBean("mail"); - mail.setTestMode(true); - + mailActionExecutor = (TestModeable) getServer().getApplicationContext().getBean("mail"); + mailActionExecutor.setTestMode(true); + this.authenticationComponent.setSystemUserAsCurrentUser(); - + // Create users - createUser(USER_ONE); - createUser(USER_TWO); - createUser(USER_THREE); - + createUser(userOne, "Joe", "Bloggs"); + createUser(userTwo, "Jane", "Doe"); + createUser(userThree, "Nick", "Smith"); + // Do tests as user one - this.authenticationComponent.setCurrentUser(USER_ONE); + this.authenticationComponent.setCurrentUser(userOne); } - - private void createUser(String userName) + + private void createUser(String userName, String firstName, String lastName) { - if (this.authenticationService.authenticationExists(userName) == false) - { - this.authenticationService.createAuthentication(userName, "PWD".toCharArray()); - - PropertyMap ppOne = new PropertyMap(4); - ppOne.put(ContentModel.PROP_USERNAME, userName); - ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); - ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); - ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); - ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); - - this.personService.createPerson(ppOne); - } + this.authenticationService.createAuthentication(userName, "PWD".toCharArray()); + PropertyMap ppOne = new PropertyMap(5); + ppOne.put(ContentModel.PROP_USERNAME, userName); + ppOne.put(ContentModel.PROP_FIRSTNAME, firstName); + ppOne.put(ContentModel.PROP_LASTNAME, lastName); + String email = firstName+"@email.com"; + ppOne.put(ContentModel.PROP_EMAIL, email); + ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); + NodeRef person = personService.createPerson(ppOne); + String avatarUrl = makeAvatar(person); + + // Create expected user properties + HashMap properties = new HashMap(4); + properties.put("firstName", firstName); + properties.put("lastName", lastName); + properties.put("email", email); + properties.put("avatar", avatarUrl); + userProperties.put(userName, properties); } - + @Override protected void tearDown() throws Exception { super.tearDown(); this.authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName()); - - // Tidy-up any site's create during the execution of the test + + // Tidy-up any site's created during the execution of the test for (String shortName : this.createdSites) { sendRequest(new DeleteRequest(URL_SITES + "/" + shortName), 0); } - + // Clear the list this.createdSites.clear(); - + for (Tracker invite : this.createdInvitations) { sendRequest(new DeleteRequest(URL_SITES + "/" + invite.siteName + "/invitations/" + invite.inviteId), 0); } - + // Clear the list - this.createdSites.clear(); + this.createdInvitations.clear(); + + // Switch the MailActionExecutor back to normal mode. + mailActionExecutor.setTestMode(false); + personService.deletePerson(userOne); + personService.deletePerson(userTwo); + personService.deletePerson(userThree); } - - private JSONObject createSite(String sitePreset, String shortName, String title, String description, SiteVisibility visibility, int expectedStatus) - throws Exception + + private JSONObject createSite(String sitePreset, String shortName, String title, String description, + SiteVisibility visibility, int expectedStatus) throws Exception { JSONObject site = new JSONObject(); site.put("sitePreset", sitePreset); site.put("shortName", shortName); site.put("title", title); site.put("description", description); - site.put("visibility", visibility.toString()); - Response response = sendRequest(new PostRequest(URL_SITES, site.toString(), "application/json"), expectedStatus); + site.put("visibility", visibility.toString()); + Response response = sendRequest(new PostRequest(URL_SITES, site.toString(), "application/json"), expectedStatus); this.createdSites.add(shortName); return new JSONObject(response.getContentAsString()); } - + /** - * Detailed Test of List Invitation Web Script. + * Detailed Test of List Invitation Web Script. + * Using URL: /api/invitations + * * @throws Exception */ - public void testListInvitation() throws Exception + public void testInvitationsGet() throws Exception { - // Create two sites. - String shortNameSiteA = GUID.generate(); + // Create two sites. + String shortNameSiteA = GUID.generate(); createSite("myPreset", shortNameSiteA, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200); - - String shortNameSiteB = GUID.generate(); + + String shortNameSiteB = GUID.generate(); createSite("myPreset", shortNameSiteB, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200); - + // Create a moderated invitation on SiteA, USER_TWO String inviteeComments = "Please sir, let $* me in"; - String userName = USER_TWO; + String userName = userTwo; String roleName = SiteModel.SITE_CONSUMER; String moderatedIdAUSER_TWO = createModeratedInvitation(shortNameSiteA, inviteeComments, userName, roleName); // Create a moderated invitation on SiteB, USER_TWO String moderatedIdBUSER_TWO = createModeratedInvitation(shortNameSiteB, inviteeComments, userName, roleName); - + String inviteeCommentsB = "Please sir, let $* me in"; - String userNameB = USER_THREE; + String userNameB = userThree; String roleNameB = SiteModel.SITE_CONSUMER; - String moderatedIdBUSER_THREE = createModeratedInvitation(shortNameSiteA, inviteeCommentsB, userNameB, roleNameB); - + + // Create a moderated invitation on SiteB, USER_THREE + String moderatedIdBUSER_THREE = createModeratedInvitation(shortNameSiteB, inviteeCommentsB, userNameB, + roleNameB); + String inviteeFirstName = "Buffy"; String inviteeLastName = "Summers"; String inviteeEmail = "buffy@sunnydale"; @@ -194,141 +222,307 @@ public class InvitationTest extends BaseWebScriptTest String serverPath = "http://localhost:8081/share/"; String acceptURL = "page/accept-invite"; String rejectURL = "page/reject-invite"; - - // Create a nominated invitation - String nominatedId = createNominatedInvitation(shortNameSiteA, inviteeFirstName, inviteeLastName, inviteeEmail, inviteeUserName, roleName, serverPath, acceptURL, rejectURL); - - /** - * search by user - find USER_TWO's three invitations - */ - { - Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?inviteeUserName=" + USER_TWO), 200); - JSONObject top = new JSONObject(response.getContentAsString()); - //System.out.println(response.getContentAsString()); - JSONArray data = top.getJSONArray("data"); - - JSONObject first = getInvitation(moderatedIdAUSER_TWO, data); - assertNotNull("first is null", first); - JSONObject second = getInvitation(moderatedIdBUSER_TWO, data); - assertNotNull("second is null", second); - JSONObject third = getInvitation(nominatedId, data); - assertNotNull("third is null", third); - - for(int i = 0; i < data.length(); i++) - { - JSONObject obj = data.getJSONObject(i); - assertEquals("userid is wrong", obj.getString("inviteeUserName"), USER_TWO); - } - } - - /** - * search by type - should find three moderated invitations - */ + // Create a nominated invitation on SiteA, UsER_TWO + String nominatedId = createNominatedInvitation(shortNameSiteA, inviteeFirstName, inviteeLastName, inviteeEmail, + inviteeUserName, roleName, serverPath, acceptURL, rejectURL); + + // search by user - find USER_TWO's three invitations { - Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED"), 200); + Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?inviteeUserName=" + userTwo), 200); JSONObject top = new JSONObject(response.getContentAsString()); - //System.out.println(response.getContentAsString()); + // System.out.println(response.getContentAsString()); JSONArray data = top.getJSONArray("data"); - for(int i = 0; i < data.length(); i++) - { - JSONObject obj = data.getJSONObject(i); - assertEquals("invitation type ", obj.getString("invitationType"), "MODERATED"); - } - JSONObject first = getInvitation(moderatedIdAUSER_TWO, data); - assertNotNull("first is null", first); - JSONObject second = getInvitation(moderatedIdBUSER_TWO, data); - assertNotNull("second is null", second); - JSONObject third = getInvitation(moderatedIdBUSER_THREE, data); - assertNotNull("third is null", third); + + JSONObject moderatedAInv = getInvitation(moderatedIdAUSER_TWO, data); + assertNotNull("Moderated invitation to Site A not present!", moderatedAInv); + JSONObject moderatedBInv = getInvitation(moderatedIdBUSER_TWO, data); + assertNotNull("Moderated invitation to Site B not present!", moderatedBInv); + JSONObject nominatedInv = getInvitation(nominatedId, data); + assertNotNull("Nominated invitation to Site A not present!", nominatedInv); + + checkJSONInvitations(data); } + - /** - * Search by type and site - */ - + // search by type - should find three moderated invitations { - Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED&resourceName="+shortNameSiteA+ "&resourceType=WEB_SITE"), 200); + Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED"), 200); JSONObject top = new JSONObject(response.getContentAsString()); - System.out.println(response.getContentAsString()); + // System.out.println(response.getContentAsString()); JSONArray data = top.getJSONArray("data"); - assertEquals("two moderated invitations not found", data.length(), 2); + for (int i = 0; i < data.length(); i++) + { + JSONObject obj = data.getJSONObject(i); + assertEquals("Wrong invitation type", "MODERATED", obj.getString("invitationType")); + } + JSONObject moderatedATwoInv = getInvitation(moderatedIdAUSER_TWO, data); + assertNotNull("first is null", moderatedATwoInv); + JSONObject moderatedBTwoInv = getInvitation(moderatedIdBUSER_TWO, data); + assertNotNull("second is null", moderatedBTwoInv); + JSONObject moderatedBThreeInv = getInvitation(moderatedIdBUSER_THREE, data); + assertNotNull("third is null", moderatedBThreeInv); } - + + // Search by type and site + { + Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED&resourceName=" + + shortNameSiteA + "&resourceType=WEB_SITE"), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals("One moderated invitations not found", 1, data.length()); + } + // negative test - unknown resourceType { - sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED&resourceName="+shortNameSiteA+ "&resourceType=crap"), 500); + Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED&resourceName=" + + shortNameSiteA + "&resourceType=madeUpStuff"), 500); + assertEquals(500, response.getStatus()); + JSONObject top = new JSONObject(response.getContentAsString()); + assertNotNull(top.getString("message")); + } + } + + /** + * Detailed Test of List Invitation Web Script. + * Using URL: /api/sites/{shortname}/invitations + * + * @throws Exception + */ + public void testSiteInvitationsGet() throws Exception + { + // Create two sites. + String shortNameSiteA = GUID.generate(); + createSite("myPreset", shortNameSiteA, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200); + + String shortNameSiteB = GUID.generate(); + createSite("myPreset", shortNameSiteB, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200); + + // Create a moderated invitation on SiteA, USER_TWO + String inviteeComments = "Please sir, let $* me in"; + String userName = userTwo; + String roleName = SiteModel.SITE_CONSUMER; + String moderatedIdAUSER_TWO = createModeratedInvitation(shortNameSiteA, inviteeComments, userName, roleName); + + // Create a moderated invitation on SiteB, USER_TWO + String moderatedIdBUSER_TWO = createModeratedInvitation(shortNameSiteB, inviteeComments, userName, roleName); + + String inviteeCommentsB = "Please sir, let $* me in"; + String userNameB = userThree; + String roleNameB = SiteModel.SITE_CONSUMER; + + // Create a moderated invitation on SiteB, USER_THREE + String moderatedIdBUSER_THREE = createModeratedInvitation(shortNameSiteB, inviteeCommentsB, userNameB, + roleNameB); + + String inviteeFirstName = "Buffy"; + String inviteeLastName = "Summers"; + String inviteeEmail = "buffy@sunnydale"; + String inviteeUserName = userName; + String serverPath = "http://localhost:8081/share/"; + String acceptURL = "page/accept-invite"; + String rejectURL = "page/reject-invite"; + + // Create a nominated invitation on SiteA, UsER_TWO + String nominatedId = createNominatedInvitation(shortNameSiteA, inviteeFirstName, inviteeLastName, inviteeEmail, + inviteeUserName, roleName, serverPath, acceptURL, rejectURL); + + // search for all invitations to site A: One Moderated Usr2, One Nominated User2 + { + String allSiteAUrl = URL_SITES +"/" + shortNameSiteA + "/invitations"; + Response response = sendRequest(new GetRequest(allSiteAUrl), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + // System.out.println(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals("Wrong number of invitations!", 2, data.length()); + + JSONObject moderatedAInv = getInvitation(moderatedIdAUSER_TWO, data); + assertNotNull("Moderated invitation to Site A not present!", moderatedAInv); + JSONObject nominatedInv = getInvitation(nominatedId, data); + assertNotNull("Nominated invitation to Site A not present!", nominatedInv); + checkJSONInvitations(data); } + // search for all invitations to site B: One Moderated User2, One Moderated User3. + { + String allSiteBUrl = URL_SITES +"/" + shortNameSiteB + "/invitations"; + Response response = sendRequest(new GetRequest(allSiteBUrl), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + // System.out.println(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals("Wrong number of invitations!", 2, data.length()); + + JSONObject moderatedB2Inv = getInvitation(moderatedIdBUSER_TWO, data); + assertNotNull("Moderated invitation User 2 to Site B not present!", moderatedB2Inv); + JSONObject moderatedB3Inv = getInvitation(moderatedIdBUSER_THREE, data); + assertNotNull("Moderated invitation User 3 to Site B not present!", moderatedB3Inv); + checkJSONInvitations(data); + } + + // search SiteA by type Moderated: One Moderated User2 + { + String siteAModeratedUrl = URL_SITES + "/" +shortNameSiteA + "/invitations?invitationType=MODERATED"; + Response response = sendRequest(new GetRequest(siteAModeratedUrl), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + // System.out.println(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals(1, data.length()); + JSONObject invitation = data.getJSONObject(0); + assertEquals("Wrong invitation type", "MODERATED", invitation.getString("invitationType")); + JSONObject moderatedATwoInv = getInvitation(moderatedIdAUSER_TWO, data); + assertNotNull("first is null", moderatedATwoInv); + } + + // search SiteA by type Nominated: One Nominated User2 + { + String siteANominatedUrl = URL_SITES + "/" +shortNameSiteA + "/invitations?invitationType=NOMINATED"; + Response response = sendRequest(new GetRequest(siteANominatedUrl), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + // System.out.println(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals(1, data.length()); + JSONObject invitation = data.getJSONObject(0); + assertEquals("Wrong invitation type", "NOMINATED", invitation.getString("invitationType")); + JSONObject nominatedATwoInv = getInvitation(nominatedId, data); + assertNotNull("first is null", nominatedATwoInv); + } + + // search SiteB by userId 2: One Moderated User2 + { + String siteBUser2Url = URL_SITES + "/" +shortNameSiteB + "/invitations?inviteeUserName=" + userTwo; + Response response = sendRequest(new GetRequest(siteBUser2Url), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + // System.out.println(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals(1, data.length()); + JSONObject invitation = data.getJSONObject(0); + assertEquals("Wrong invitation user", userTwo, invitation.getString("inviteeUserName")); + JSONObject moderatedBTwoInv = getInvitation(moderatedIdBUSER_TWO, data); + assertNotNull("first is null", moderatedBTwoInv); + } + + // search SiteB by userId 2: One Moderated User2 + { + String siteBUser2Url = URL_SITES + "/" +shortNameSiteB + "/invitations?inviteeUserName=" + userThree; + Response response = sendRequest(new GetRequest(siteBUser2Url), 200); + JSONObject top = new JSONObject(response.getContentAsString()); + // System.out.println(response.getContentAsString()); + JSONArray data = top.getJSONArray("data"); + assertEquals(1, data.length()); + JSONObject invitation = data.getJSONObject(0); + assertEquals("Wrong invitation user", userThree, invitation.getString("inviteeUserName")); + JSONObject moderatedBThreeInv = getInvitation(moderatedIdBUSER_THREE, data); + assertNotNull("first is null", moderatedBThreeInv); + } + + // negative test - unknown resourceType + { + Response response = sendRequest(new GetRequest(URL_INVITATIONS + "?invitationType=MODERATED&resourceName=" + + shortNameSiteA + "&resourceType=madeUpStuff"), 500); + assertEquals(500, response.getStatus()); + JSONObject top = new JSONObject(response.getContentAsString()); + assertNotNull(top.getString("message")); + } } - - - private String createNominatedInvitation(String siteName, String inviteeFirstName, String inviteeLastName, String inviteeEmail, String inviteeUserName, String inviteeRoleName, String serverPath, String acceptURL, String rejectURL) throws Exception + + private void checkJSONInvitations(JSONArray data) throws JSONException + { + for (int i = 0; i < data.length(); i++) + { + JSONObject invitation = data.getJSONObject(i); + String userId = invitation.getString("inviteeUserName"); + + // Check invitee info for Nominated invitation. + Map expectedProps = userProperties.get(userId); + JSONObject invitee = invitation.getJSONObject("invitee"); + assertNotNull(invitee); + assertEquals("User name is wrong for user: " + i, userId, invitee.getString("userName")); + assertEquals("Avatar URI is wrong for user: " + i, expectedProps.get("avatar"), invitee.getString("avatar")); + assertEquals("First name is wrong!", expectedProps.get("firstName"), invitee.getString("firstName")); + assertEquals("Last name is wrong!", expectedProps.get("lastName"), invitee.getString("lastName")); + } + } + + private String makeAvatar(final NodeRef person) + { + nodeService.addAspect(person, ContentModel.ASPECT_PREFERENCES, null); + ChildAssociationRef assoc = nodeService.createNode(person, ContentModel.ASSOC_PREFERENCE_IMAGE, avatarQName, + ContentModel.TYPE_CONTENT); + NodeRef avatar = assoc.getChildRef(); + nodeService.createAssociation(person, avatar, ContentModel.ASSOC_AVATAR); + return "api/node/" + avatar + "/content/thumbnails/avatar"; + } + + private String createNominatedInvitation(String siteName, String inviteeFirstName, String inviteeLastName, + String inviteeEmail, String inviteeUserName, String inviteeRoleName, String serverPath, + String acceptURL, String rejectURL) throws Exception { /* * Create a new nominated invitation */ JSONObject newInvitation = new JSONObject(); - - newInvitation.put("invitationType", "NOMINATED"); - newInvitation.put("inviteeRoleName", inviteeRoleName); - if(inviteeUserName != null) + + newInvitation.put("invitationType", "NOMINATED"); + newInvitation.put("inviteeRoleName", inviteeRoleName); + if (inviteeUserName != null) { - // nominate an existing user + // nominate an existing user newInvitation.put("inviteeUserName", inviteeUserName); - } - else + } else { - // nominate someone else - newInvitation.put("inviteeFirstName", inviteeFirstName); - newInvitation.put("inviteeLastName", inviteeLastName); - newInvitation.put("inviteeEmail", inviteeEmail); + // nominate someone else + newInvitation.put("inviteeFirstName", inviteeFirstName); + newInvitation.put("inviteeLastName", inviteeLastName); + newInvitation.put("inviteeEmail", inviteeEmail); } newInvitation.put("serverPath", serverPath); newInvitation.put("acceptURL", acceptURL); - newInvitation.put("rejectURL", rejectURL); - - Response response = sendRequest(new PostRequest(URL_SITES + "/" + siteName + "/invitations", newInvitation.toString(), "application/json"), 201); + newInvitation.put("rejectURL", rejectURL); + + Response response = sendRequest(new PostRequest(URL_SITES + "/" + siteName + "/invitations", newInvitation + .toString(), "application/json"), 201); JSONObject top = new JSONObject(response.getContentAsString()); JSONObject data = top.getJSONObject("data"); String inviteId = data.getString("inviteId"); - + createdInvitations.add(new Tracker(inviteId, siteName)); - + return inviteId; } - - private String createModeratedInvitation(String siteName, String inviteeComments, String inviteeUserName, String inviteeRoleName) throws Exception + + private String createModeratedInvitation(String siteName, String inviteeComments, String inviteeUserName, + String inviteeRoleName) throws Exception { /* * Create a new moderated invitation */ JSONObject newInvitation = new JSONObject(); - + newInvitation.put("invitationType", "MODERATED"); newInvitation.put("inviteeRoleName", inviteeRoleName); newInvitation.put("inviteeComments", inviteeComments); newInvitation.put("inviteeUserName", inviteeUserName); - Response response = sendRequest(new PostRequest(URL_SITES + "/" + siteName + "/invitations", newInvitation.toString(), "application/json"), 201); + Response response = sendRequest(new PostRequest(URL_SITES + "/" + siteName + "/invitations", newInvitation + .toString(), "application/json"), 201); JSONObject top = new JSONObject(response.getContentAsString()); JSONObject data = top.getJSONObject("data"); String inviteId = data.getString("inviteId"); - + createdInvitations.add(new Tracker(inviteId, siteName)); - + return inviteId; } - + private JSONObject getInvitation(String inviteId, JSONArray data) throws Exception { - for(int i = 0; i < data.length(); i++) - { - JSONObject obj = data.getJSONObject(i); - if(inviteId.equals(obj.getString("inviteId"))) - { - return obj; - } - } - return null; + for (int i = 0; i < data.length(); i++) + { + JSONObject obj = data.getJSONObject(i); + if (inviteId.equals(obj.getString("inviteId"))) + { + return obj; + } + } + return null; } }