diff --git a/source/java/org/alfresco/repo/web/scripts/subscriptions/SubscriptionServiceRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/subscriptions/SubscriptionServiceRestApiTest.java new file mode 100644 index 0000000000..4695e05859 --- /dev/null +++ b/source/java/org/alfresco/repo/web/scripts/subscriptions/SubscriptionServiceRestApiTest.java @@ -0,0 +1,306 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * 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 . + */ +package org.alfresco.repo.web.scripts.subscriptions; + +import java.util.ArrayList; +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.web.scripts.BaseWebScriptTest; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.util.PropertyMap; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest; +import org.springframework.extensions.webscripts.TestWebScriptServer.PostRequest; +import org.springframework.extensions.webscripts.TestWebScriptServer.PutRequest; +import org.springframework.extensions.webscripts.TestWebScriptServer.Response; + +/** + * Subscription Service REST API tests + */ +public class SubscriptionServiceRestApiTest extends BaseWebScriptTest +{ + public static final String USER_BOB = "bob"; + public static final String USER_TOM = "tom"; + public static final String USER_LISA = "lisa"; + + private static final String URL_FOLLOW = "/api/subscriptions/{userid}/follow"; + private static final String URL_UNFOLLOW = "/api/subscriptions/{userid}/unfollow"; + private static final String URL_FOLLOWERS = "/api/subscriptions/{userid}/followers"; + private static final String URL_FOLLOWERS_COUNT = "/api/subscriptions/{userid}/followers/count"; + private static final String URL_FOLLOWING = "/api/subscriptions/{userid}/following"; + private static final String URL_FOLLOWING_COUNT = "/api/subscriptions/{userid}/following/count"; + private static final String URL_FOLLOWS = "/api/subscriptions/{userid}/follows"; + private static final String URL_PRIVATE = "/api/subscriptions/{userid}/private"; + + protected PersonService personService; + + @Override + public void setUp() throws Exception + { + // Get the required services + personService = (PersonService) getServer().getApplicationContext().getBean("PersonService"); + + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getSystemUserName()); + + createPerson(USER_BOB); + createPerson(USER_TOM); + createPerson(USER_LISA); + } + + @Override + protected void tearDown() throws Exception + { + deletePerson(USER_BOB); + deletePerson(USER_TOM); + deletePerson(USER_LISA); + } + + protected void deletePerson(String userId) + { + personService.deletePerson(userId); + } + + protected NodeRef createPerson(String userId) + { + deletePerson(userId); + + PropertyMap properties = new PropertyMap(5); + properties.put(ContentModel.PROP_USERNAME, userId); + properties.put(ContentModel.PROP_FIRSTNAME, userId); + properties.put(ContentModel.PROP_LASTNAME, "Test"); + properties.put(ContentModel.PROP_EMAIL, userId + "@test.demo.alfresco.com"); + + return personService.createPerson(properties); + } + + protected String getUrl(String urlPattern, String user) + { + return urlPattern.replaceFirst("\\{userid\\}", user); + } + + protected void follow(String user1, String user2) throws Exception + { + JSONArray jsonUsers = new JSONArray(); + jsonUsers.put(user2); + + String url = getUrl(URL_FOLLOW, user1); + sendRequest(new PostRequest(url, jsonUsers.toString(), "application/json"), Status.STATUS_NO_CONTENT); + } + + protected void unfollow(String user1, String user2) throws Exception + { + JSONArray jsonUsers = new JSONArray(); + jsonUsers.put(user2); + + String url = getUrl(URL_UNFOLLOW, user1); + sendRequest(new PostRequest(url, jsonUsers.toString(), "application/json"), Status.STATUS_NO_CONTENT); + } + + protected boolean follows(String user1, String user2) throws Exception + { + JSONArray jsonUsers = new JSONArray(); + jsonUsers.put(user2); + + String url = getUrl(URL_FOLLOWS, user1); + Response response = sendRequest(new PostRequest(url, jsonUsers.toString(), "application/json"), + Status.STATUS_OK); + + JSONArray resultArray = new JSONArray(response.getContentAsString()); + assertEquals(1, resultArray.length()); + + JSONObject resultObject = resultArray.getJSONObject(0); + assertTrue(resultObject.has(user2)); + + return resultObject.getBoolean(user2); + } + + protected int getFollowingCount(String user) throws Exception + { + String url = getUrl(URL_FOLLOWING_COUNT, user); + Response response = sendRequest(new GetRequest(url), Status.STATUS_OK); + + JSONObject resultObject = new JSONObject(response.getContentAsString()); + assertTrue(resultObject.has("count")); + + return resultObject.getInt("count"); + } + + protected int getFollowersCount(String user) throws Exception + { + String url = getUrl(URL_FOLLOWERS_COUNT, user); + Response response = sendRequest(new GetRequest(url), Status.STATUS_OK); + + JSONObject resultObject = new JSONObject(response.getContentAsString()); + assertTrue(resultObject.has("count")); + + return resultObject.getInt("count"); + } + + protected List getFollowing(String user) throws Exception + { + String url = getUrl(URL_FOLLOWING, user); + Response response = sendRequest(new GetRequest(url), Status.STATUS_OK); + + JSONObject resultObject = new JSONObject(response.getContentAsString()); + assertTrue(resultObject.has("people")); + + List result = new ArrayList(); + JSONArray people = resultObject.getJSONArray("people"); + + for (int i = 0; i < people.length(); i++) + { + JSONObject person = people.getJSONObject(i); + assertTrue(person.has("userName")); + assertTrue(person.has("firstName")); + assertTrue(person.has("lastName")); + + result.add(person.getString("userName")); + } + + return result; + } + + protected List getFollowers(String user) throws Exception + { + String url = getUrl(URL_FOLLOWERS, user); + Response response = sendRequest(new GetRequest(url), Status.STATUS_OK); + + JSONObject resultObject = new JSONObject(response.getContentAsString()); + assertTrue(resultObject.has("people")); + + List result = new ArrayList(); + JSONArray people = resultObject.getJSONArray("people"); + + for (int i = 0; i < people.length(); i++) + { + JSONObject person = people.getJSONObject(i); + assertTrue(person.has("userName")); + assertTrue(person.has("firstName")); + assertTrue(person.has("lastName")); + + result.add(person.getString("userName")); + } + + return result; + } + + protected boolean isSubscriptionListPrivate(String user) throws Exception + { + String url = getUrl(URL_PRIVATE, user); + Response response = sendRequest(new GetRequest(url), Status.STATUS_OK); + + JSONObject resultObject = new JSONObject(response.getContentAsString()); + assertTrue(resultObject.has("private")); + + return resultObject.getBoolean("private"); + } + + protected void setSubscriptionListPrivate(String user, boolean setPrivate) throws Exception + { + JSONObject privateObject = new JSONObject(); + privateObject.put("private", setPrivate); + + String url = getUrl(URL_PRIVATE, user); + Response response = sendRequest(new PutRequest(url, privateObject.toString(), "application/json"), + Status.STATUS_OK); + + JSONObject resultObject = new JSONObject(response.getContentAsString()); + assertTrue(resultObject.has("private")); + assertEquals(setPrivate, resultObject.getBoolean("private")); + } + + public void testFollow() throws Exception + { + String userId1 = USER_BOB; + String userId2 = USER_TOM; + String userId3 = USER_LISA; + + // check follows first + if (follows(userId1, userId2)) + { + unfollow(userId1, userId2); + } + assertFalse(follows(userId1, userId2)); + + // count the people user 1 is following + int count = getFollowingCount(userId1); + assertTrue(count >= 0); + + // user 1 follows user 2 -- twice (the second follow request should be + // ignored) + follow(userId1, userId2); + follow(userId1, userId2); + assertEquals(count + 1, getFollowingCount(userId1)); + assertTrue(follows(userId1, userId2)); + + // user 1 follows user 3 + follow(userId1, userId3); + assertEquals(count + 2, getFollowingCount(userId1)); + assertTrue(follows(userId1, userId3)); + + // get following list of user 1 + List following = getFollowing(userId1); + assertNotNull(following); + assertTrue(following.contains(userId2)); + assertTrue(following.contains(userId3)); + + // count followers of user 2 + int followerCount = getFollowersCount(userId2); + assertTrue(followerCount > 0); + + // get followers of user 2 + List followers = getFollowers(userId2); + assertNotNull(followers); + assertTrue(followers.contains(userId1)); + + // unfollow + unfollow(userId1, userId2); + assertEquals(count + 1, getFollowingCount(userId1)); + assertFalse(follows(userId1, userId2)); + assertTrue(follows(userId1, userId3)); + + unfollow(userId1, userId3); + assertEquals(count, getFollowingCount(userId1)); + assertFalse(follows(userId1, userId3)); + } + + public void testPrivateList() throws Exception + { + final String userId1 = USER_BOB; + + assertFalse(isSubscriptionListPrivate(userId1)); + + setSubscriptionListPrivate(userId1, false); + assertFalse(isSubscriptionListPrivate(userId1)); + + setSubscriptionListPrivate(userId1, true); + assertTrue(isSubscriptionListPrivate(userId1)); + + setSubscriptionListPrivate(userId1, false); + assertFalse(isSubscriptionListPrivate(userId1)); + + setSubscriptionListPrivate(userId1, true); + assertTrue(isSubscriptionListPrivate(userId1)); + } +}