/* * 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.cells; import static com.celements.common.test.CelementsTestUtils.*; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.Vector; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.DocumentReference; import org.xwiki.model.reference.SpaceReference; import org.xwiki.model.reference.WikiReference; import com.celements.common.test.AbstractComponentTest; import com.celements.navigation.TreeNode; import com.celements.rendering.RenderCommand; import com.celements.web.plugin.cmd.PageLayoutCommand; 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; public class CellRenderStrategyTest extends AbstractComponentTest { private CellRenderStrategy renderer; private ICellWriter outWriterMock; private XWikiContext context; private XWiki xwiki; private RenderCommand mockctRendererCmd; private PageLayoutCommand pageLayoutCmdMock; @Before public void setUp_CellRendererTest() throws Exception { outWriterMock = createMock(ICellWriter.class); context = getContext(); xwiki = createMock(XWiki.class); context.setWiki(xwiki); renderer = new CellRenderStrategy(context).setOutputWriter(outWriterMock); mockctRendererCmd = createMock(RenderCommand.class); renderer.rendererCmd = mockctRendererCmd; pageLayoutCmdMock = createMock(PageLayoutCommand.class); renderer.pageLayoutCmd = pageLayoutCmdMock; } @Test public void testPageTypeCmd() { renderer.rendererCmd = null; assertNotNull(renderer.getRendererCmd()); assertSame("Expecting singleton.", renderer.getRendererCmd(), renderer.getRendererCmd()); } @Test public void testInject_ctRendererCmd() { renderer.rendererCmd = mockctRendererCmd; assertNotNull(renderer.getRendererCmd()); assertSame("Expecting injected mock object.", mockctRendererCmd, renderer.getRendererCmd()); } @Test public void testGetAsString() { String expectedOutput = "blabla"; expect(outWriterMock.getAsString()).andReturn(expectedOutput); replay(outWriterMock); assertEquals("asString must return the current state of the StringBuilder (out).", expectedOutput, renderer.getAsString()); verify(outWriterMock); } @Test public void testStartRendering() { outWriterMock.clear(); expectLastCall().once(); replay(outWriterMock); renderer.startRendering(); verify(outWriterMock); } @Test public void testEndRenderCell() { outWriterMock.closeLevel(); expectLastCall().once(); replay(outWriterMock); renderer.endRenderCell(null, true, false); verify(outWriterMock); } @Test public void testGetMenuPart() { assertEquals("expecting empty menuPart for cells.", "", renderer.getMenuPart(null)); } @Test public void testIsRenderCell() { DocumentReference docRef = new DocumentReference(context.getDatabase(), "Skin", "MasterCell"); assertFalse(renderer.isRenderCell(null)); assertTrue(renderer.isRenderCell(new TreeNode(docRef, null, 0))); } @Test public void testGetSpaceReference_default() { renderer.setSpaceReference(null); SpaceReference defaultLayout = new SpaceReference("SimpleLayout", new WikiReference( context.getDatabase())); expect(pageLayoutCmdMock.getDefaultLayoutSpaceReference()).andReturn(defaultLayout); replayAll(); assertEquals("expecting default layout space", defaultLayout, renderer.getSpaceReference()); verifyAll(); } @Test public void testGetSpaceReference() { SpaceReference layoutSpaceRef = new SpaceReference("TestLayout", new WikiReference( context.getDatabase())); renderer.setSpaceReference(layoutSpaceRef); replayAll(); assertEquals(layoutSpaceRef, renderer.getSpaceReference()); verifyAll(); } @Test public void testGetSpaceReference_null_setBack() { SpaceReference layoutSpaceRef = new SpaceReference("TestLayout", new WikiReference( context.getDatabase())); renderer.setSpaceReference(layoutSpaceRef); renderer.setSpaceReference(null); SpaceReference defaultLayout = new SpaceReference("SimpleLayout", new WikiReference( context.getDatabase())); expect(pageLayoutCmdMock.getDefaultLayoutSpaceReference()).andReturn(defaultLayout); replayAll(); assertEquals(defaultLayout, renderer.getSpaceReference()); verifyAll(); } @Test public void testIsRenderSubCells() { assertFalse(renderer.isRenderSubCells(null)); SpaceReference layoutSpaceRef = new SpaceReference("TestLayout", new WikiReference( context.getDatabase())); assertTrue(renderer.isRenderSubCells(layoutSpaceRef)); } @Test public void testStartRenderCell() throws XWikiException { DocumentReference docRef = new DocumentReference(context.getDatabase(), "Skin", "MasterCell"); boolean isLastItem = true; boolean isFirstItem = false; TreeNode node = new TreeNode(docRef, null, 0); XWikiDocument doc = new XWikiDocument(docRef); BaseObject cellObj = new BaseObject(); String cssClasses = "classes two"; String idname = "myDivId"; String cssStyles = "width:100px;\nheight:10px;\n"; cellObj.setStringValue("css_classes", cssClasses); cellObj.setStringValue("idname", idname); cellObj.setStringValue("css_styles", cssStyles); Vector<BaseObject> cellObjList = new Vector<BaseObject>(); cellObjList.add(cellObj); DocumentReference cellClassRef = new DocumentReference(context.getDatabase(), CellsClasses.CELEMENTS_CELL_CLASS_SPACE, CellsClasses.CELEMENTS_CELL_CLASS_NAME); doc.setXObjects(cellClassRef, cellObjList); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(doc); outWriterMock.openLevel(eq(idname), eq("cel_cell " + cssClasses), eq(cssStyles)); replayAll(); renderer.startRenderCell(node, isFirstItem, isLastItem); verifyAll(); } @Test public void testStartRenderCell_noCssClasses() throws XWikiException { DocumentReference docRef = new DocumentReference(context.getDatabase(), "Skin", "MasterCell"); boolean isLastItem = true; boolean isFirstItem = false; TreeNode node = new TreeNode(docRef, null, 0); XWikiDocument doc = new XWikiDocument(docRef); BaseObject cellObj = new BaseObject(); String idname = "myDivId"; String cssStyles = "width:100px;\nheight:10px;\n"; cellObj.setStringValue("idname", idname); cellObj.setStringValue("css_styles", cssStyles); Vector<BaseObject> cellObjList = new Vector<BaseObject>(); cellObjList.add(cellObj); DocumentReference cellClassRef = new DocumentReference(context.getDatabase(), CellsClasses.CELEMENTS_CELL_CLASS_SPACE, CellsClasses.CELEMENTS_CELL_CLASS_NAME); doc.setXObjects(cellClassRef, cellObjList); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(doc); outWriterMock.openLevel(eq(idname), eq("cel_cell"), eq(cssStyles)); replayAll(); renderer.startRenderCell(node, isFirstItem, isLastItem); verifyAll(); } @Test public void testStartRenderCell_auto_id_for_null() throws XWikiException { DocumentReference docRef = new DocumentReference(context.getDatabase(), "Skin", "MasterCell"); boolean isLastItem = true; boolean isFirstItem = false; TreeNode node = new TreeNode(docRef, null, 0); XWikiDocument doc = new XWikiDocument(docRef); BaseObject cellObj = new BaseObject(); String cssClasses = "classes two"; String cssStyles = "width:100px;\nheight:10px;\n"; cellObj.setStringValue("css_classes", cssClasses); cellObj.setStringValue("css_styles", cssStyles); Vector<BaseObject> cellObjList = new Vector<BaseObject>(); cellObjList.add(cellObj); DocumentReference cellClassRef = new DocumentReference(context.getDatabase(), CellsClasses.CELEMENTS_CELL_CLASS_SPACE, CellsClasses.CELEMENTS_CELL_CLASS_NAME); doc.setXObjects(cellClassRef, cellObjList); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(doc); String idname = "cell:Skin.MasterCell"; outWriterMock.openLevel(eq(idname), eq("cel_cell " + cssClasses), eq(cssStyles)); replayAll(); renderer.startRenderCell(node, isFirstItem, isLastItem); verifyAll(); } @Test public void testStartRenderCell_auto_id_forEmpty() throws XWikiException { DocumentReference docRef = new DocumentReference(context.getDatabase(), "Skin", "MasterCell"); boolean isLastItem = true; boolean isFirstItem = false; TreeNode node = new TreeNode(docRef, null, 0); XWikiDocument doc = new XWikiDocument(docRef); BaseObject cellObj = new BaseObject(); String cssClasses = "classes two"; String cssStyles = "width:100px;\nheight:10px;\n"; cellObj.setStringValue("css_classes", cssClasses); cellObj.setStringValue("idname", ""); cellObj.setStringValue("css_styles", cssStyles); Vector<BaseObject> cellObjList = new Vector<BaseObject>(); cellObjList.add(cellObj); DocumentReference cellClassRef = new DocumentReference(context.getDatabase(), CellsClasses.CELEMENTS_CELL_CLASS_SPACE, CellsClasses.CELEMENTS_CELL_CLASS_NAME); doc.setXObjects(cellClassRef, cellObjList); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(doc); String idname = "cell:Skin.MasterCell"; outWriterMock.openLevel(eq(idname), eq("cel_cell " + cssClasses), eq(cssStyles)); replayAll(); renderer.startRenderCell(node, isFirstItem, isLastItem); verifyAll(); } @Test public void testStartRenderCell_auto_id_forEmpty_diffdb() throws XWikiException { DocumentReference docRef = new DocumentReference("layoutDb", "Skin", "MasterCell"); boolean isLastItem = true; boolean isFirstItem = false; TreeNode node = new TreeNode(docRef, null, 0); XWikiDocument doc = new XWikiDocument(docRef); DocumentReference cellClassRef = new DocumentReference("layoutDb", CellsClasses.CELEMENTS_CELL_CLASS_SPACE, CellsClasses.CELEMENTS_CELL_CLASS_NAME); BaseObject cellObj = new BaseObject(); String cssClasses = "classes two"; String cssStyles = "width:100px;\nheight:10px;\n"; cellObj.setStringValue("css_classes", cssClasses); cellObj.setStringValue("idname", ""); cellObj.setStringValue("css_styles", cssStyles); cellObj.setXClassReference(cellClassRef); doc.addXObject(cellObj); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(doc); String idname = "cell:layoutDb..Skin.MasterCell"; outWriterMock.openLevel(eq(idname), eq("cel_cell " + cssClasses), eq(cssStyles)); replayAll(); renderer.startRenderCell(node, isFirstItem, isLastItem); verifyAll(); } @Test public void testStartRenderCell_otherDb() throws XWikiException { String masterCellDb = "theMasterCellDB"; DocumentReference docRef = new DocumentReference(masterCellDb, "Skin", "MasterCell"); boolean isLastItem = true; boolean isFirstItem = false; TreeNode node = new TreeNode(docRef, null, 0); XWikiDocument doc = new XWikiDocument(docRef); BaseObject cellObj = new BaseObject(); String cssClasses = "classes two"; String idname = "myDivId"; String cssStyles = "width:100px;\nheight:10px;\n"; cellObj.setStringValue("css_classes", cssClasses); cellObj.setStringValue("idname", idname); cellObj.setStringValue("css_styles", cssStyles); Vector<BaseObject> cellObjList = new Vector<BaseObject>(); cellObjList.add(cellObj); DocumentReference cellClassRef = new DocumentReference(masterCellDb, CellsClasses.CELEMENTS_CELL_CLASS_SPACE, CellsClasses.CELEMENTS_CELL_CLASS_NAME); doc.setXObjects(cellClassRef, cellObjList); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(doc); outWriterMock.openLevel(eq(idname), eq("cel_cell " + cssClasses), eq(cssStyles)); replayAll(); renderer.startRenderCell(node, isFirstItem, isLastItem); verifyAll(); } @Test public void testRenderEmptyChildren() throws XWikiException { DocumentReference cellRef = new DocumentReference(context.getDatabase(), "Skin", "MasterCell"); TreeNode cellNode = new TreeNode(cellRef, null, 0); String cellContentExpected = "Cell test content Skin.MasterCell"; expect(mockctRendererCmd.renderCelementsCell(eq(cellRef))).andReturn( cellContentExpected).once(); // ASSERT outWriterMock.appendContent(eq(cellContentExpected)); replayAll(); renderer.renderEmptyChildren(cellNode); verifyAll(); } private void replayAll(Object... mocks) { replay(xwiki, outWriterMock, mockctRendererCmd, pageLayoutCmdMock); replay(mocks); } private void verifyAll(Object... mocks) { verify(xwiki, outWriterMock, mockctRendererCmd, pageLayoutCmdMock); verify(mocks); } }