/* * 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.menu; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import java.util.TreeMap; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.DocumentReference; import org.xwiki.query.Query; import org.xwiki.query.QueryManager; import com.celements.common.test.AbstractBridgedComponentTestCase; import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.objects.BaseObject; import com.xpn.xwiki.user.api.XWikiRightService; import com.xpn.xwiki.web.Utils; public class MenuServiceTest extends AbstractBridgedComponentTestCase { private MenuService menuService; private XWikiContext context; private XWiki xwiki; private XWikiRightService rightsMock; private QueryManager queryManagerMock; @Before public void setUp_DataProviderTest() throws Exception { context = getContext(); xwiki = getWikiMock(); context.setWiki(xwiki); rightsMock = createMock(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(rightsMock).anyTimes(); menuService = (MenuService) Utils.getComponent(IMenuService.class); queryManagerMock = createMock(QueryManager.class); menuService.queryManager = queryManagerMock; } @Test public void testGetHeadersHQL() { assertTrue(menuService.getHeadersXWQL().matches( "from doc.object\\(Celements.MenuBarHeaderItemClass\\) as mHeader.*?")); } @Test public void testAddMenuHeaders() throws Exception { DocumentReference menuBar2webDocRef = new DocumentReference("celements2web", "Celements", "MenuBar"); expect(xwiki.exists(eq(menuBar2webDocRef), same(context))).andReturn(false).anyTimes(); DocumentReference menuBarDocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar"); XWikiDocument doc = new XWikiDocument(menuBarDocRef); addMenuHeaderObject("mm_menu_name1", 10, 3, doc); addMenuHeaderObject("mm_menu_name2", 20, 2, doc); expect(xwiki.getDocument(eq(menuBarDocRef), same(context))).andReturn(doc).once(); List<Object> fullNames = new ArrayList<Object>(); fullNames.add("Celements.MenuBar"); Query mockQuery = createMock(Query.class); expect(queryManagerMock.createQuery(isA(String.class), eq(Query.XWQL))).andReturn( mockQuery).once(); expect(mockQuery.execute()).andReturn(fullNames).once(); expect(xwiki.exists(eq(menuBarDocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar"), same(context))).andReturn(true).anyTimes(); replayAll(mockQuery); TreeMap<Integer, BaseObject> menuHeadersMap = new TreeMap<Integer, BaseObject>(); menuService.addMenuHeaders(menuHeadersMap); ArrayList<BaseObject> menuHeaders = new ArrayList<BaseObject>(); menuHeaders.addAll(menuHeadersMap.values()); assertEquals("Expecting sorted headers", 2, menuHeaders.get(0).getIntValue("pos")); assertEquals("Expecting sorted headers", 20, menuHeaders.get(0).getIntValue("header_id")); assertEquals("Expecting sorted headers", 3, menuHeaders.get(1).getIntValue("pos")); assertEquals("Expecting sorted headers", 10, menuHeaders.get(1).getIntValue("header_id")); verifyAll(mockQuery); } @Test public void testAddMenuHeaders_deletedObjects() throws Exception { DocumentReference menuBar2webDocRef = new DocumentReference("celements2web", "Celements", "MenuBar"); expect(xwiki.exists(eq(menuBar2webDocRef), same(context))).andReturn(false).anyTimes(); DocumentReference menuBarDocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar"); XWikiDocument doc = new XWikiDocument(menuBarDocRef); // object number 0 is deleted addMenuHeaderObject(1, "mm_menu_name1", 10, 3, doc); // object number 2 is deleted addMenuHeaderObject(3, "mm_menu_name2", 20, 2, doc); expect(xwiki.getDocument(eq(menuBarDocRef), same(context))).andReturn(doc).once(); List<Object> fullNames = new ArrayList<Object>(); fullNames.add("Celements.MenuBar"); Query mockQuery = createMock(Query.class); expect(queryManagerMock.createQuery(isA(String.class), eq(Query.XWQL))).andReturn( mockQuery).once(); expect(mockQuery.execute()).andReturn(fullNames).once(); expect(xwiki.exists(eq(menuBarDocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar"), same(context))).andReturn(true).anyTimes(); replayAll(mockQuery); TreeMap<Integer, BaseObject> menuHeadersMap = new TreeMap<Integer, BaseObject>(); menuService.addMenuHeaders(menuHeadersMap); ArrayList<BaseObject> menuHeaders = new ArrayList<BaseObject>(); menuHeaders.addAll(menuHeadersMap.values()); assertEquals("Expecting sorted headers", 2, menuHeaders.get(0).getIntValue("pos")); assertEquals("Expecting sorted headers", 20, menuHeaders.get(0).getIntValue("header_id")); assertEquals("Expecting sorted headers", 3, menuHeaders.get(1).getIntValue("pos")); assertEquals("Expecting sorted headers", 10, menuHeaders.get(1).getIntValue("header_id")); verifyAll(mockQuery); } @Test public void testAddMenuHeaders_multipleDocs() throws Exception { DocumentReference menuBar2webDocRef = new DocumentReference("celements2web", "Celements", "MenuBar"); DocumentReference menuBar2web2DocRef = new DocumentReference("celements2web", "Celements", "MenuBar2"); expect(xwiki.exists(eq(menuBar2webDocRef), same(context))).andReturn(false).anyTimes(); expect(xwiki.exists(eq(menuBar2web2DocRef), same(context))).andReturn(false).anyTimes(); DocumentReference menuBarDocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar"); XWikiDocument doc = new XWikiDocument(menuBarDocRef); DocumentReference menuBar2DocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar2"); XWikiDocument doc2 = new XWikiDocument(menuBar2DocRef); addMenuHeaderObject("mm_menu_name1", 12, 3, doc); addMenuHeaderObject("mm_menu_name2", 22, 2, doc); addMenuHeaderObject("mm_menu_name1", 42, 1, doc2); addMenuHeaderObject("mm_menu_name2", 32, 4, doc2); expect(xwiki.getDocument(eq(menuBarDocRef), same(context))).andReturn(doc).once(); expect(xwiki.getDocument(eq(menuBar2DocRef), same(context))).andReturn(doc2).once(); List<Object> fullNames = new ArrayList<Object>(); fullNames.add("Celements.MenuBar"); fullNames.add("Celements.MenuBar2"); Query mockQuery = createMock(Query.class); expect(queryManagerMock.createQuery(isA(String.class), eq(Query.XWQL))).andReturn( mockQuery).once(); expect(mockQuery.execute()).andReturn(fullNames).once(); expect(xwiki.exists(eq(menuBarDocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar"), same(context))).andReturn(true).anyTimes(); expect(xwiki.exists(eq(menuBar2DocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar2"), same(context))).andReturn(true).anyTimes(); replayAll(mockQuery); TreeMap<Integer, BaseObject> menuHeadersMap = new TreeMap<Integer, BaseObject>(); menuService.addMenuHeaders(menuHeadersMap); ArrayList<BaseObject> menuHeaders = new ArrayList<BaseObject>(); menuHeaders.addAll(menuHeadersMap.values()); assertEquals("Expecting sorted headers", 1, menuHeaders.get(0).getIntValue("pos")); assertEquals("Expecting sorted headers", 42, menuHeaders.get(0).getIntValue("header_id")); assertEquals("Expecting sorted headers", 2, menuHeaders.get(1).getIntValue("pos")); assertEquals("Expecting sorted headers", 22, menuHeaders.get(1).getIntValue("header_id")); assertEquals("Expecting sorted headers", 3, menuHeaders.get(2).getIntValue("pos")); assertEquals("Expecting sorted headers", 12, menuHeaders.get(2).getIntValue("header_id")); assertEquals("Expecting sorted headers", 4, menuHeaders.get(3).getIntValue("pos")); assertEquals("Expecting sorted headers", 32, menuHeaders.get(3).getIntValue("header_id")); verifyAll(mockQuery); } @Test public void testAddMenuHeaders_multipleDocs_noAccess() throws Exception { DocumentReference menuBar2webDocRef = new DocumentReference("celements2web", "Celements", "MenuBar"); DocumentReference menuBar2web2DocRef = new DocumentReference("celements2web", "Celements", "MenuBar2"); expect(xwiki.exists(eq(menuBar2webDocRef), same(context))).andReturn(false).anyTimes(); expect(xwiki.exists(eq(menuBar2web2DocRef), same(context))).andReturn(false).anyTimes(); DocumentReference menuBarDocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar"); XWikiDocument doc = new XWikiDocument(menuBarDocRef); DocumentReference menuBar2DocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar2"); XWikiDocument doc2 = new XWikiDocument(menuBar2DocRef); addMenuHeaderObject("mm_menu_name1", 12, 3, doc); addMenuHeaderObject("mm_menu_name2", 22, 2, doc); addMenuHeaderObject("mm_menu_name1", 42, 1, doc2); addMenuHeaderObject("mm_menu_name2", 32, 4, doc2); expect(xwiki.getDocument(eq(menuBarDocRef), same(context))).andReturn(doc).anyTimes(); expect(xwiki.getDocument(eq(menuBar2DocRef), same(context))).andReturn(doc2).anyTimes(); List<Object> fullNames = new ArrayList<Object>(); fullNames.add("Celements.MenuBar"); fullNames.add("Celements.MenuBar2"); Query mockQuery = createMock(Query.class); expect(queryManagerMock.createQuery(isA(String.class), eq(Query.XWQL))).andReturn( mockQuery).once(); expect(mockQuery.execute()).andReturn(fullNames).once(); expect(xwiki.exists(eq(menuBarDocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar"), same(context))).andReturn(true).anyTimes(); expect(xwiki.exists(eq(menuBar2DocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar2"), same(context))).andReturn(false).anyTimes(); replayAll(mockQuery); TreeMap<Integer, BaseObject> menuHeadersMap = new TreeMap<Integer, BaseObject>(); menuService.addMenuHeaders(menuHeadersMap); ArrayList<BaseObject> menuHeaders = new ArrayList<BaseObject>(); menuHeaders.addAll(menuHeadersMap.values()); assertEquals("Expecting sorted headers", 2, menuHeaders.get(0).getIntValue("pos")); assertEquals("Expecting sorted headers", 22, menuHeaders.get(0).getIntValue("header_id")); assertEquals("Expecting sorted headers", 3, menuHeaders.get(1).getIntValue("pos")); assertEquals("Expecting sorted headers", 12, menuHeaders.get(1).getIntValue("header_id")); verifyAll(mockQuery); } @Test public void testGetMenuHeaders_multipleDocs_celements2web() throws Exception { DocumentReference menuBar2webDocRef = new DocumentReference("celements2web", "Celements", "MenuBar"); DocumentReference menuBar2web2DocRef = new DocumentReference("celements2web", "Celements", "MenuBar2"); expect(xwiki.exists(eq(menuBar2webDocRef), same(context))).andReturn(false).anyTimes(); expect(xwiki.exists(eq(menuBar2web2DocRef), same(context))).andReturn(true).anyTimes(); DocumentReference menuBarDocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar"); XWikiDocument doc = new XWikiDocument(menuBarDocRef); DocumentReference menuBar2DocRef = new DocumentReference(context.getDatabase(), "Celements", "MenuBar2"); XWikiDocument doc2 = new XWikiDocument(menuBar2web2DocRef); addMenuHeaderObject("mm_menu_name1", 13, 3, doc); addMenuHeaderObject("mm_menu_name2", 23, 5, doc); addMenuHeaderObject("mm_menu_name1", 43, 1, doc2); addMenuHeaderObject("mm_menu_name2", 33, 4, doc2); expect(xwiki.getDocument(eq(menuBarDocRef), same(context))).andReturn(doc).once(); List<Object> fullNames = new ArrayList<Object>(); fullNames.add("Celements.MenuBar"); Query mockQuery = createMock(Query.class); expect(queryManagerMock.createQuery(isA(String.class), eq(Query.XWQL))).andReturn( mockQuery).once(); expect(mockQuery.execute()).andReturn(fullNames).once(); List<Object> fullNamesCentral = new ArrayList<Object>(); fullNamesCentral.add("Celements.MenuBar2"); Query mockQuery2 = createMock(Query.class); expect(queryManagerMock.createQuery(isA(String.class), eq(Query.XWQL))).andReturn( mockQuery2).once(); expect(mockQuery2.execute()).andReturn(fullNamesCentral).once(); expect(xwiki.getDocument(eq(menuBar2web2DocRef), same(context))).andReturn(doc2).once(); expect(xwiki.exists(eq(menuBarDocRef), same(context))).andReturn(true).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "xwikidb:Celements.MenuBar"), same(context))).andReturn(true).anyTimes(); expect(xwiki.exists(eq(menuBar2DocRef), same(context))).andReturn(false).anyTimes(); expect(rightsMock.hasAccessLevel(eq("view"), eq("XWiki.XWikiGuest"), eq( "celements2web:Celements.MenuBar2"), same(context))).andReturn(true).anyTimes(); expect(xwiki.getXWikiPreferenceAsInt(eq("CelMenuBar-Celements.MenuBar2"), eq( "celements.menubar.guestview.Celements.MenuBar2"), eq(0), same(context))).andReturn(1); replayAll(mockQuery, mockQuery2); List<BaseObject> menuHeaders = menuService.getMenuHeaders(); assertEquals("Expecting sorted headers", 1, menuHeaders.get(0).getIntValue("pos")); assertEquals("Expecting sorted headers", 43, menuHeaders.get(0).getIntValue("header_id")); assertEquals("Expecting sorted headers", 3, menuHeaders.get(1).getIntValue("pos")); assertEquals("Expecting sorted headers", 13, menuHeaders.get(1).getIntValue("header_id")); assertEquals("Expecting sorted headers", 4, menuHeaders.get(2).getIntValue("pos")); assertEquals("Expecting sorted headers", 33, menuHeaders.get(2).getIntValue("header_id")); assertEquals("Expecting sorted headers", 5, menuHeaders.get(3).getIntValue("pos")); assertEquals("Expecting sorted headers", 23, menuHeaders.get(3).getIntValue("header_id")); verifyAll(mockQuery, mockQuery2); } // ***************************************************************** // * H E L P E R - M E T H O D S * // *****************************************************************/ private void addMenuHeaderObject(String menuName, int headerId, int pos, XWikiDocument doc) { addMenuHeaderObject(null, menuName, headerId, pos, doc); } private void addMenuHeaderObject(Integer objPos, String menuName, int headerId, int pos, XWikiDocument doc) { BaseObject obj = new BaseObject(); obj.setXClassReference(new DocumentReference( doc.getDocumentReference().getWikiReference().getName(), "Celements", "MenuBarHeaderItemClass")); obj.setStringValue("name", menuName); obj.setIntValue("header_id", headerId); obj.setIntValue("pos", pos); if (objPos == null) { doc.addXObject(obj); } else { doc.setXObject(objPos, obj); } } private void replayAll(Object... mocks) { replayDefault(queryManagerMock, rightsMock); replay(mocks); } private void verifyAll(Object... mocks) { verifyDefault(queryManagerMock, rightsMock); verify(mocks); } }