/***************************************************************************
* Copyright (C) 2003-2009 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*
**************************************************************************/
package org.exoplatform.services.ecm.dms.watchdocument;
import java.util.Arrays;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.PropertyDefinition;
import org.exoplatform.services.cms.watch.WatchDocumentService;
import org.exoplatform.services.wcm.BaseWCMTestCase;
/**
* Created by eXo Platform
* Author : Nguyen Manh Cuong
* manhcuongpt@gmail.com
* Jun 16, 2009
*/
/**
* Unit test for WatchDocumentService
* Methods need to test:
* 1. getNotificationType() method
* 2. watthDocument() method
* 3. unWatchDocument() method
*/
public class TestWatchDocumentService extends BaseWCMTestCase{
private final static String EXO_WATCHABLE_MIXIN = "exo:watchable";
private final static String EMAIL_WATCHERS_PROP = "exo:emailWatcher";
private final static String RSS_WATCHERS_PROP = "exo:rssWatcher";
private WatchDocumentService watchDocumentService = null;
private Node test;
public void setUp() throws Exception {
super.setUp();
watchDocumentService = (WatchDocumentService) container.getComponentInstanceOfType(WatchDocumentService.class);
applySystemSession();
test = session.getRootNode().addNode("Test");
session.save();
}
/**
* Test Method: getNotification()
* Input: test node is not exo:watchable document
* Expected:
* Value of notification is -1.
*/
public void testGetNotificationType() throws Exception{
int notification = watchDocumentService.getNotificationType(test, "root");
assertEquals(-1, notification);
}
/**
* Test Method: getNotification()
* Input: type of notification for test node is email and rss.
* Expected:
* Value of notification is 0.
*/
public void testGetNotificationType1() throws Exception{
test.addMixin(EXO_WATCHABLE_MIXIN);
session.save();
createMultipleProperty(test, "root", "root");
int notification = watchDocumentService.getNotificationType(test, "root");
assertEquals(0, notification);
}
/**
* Test Method: getNotification()
* Input: type of notification for test node is email
* Expected:
* Value of notification is 1.
*/
public void testGetNotificationType2() throws Exception{
test.addMixin(EXO_WATCHABLE_MIXIN);
session.save();
createMultipleProperty(test, "root", "marry");
int notification = watchDocumentService.getNotificationType(test, "root");
assertEquals(1, notification);
}
/**
* Test Method: getNotification()
* Input: type of notification for test node is rss
* Expected:
* Value of notification is 2.
*/
public void testGetNotificationType3() throws Exception{
test.addMixin(EXO_WATCHABLE_MIXIN);
session.save();
createMultipleProperty(test, "marry", "root");
int notification = watchDocumentService.getNotificationType(test, "root");
assertEquals(2, notification);
}
/**
* Test Method: watchDocument()
* Input: document node is not added exo:watchable mixinType, user: root will watch this document
* Expected:
* document is added exo:watchable mixinType
* exo:emailWatch property of document node has value: root.
*/
public void testWatchDocument() throws Exception{
watchDocumentService.watchDocument(test, "root", 1);
assertTrue(test.isNodeType(EXO_WATCHABLE_MIXIN));
Property pro = test.getProperty(EMAIL_WATCHERS_PROP);
Value[] value = pro.getValues();
for(Value val : value){
assertEquals("root", val.getString());
}
}
/**
* Test Method: watchDocument()
* Input: document node is not added exo:watchable mixinType,
* user: root will watch this document
* Notification has value equal 2
* Expected:
* document is added exo:watchable mixinType
* document doesn't has exo:emailWatch property.
*/
public void testWatchDocument1() throws Exception{
watchDocumentService.watchDocument(test, "root", 2);
assertTrue(test.isNodeType(EXO_WATCHABLE_MIXIN));
assertFalse(test.hasProperty(EMAIL_WATCHERS_PROP));
}
/**
* Test Method: watchDocument()
* Input: document node follows exo:watchable mixinType,
* user: root and marry will watch this document
* Expected:
* document is added exo:watchable mixinType
* exo:emailWatch property of document node has value: root and marry.
*/
@SuppressWarnings("unchecked")
public void testWatchDocument2() throws Exception{
watchDocumentService.watchDocument(test, "root", 1);
watchDocumentService.watchDocument(test, "marry", 1);
List watcher = Arrays.asList(new String[]{"root", "marry"});
Property pro = test.getProperty(EMAIL_WATCHERS_PROP);
Value[] value = pro.getValues();
for(Value val : value){
assertTrue(watcher.contains(val.getString()));
}
}
/**
* Test Method: unwatchDocument()
* Input: Document is watched by two user(root, marry)
* Root user will be unwatched
* Expected:
* exo:emailWatch property of document node only has value: marry.
*/
@SuppressWarnings("unchecked")
public void testUnWatchDocument() throws Exception {
watchDocumentService.watchDocument(test, "root", 1);
watchDocumentService.watchDocument(test, "marry", 1);
watchDocumentService.unwatchDocument(test, "root", 1);
Property pro = test.getProperty(EMAIL_WATCHERS_PROP);
List watcher = Arrays.asList(new String[] { "marry" });
Value[] value = pro.getValues();
assertEquals(1, value.length);
assertTrue(watcher.contains(value[0].getString()));
assertFalse(value[0].equals("root"));
}
/**
* Test Method: unwatchDocument()
* Input: Document is watch by two user(root, marry)
* Root user will be unwatched
* Notification has value: 2
* Expected:
* exo:emailWatch property of a document node has value: both root and marry.
*/
@SuppressWarnings("unchecked")
public void testUnWatchDocument2() throws Exception{
watchDocumentService.watchDocument(test, "root", 1);
watchDocumentService.watchDocument(test, "marry", 1);
watchDocumentService.unwatchDocument(test, "root", 2);
List watcher = Arrays.asList(new String[] {"root", "marry"});
Property pro = test.getProperty(EMAIL_WATCHERS_PROP);
Value[] value = pro.getValues();
for (Value val : value) {
assertTrue(watcher.contains(val.getString()));
}
assertEquals(2, value.length);
}
/**
* Create multiple value property for node.
* @param node
* @param emailWatcherValue
* @param rssWatcherValue
* @throws Exception
*/
private void createMultipleProperty(Node node, String emailWatcherValue, String rssWatcherValue) throws Exception{
NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager();
NodeType nodeType = nodeTypeManager.getNodeType(EXO_WATCHABLE_MIXIN);
for(PropertyDefinition def : nodeType.getDeclaredPropertyDefinitions()){
String proName = def.getName();
if(def.isMultiple() & proName.equals(EMAIL_WATCHERS_PROP)){
Value val = session.getValueFactory().createValue(emailWatcherValue);
node.setProperty(EMAIL_WATCHERS_PROP, new Value[] {val});
}
if(def.isMultiple() & proName.equals(RSS_WATCHERS_PROP)){
Value val = session.getValueFactory().createValue(rssWatcherValue);
node.setProperty(RSS_WATCHERS_PROP, new Value[] {val});
}
}
session.save();
}
/**
* Clean data test
*/
public void tearDown() throws Exception {
if (session.itemExists("/Test")) {
test = session.getRootNode().getNode("Test");
test.remove();
session.save();
}
super.tearDown();
}
}