/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package com.celements.web.contextmenu;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import org.apache.velocity.VelocityContext;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.model.reference.DocumentReference;
import com.celements.common.test.AbstractBridgedComponentTestCase;
import com.celements.sajson.Builder;
import com.xpn.xwiki.XWiki;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.render.XWikiRenderer;
import com.xpn.xwiki.render.XWikiRenderingEngine;
import com.xpn.xwiki.render.XWikiVirtualMacro;
public class ContextMenuItemTest extends AbstractBridgedComponentTestCase {
private ContextMenuItem theCMI;
private XWikiContext context;
private VelocityContext velocityContext;
private XWiki xwiki;
private XWikiRenderingEngine renderingEngine;
private String origElemId;
@Before
public void setUp_ContextMenuItemTest() {
context = getContext();
xwiki = getWikiMock();
DocumentReference myDocRef = new DocumentReference(context.getDatabase(), "mySpace", "myDoc");
context.setDoc(new XWikiDocument(myDocRef));
velocityContext = new VelocityContext();
context.put("vcontext", velocityContext);
renderingEngine = createMockAndAddToDefault(XWikiRenderingEngine.class);
expect(xwiki.getRenderingEngine()).andReturn(renderingEngine).anyTimes();
origElemId = "N1:Content.Agenda";
theCMI = createCMI(origElemId);
}
@SuppressWarnings("unchecked")
@Test
public void testContextMenuItem_withPrefix() {
expect(renderingEngine.interpretText(eq("link"), same(context.getDoc()), same(
context))).andReturn("link");
expect(renderingEngine.interpretText(eq("Test Menu Item"), same(context.getDoc()), same(
context))).andReturn("Test Menu Item");
expect(renderingEngine.interpretText(eq("shortcut"), same(context.getDoc()), same(
context))).andReturn("shortcut");
expect(renderingEngine.interpretText(eq(""), same(context.getDoc()), same(context))).andReturn(
"");
replayDefault();
assertEquals("Content.Agenda", theCMI.getElemId());
Builder builder = new Builder();
theCMI.generateJSON(builder);
assertEquals("Content.Agenda", velocityContext.get("elemId"));
assertEquals(origElemId, velocityContext.get("origElemId"));
assertNotNull(velocityContext.get("elemParams"));
assertEquals(1, ((List<String>) velocityContext.get("elemParams")).size());
verifyDefault();
}
@SuppressWarnings("unchecked")
@Test
public void testContextMenuItem_withPrefix_emptyElementId() {
expect(renderingEngine.interpretText(eq("link"), same(context.getDoc()), same(
context))).andReturn("link");
expect(renderingEngine.interpretText(eq("Test Menu Item"), same(context.getDoc()), same(
context))).andReturn("Test Menu Item");
expect(renderingEngine.interpretText(eq("shortcut"), same(context.getDoc()), same(
context))).andReturn("shortcut");
expect(renderingEngine.interpretText(eq(""), same(context.getDoc()), same(context))).andReturn(
"");
replayDefault();
String localOrigElemId = "N1:menuPartTest:";
ContextMenuItem localCMI = createCMI(localOrigElemId);
assertEquals("link", localCMI.getLink());
assertEquals("Test Menu Item", localCMI.getText());
assertEquals("shortcut", localCMI.getShortcut());
assertEquals("", localCMI.getCmiIcon());
VelocityContext vcontext = (VelocityContext) context.get("vcontext");
assertEquals("", localCMI.getElemId());
assertEquals("", vcontext.get("elemId"));
assertEquals(localOrigElemId, vcontext.get("origElemId"));
assertNotNull(vcontext.get("elemParams"));
assertEquals(2, ((List<String>) vcontext.get("elemParams")).size());
assertEquals("menuPartTest", ((List<String>) vcontext.get("elemParams")).get(1));
verifyDefault();
}
@SuppressWarnings("unchecked")
@Test
public void testContextMenuItem_woPrefix() {
expect(renderingEngine.interpretText(eq("link"), same(context.getDoc()), same(
context))).andReturn("link");
expect(renderingEngine.interpretText(eq("Test Menu Item"), same(context.getDoc()), same(
context))).andReturn("Test Menu Item");
expect(renderingEngine.interpretText(eq("shortcut"), same(context.getDoc()), same(
context))).andReturn("shortcut");
expect(renderingEngine.interpretText(eq(""), same(context.getDoc()), same(context))).andReturn(
"");
replayDefault();
ContextMenuItem localCMI = createCMI("Content.Test2");
Builder builder = new Builder();
localCMI.generateJSON(builder);
assertEquals("Content.Test2", localCMI.getElemId());
VelocityContext vcontext = (VelocityContext) context.get("vcontext");
assertEquals("Content.Test2", vcontext.get("elemId"));
assertNotNull(vcontext.get("elemParams"));
assertEquals(0, ((List<String>) vcontext.get("elemParams")).size());
assertEquals("{\"link\" : \"link\", \"text\" : \"Test Menu Item\", \"icon\" : \"\","
+ " \"shortcut\" : {\"shortcut\" : true}}", builder.getJSON());
verifyDefault();
}
@Test
public void testContextMenuItem_isolate_VContext() {
reset(xwiki);
TestRenderingEngine mockRenderEngine = new TestRenderingEngine(renderingEngine);
expect(xwiki.getRenderingEngine()).andReturn(mockRenderEngine).anyTimes();
VelocityContext vcontextBefore = (VelocityContext) context.get("vcontext");
assertNotNull(vcontextBefore);
expect(renderingEngine.interpretText(eq("link"), same(context.getDoc()), same(
context))).andReturn("link");
expect(renderingEngine.interpretText(eq("Test Menu Item"), same(context.getDoc()), same(
context))).andReturn("Test Menu Item");
expect(renderingEngine.interpretText(eq("shortcut"), same(context.getDoc()), same(
context))).andReturn("shortcut");
expect(renderingEngine.interpretText(eq(""), same(context.getDoc()), same(context))).andReturn(
"");
replayDefault();
ContextMenuItem localCMI = createCMI("Content.Test2");
assertEquals("Content.Test2", localCMI.getElemId());
assertSame(vcontextBefore, context.get("vcontext"));
Builder builder = new Builder();
localCMI.generateJSON(builder);
assertFalse(mockRenderEngine.recordedVcontextList.isEmpty());
for (VelocityContext vContext : mockRenderEngine.recordedVcontextList) {
assertNotSame(vcontextBefore, vContext);
}
verifyDefault();
}
// *****************************************************************
// * H E L P E R - M E T H O D S *
// *****************************************************************/
private ContextMenuItem createCMI(String elementId) {
BaseObject menuItem = new BaseObject();
menuItem.setLargeStringValue("cmi_link", "link");
menuItem.setStringValue("cmi_text", "Test Menu Item");
menuItem.setStringValue("cmi_icon", null);
menuItem.setStringValue("cmi_shortcut", "shortcut");
return new ContextMenuItem(menuItem, elementId);
}
private class TestRenderingEngine implements XWikiRenderingEngine {
List<VelocityContext> recordedVcontextList = new ArrayList<VelocityContext>();
private XWikiRenderingEngine renderingEngine;
public TestRenderingEngine(XWikiRenderingEngine renderingEngine) {
this.renderingEngine = renderingEngine;
}
public void addRenderer(String arg0, XWikiRenderer arg1) {
renderingEngine.addRenderer(arg0, arg1);
}
public String convertMultiLine(String arg0, String arg1, String arg2, String arg3,
XWikiVirtualMacro arg4, XWikiContext arg5) {
return renderingEngine.convertMultiLine(arg0, arg1, arg2, arg3, arg4, arg5);
}
public String convertSingleLine(String arg0, String arg1, String arg2, XWikiVirtualMacro arg3,
XWikiContext arg4) {
return renderingEngine.convertSingleLine(arg0, arg1, arg2, arg3, arg4);
}
public void flushCache() {
renderingEngine.flushCache();
}
public XWikiRenderer getRenderer(String arg0) {
return renderingEngine.getRenderer(arg0);
}
public List<XWikiRenderer> getRendererList() {
return renderingEngine.getRendererList();
}
public List<String> getRendererNames() {
return renderingEngine.getRendererNames();
}
public String interpretText(String arg0, XWikiDocument arg1, XWikiContext context) {
recordedVcontextList.add((VelocityContext) context.get("vcontext"));
return renderingEngine.interpretText(arg0, arg1, context);
}
public String renderDocument(XWikiDocument arg0, XWikiContext arg1) throws XWikiException {
return renderingEngine.renderDocument(arg0, arg1);
}
public String renderDocument(XWikiDocument arg0, XWikiDocument arg1, XWikiContext arg2)
throws XWikiException {
return renderingEngine.renderDocument(arg0, arg1, arg2);
}
public String renderText(String arg0, XWikiDocument arg1, XWikiContext arg2) {
return renderingEngine.renderText(arg0, arg1, arg2);
}
public String renderText(String arg0, XWikiDocument arg1, XWikiDocument arg2,
XWikiContext arg3) {
return renderingEngine.renderText(arg0, arg1, arg2, arg3);
}
public void virtualInit(XWikiContext arg0) {
renderingEngine.virtualInit(arg0);
}
}
}