/***************************************************************************
* 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.comment;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import org.exoplatform.services.cms.CmsService;
import org.exoplatform.services.cms.JcrInputProperty;
import org.exoplatform.services.cms.comments.CommentsService;
import org.exoplatform.services.cms.i18n.MultiLanguageService;
import org.exoplatform.services.wcm.BaseWCMTestCase;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
/**
* Created by eXo Platform
* Author : Nguyen Manh Cuong
* manhcuongpt@gmail.com
* Jun 9, 2009
*/
/**
* Unit test for CommentService
* Methods need to test:
* 1. addComment() method
* 2. getComment() method
*/
public class TestCommentService extends BaseWCMTestCase {
private final static String I18NMixin = "mix:i18n";
private final static String ARTICLE = "exo:article";
private final static String TITLE = "exo:title";
private final static String SUMMARY = "exo:summary";
private final static String TEXT = "exo:text";
private final static String COMMENT = "comments";
private final static String COMMENTOR = "exo:commentor";
private final static String COMMENTOR_EMAIL = "exo:commentorEmail";
private final static String COMMENTOR_MESSAGES = "exo:commentContent";
private final static String ANONYMOUS = "anonymous" ;
private CommentsService commentsService = null;
private MultiLanguageService multiLangService = null;
public void setUp() throws Exception {
super.setUp();
commentsService = (CommentsService) container.getComponentInstanceOfType(CommentsService.class);
multiLangService = (MultiLanguageService) container.getComponentInstanceOfType(MultiLanguageService.class);
applySystemSession();
initNode();
}
/**
* Test Method: addComment()
* Input:
* Test node: doesn't have multiple languages
* doesn't have comment node
* Expected:
* Test node has comment node with 2 comments.
*/
public void testAddComment1() throws Exception{
Node test = session.getRootNode().addNode("test");
if(test.canAddMixin(I18NMixin)){
test.addMixin(I18NMixin);
}
session.save();
commentsService.addComment(test, "root", "root@explatform.com", null, "Hello", multiLangService.getDefault(test));
commentsService.addComment(test, "marry", "marry@explatform.com", null, "Thanks", multiLangService.getDefault(test));
NodeIterator iter = test.getNode(COMMENT).getNodes();
int i = 0;
while (iter.hasNext()) {
check(i++, iter.nextNode());
}
}
/**
* Test Method: addComment()
* Input:
* Test Node: has multiple languages, NodeType of test node is "nt:file"
* doesn't have comment node, NodeType of COMMENTS node is "nt:unstructured"
* Expected Result: throws Exception
*/
public void testAddComment2() throws Exception {
Node test = session.getRootNode().addNode("test1", "nt:file");
if(test.getPrimaryNodeType().getName().equals("nt:file")){
test.addNode("jcr:content", "nt:base");
}
if(test.canAddMixin(I18NMixin)){
test.addMixin(I18NMixin);
}
session.save();
commentsService.addComment(test, "root", "root@explatform.com", null, "Hello", "jp");
NodeIterator iter = test.getNode(COMMENT).getNodes();
while (iter.hasNext()) {
Node node = iter.nextNode();
assertEquals("root", node.getProperty(COMMENTOR).getString());
assertEquals("root@explatform.com", node.getProperty(COMMENTOR_EMAIL).getString());
assertEquals("Hello", node.getProperty(COMMENTOR_MESSAGES).getString());
}
}
/**
* Test Method: addComment()
* Input:
* commenter's name is null.
* Expected:
* commenter's name will be assigned ANONYMOUS.
*/
public void testAddComment3() throws Exception{
Node test = session.getRootNode().getNode("test");
if(test.canAddMixin(I18NMixin)){
test.addMixin(I18NMixin);
}
session.save();
commentsService.addComment(test, null, "null@explatform.com", null, "Hello", multiLangService.getDefault(test));
commentsService.addComment(test, null, "abc@explatform.com", null, "Hello", multiLangService.getDefault(test));
List<Node> listCommentNode = commentsService.getComments(test, multiLangService.getDefault(test));
Collections.sort(listCommentNode, new NameComparator());
Iterator<Node> iter = listCommentNode.iterator();
while(iter.hasNext()){
assertEquals(ANONYMOUS, iter.next().getProperty(COMMENTOR).getString());
}
}
/**
* Test Method: updateComment()
* Input:
* comment = Hello;
* update comment = Ciao;
* Expected:
* Comment message is "Ciao"
*/
public void testUpdateComment() throws Exception{
Node test = session.getRootNode().getNode("test");
if(test.canAddMixin(I18NMixin)){
test.addMixin(I18NMixin);
}
commentsService.addComment(test, "root", "root@explatform.com", null, "Hello", multiLangService.getDefault(test));
List<Node> nodes = commentsService.getComments(test, multiLangService.getDefault(test));
commentsService.updateComment(nodes.get(0), "Ciao");
nodes = commentsService.getComments(test, multiLangService.getDefault(test));
assertEquals("Ciao", nodes.get(0).getProperty(COMMENTOR_MESSAGES).getString());
}
/**
* Test Method: deleteComment()
* Input:
* comment for node with given email, comment message, commentor.
* Expected:
* Comment for node is delete
*/
public void testDeleteComment() throws Exception{
Node test = session.getRootNode().getNode("test");
commentsService.addComment(test, "root", "root@explatform.com", null, "Hello", multiLangService.getDefault(test));
List<Node> nodes = commentsService.getComments(test, multiLangService.getDefault(test));
assertEquals(1, nodes.size());
commentsService.deleteComment(nodes.get(0));
nodes = commentsService.getComments(test, multiLangService.getDefault(test));
assertEquals(0, nodes.size());
}
/**
* Test Method: getComments()
* Input: Test node doesn't have languages node, so adding comment nodes will be set default
* language.
* Expected Result:
* Get all comment nodes with default language.
*/
public void testGetComments1() throws Exception{
Node test = session.getRootNode().getNode("test");
if(test.canAddMixin(I18NMixin)){
test.addMixin(I18NMixin);
}
session.save();
commentsService.addComment(test, "root", "root@explatform.com", null, "Hello", multiLangService.getDefault(test));
commentsService.addComment(test, "marry", "marry@explatform.com", null, "Thanks", multiLangService.getDefault(test));
List<Node> listCommentNode = commentsService.getComments(test, multiLangService.getDefault(test));
Collections.sort(listCommentNode, new NameComparator());
Iterator<Node> iter = listCommentNode.iterator();
int i = 0;
while(iter.hasNext()){
check(i++, iter.next());
}
}
/**
* Test Method: getComments()
* Input: Node has some comment nodes in "jp" node.
* Expected Result:
* Get all comment nodes with jp language.
*/
public void testGetComments2() throws Exception{
Node test = session.getRootNode().getNode("test");
if(test.canAddMixin(I18NMixin)){
test.addMixin(I18NMixin);
}
session.save();
multiLangService.addLanguage(test, createMapInput(), "jp", false);
commentsService.addComment(test, "root", "root@explatform.com", null, "Hello", "jp");
commentsService.addComment(test, "marry", "marry@explatform.com", null, "Thanks", "jp");
List<Node> listCommentNode = commentsService.getComments(test, "jp");
Collections.sort(listCommentNode, new NameComparator());
Iterator<Node> iter = listCommentNode.iterator();
int i = 0;
while(iter.hasNext()){
check(i++, iter.next());
}
assertEquals(2, listCommentNode.size());
}
/**
* Create a map to use for MultilLanguageService
*/
private Map<String, JcrInputProperty> createMapInput() {
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String titlePath = CmsService.NODE + "/" + TITLE;
String summaryPath = CmsService.NODE + "/" + SUMMARY;
String textPath = CmsService.NODE + "/" + TEXT;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(CmsService.NODE);
inputProperty.setValue("test");
map.put(CmsService.NODE, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(titlePath);
inputProperty.setValue("this is title");
map.put(titlePath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(summaryPath);
inputProperty.setValue("this is summary");
map.put(summaryPath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(textPath);
inputProperty.setValue("this is article content");
map.put(textPath, inputProperty);
return map;
}
/**
* This method will create a node which is added MultiLanguage
*/
private Node initNode() throws Exception{
Node test = session.getRootNode().addNode("test", ARTICLE);
if (test.canAddMixin(I18NMixin)) {
test.addMixin(I18NMixin);
}
test.setProperty(TITLE, "sport");
test.setProperty(SUMMARY, "report of season");
test.setProperty(TEXT, "sport is exciting");
session.save();
multiLangService.addLanguage(test, createMapInput(), "en", false);
multiLangService.addLanguage(test, createMapInput(), "vi", false);
return test;
}
/**
* This method is used to check case test.
* @param i
* @param node node is tested
* @throws Exception
*/
private void check(int i, Node node) throws Exception{
switch (i) {
case 0:
assertEquals("root", node.getProperty(COMMENTOR).getString());
assertEquals("root@explatform.com", node.getProperty(COMMENTOR_EMAIL).getString());
assertEquals("Hello", node.getProperty(COMMENTOR_MESSAGES).getString());
break;
case 1:
assertEquals("marry", node.getProperty(COMMENTOR).getString());
assertEquals("marry@explatform.com", node.getProperty(COMMENTOR_EMAIL).getString());
assertEquals("Thanks", node.getProperty(COMMENTOR_MESSAGES).getString());
break;
default:
break;
}
}
public void tearDown() throws Exception {
try {
session.getRootNode().getNode("test").remove();
session.save();
} catch(Exception e) {
return;
}
super.tearDown();
}
class NameComparator implements Comparator<Node>{
public int compare(Node node1, Node node2){
try {
return node1.getName().compareTo(node2.getName());
} catch (RepositoryException e) {
return 0;
}
}
}
}