package com.celements.rights; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.GregorianCalendar; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.DocumentReference; import com.celements.common.classes.IClassCollectionRole; import com.celements.common.test.AbstractBridgedComponentTestCase; import com.celements.web.classcollections.DocumentDetailsClasses; import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiException; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.objects.BaseObject; import com.xpn.xwiki.user.api.XWikiGroupService; import com.xpn.xwiki.user.api.XWikiRightNotFoundException; import com.xpn.xwiki.web.Utils; public class CelementsRightServiceImplTest extends AbstractBridgedComponentTestCase { CelementsRightServiceImpl rightService; XWiki xwiki; @Before public void setUp_CelementsRightServiceImplTest() throws Exception { rightService = new CelementsRightServiceImpl(); xwiki = createMock(XWiki.class); getContext().setWiki(xwiki); } @Test public void testCheckRight_publishNotActive() throws XWikiRightNotFoundException, XWikiException { XWikiGroupService gs = createMock(XWikiGroupService.class); expect(xwiki.getGroupService(same(getContext()))).andReturn(gs).anyTimes(); Collection<DocumentReference> groupsList = new ArrayList<DocumentReference>(); groupsList.add(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "user")), eq(0), eq(0), same(getContext()))).andReturn(groupsList).anyTimes(); Collection<DocumentReference> emptyGroupsList = Collections.emptyList(); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")), eq(0), eq(0), same(getContext()))).andReturn( emptyGroupsList).anyTimes(); expect(xwiki.isVirtualMode()).andReturn(true).anyTimes(); XWikiDocument doc = new XWikiDocument(new DocumentReference(getContext().getDatabase(), "TestSpace", "TestDoc")); getContext().setDoc(doc); expect(xwiki.getSpacePreference(eq("publishdate_active"), eq("TestSpace"), eq("-1"), same( getContext()))).andReturn("0").anyTimes(); BaseObject rightObj = new BaseObject(); rightObj.setXClassReference(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiRights")); rightObj.setStringValue("users", "XWiki.user"); rightObj.setStringValue("levels", "view,edit"); rightObj.setIntValue("allow", 1); doc.addXObject(rightObj); replay(gs, xwiki); assertTrue(rightService.checkRight("XWiki.user", doc, "view", true, true, false, getContext())); verify(gs, xwiki); } @Test public void testCheckRight_publishActive_defaultNoObject() throws XWikiRightNotFoundException, XWikiException { XWikiGroupService gs = createMock(XWikiGroupService.class); expect(xwiki.getGroupService(same(getContext()))).andReturn(gs).anyTimes(); Collection<DocumentReference> groupsList = new ArrayList<DocumentReference>(); groupsList.add(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "user")), eq(0), eq(0), same(getContext()))).andReturn(groupsList).anyTimes(); Collection<DocumentReference> emptyGroupsList = Collections.emptyList(); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")), eq(0), eq(0), same(getContext()))).andReturn( emptyGroupsList).anyTimes(); expect(xwiki.isVirtualMode()).andReturn(true).anyTimes(); expect(xwiki.getSpacePreference(eq("publishdate_active"), eq("TestSpace"), eq("-1"), same( getContext()))).andReturn("1").anyTimes(); XWikiDocument doc = new XWikiDocument(new DocumentReference(getContext().getDatabase(), "TestSpace", "TestDoc")); getContext().setDoc(doc); BaseObject rightObj = new BaseObject(); rightObj.setXClassReference(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiRights")); rightObj.setStringValue("users", "XWiki.user"); rightObj.setStringValue("levels", "view"); rightObj.setIntValue("allow", 1); doc.addXObject(rightObj); replay(gs, xwiki); assertTrue(rightService.checkRight("XWiki.user", doc, "view", true, true, false, getContext())); verify(gs, xwiki); } @Test public void testCheckRight_publishActive_unpublished() throws XWikiRightNotFoundException, XWikiException { XWikiGroupService gs = createMock(XWikiGroupService.class); expect(xwiki.getGroupService(same(getContext()))).andReturn(gs).anyTimes(); Collection<DocumentReference> groupsList = new ArrayList<DocumentReference>(); groupsList.add(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "user")), eq(0), eq(0), same(getContext()))).andReturn(groupsList).anyTimes(); Collection<DocumentReference> emptyGroupsList = Collections.emptyList(); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")), eq(0), eq(0), same(getContext()))).andReturn( emptyGroupsList).anyTimes(); expect(xwiki.isVirtualMode()).andReturn(true).anyTimes(); expect(xwiki.getSpacePreference(eq("publishdate_active"), eq("TestSpace"), eq("-1"), same( getContext()))).andReturn("1").anyTimes(); XWikiDocument doc = new XWikiDocument(new DocumentReference(getContext().getDatabase(), "TestSpace", "TestDoc")); getContext().setDoc(doc); BaseObject rightObj = new BaseObject(); rightObj.setXClassReference(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiRights")); rightObj.setStringValue("users", "XWiki.user"); rightObj.setStringValue("levels", "view"); rightObj.setIntValue("allow", 1); doc.addXObject(rightObj); Calendar gc = GregorianCalendar.getInstance(); BaseObject obj = new BaseObject(); gc.add(GregorianCalendar.HOUR, 1); obj.setDateValue("publishDate", gc.getTime()); obj.setXClassReference(getPublicationClassReference()); doc.addXObject(obj); replay(gs, xwiki); assertFalse(rightService.checkRight("XWiki.user", doc, "view", true, true, false, getContext())); verify(gs, xwiki); } @Test public void testCheckRight_publishActive_published() throws XWikiRightNotFoundException, XWikiException { XWikiGroupService gs = createMock(XWikiGroupService.class); expect(xwiki.getGroupService(same(getContext()))).andReturn(gs).anyTimes(); Collection<DocumentReference> groupsList = new ArrayList<DocumentReference>(); groupsList.add(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "user")), eq(0), eq(0), same(getContext()))).andReturn(groupsList).anyTimes(); Collection<DocumentReference> emptyGroupsList = Collections.emptyList(); expect(gs.getAllGroupsReferencesForMember(eq(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiAllGroup")), eq(0), eq(0), same(getContext()))).andReturn( emptyGroupsList).anyTimes(); expect(xwiki.isVirtualMode()).andReturn(true).anyTimes(); expect(xwiki.getSpacePreference(eq("publishdate_active"), eq("TestSpace"), eq("-1"), same( getContext()))).andReturn("1").anyTimes(); XWikiDocument doc = new XWikiDocument(new DocumentReference(getContext().getDatabase(), "TestSpace", "TestDoc")); getContext().setDoc(doc); BaseObject rightObj = new BaseObject(); rightObj.setXClassReference(new DocumentReference(getContext().getDatabase(), "XWiki", "XWikiRights")); rightObj.setStringValue("users", "XWiki.user"); rightObj.setStringValue("levels", "view"); rightObj.setIntValue("allow", 1); doc.addXObject(rightObj); Calendar gc = GregorianCalendar.getInstance(); BaseObject obj = new BaseObject(); gc.add(GregorianCalendar.HOUR, -1); obj.setDateValue("publishDate", gc.getTime()); gc.add(GregorianCalendar.HOUR, 1); gc.add(GregorianCalendar.HOUR, 1); obj.setDateValue("unpublishDate", gc.getTime()); obj.setXClassReference(getPublicationClassReference()); doc.addXObject(obj); replay(gs, xwiki); assertTrue(rightService.checkRight("XWiki.user", doc, "view", true, true, false, getContext())); verify(gs, xwiki); } private DocumentReference getPublicationClassReference() { return ((DocumentDetailsClasses) Utils.getComponent(IClassCollectionRole.class, DocumentDetailsClasses.NAME)).getDocumentPublicationClassRef(getContext().getDatabase()); } }