package com.celements.webform; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.xwiki.component.descriptor.DefaultComponentDescriptor; import org.xwiki.model.reference.DocumentReference; import org.xwiki.script.service.ScriptService; import com.celements.common.test.AbstractBridgedComponentTestCase; import com.celements.model.access.IModelAccessFacade; import com.celements.model.access.exception.DocumentSaveException; 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.user.api.XWikiRightService; import com.xpn.xwiki.web.Utils; import com.xpn.xwiki.web.XWikiRequest; public class DocFormScriptServiceTest extends AbstractBridgedComponentTestCase { private XWikiContext context; private XWiki xwiki; private DocFormScriptService docFormService; private IModelAccessFacade modelAccessFacade; @Before public void setUp_DocFormScriptServiceTest() throws Exception { context = getContext(); xwiki = getWikiMock(); docFormService = (DocFormScriptService) Utils.getComponent(ScriptService.class, "docform"); modelAccessFacade = createMockAndAddToDefault(IModelAccessFacade.class); DefaultComponentDescriptor<IModelAccessFacade> descriptor = new DefaultComponentDescriptor<IModelAccessFacade>(); descriptor.setRole(IModelAccessFacade.class); descriptor.setRoleHint("default"); Utils.getComponentManager().registerComponent(descriptor, modelAccessFacade); } @Test public void testCheckRightsAndSaveXWikiDocCollection_empty() throws XWikiException { Map<String, Set<DocumentReference>> result = docFormService.checkRightsAndSaveXWikiDocCollection( Collections.<XWikiDocument>emptyList()); assertEquals(2, result.size()); assertEquals(0, result.get("successful").size()); assertEquals(0, result.get("failed").size()); } @Test public void testCheckRightsAndSaveXWikiDocCollection_saveDoc() throws XWikiException, DocumentSaveException { Collection<XWikiDocument> xdocs = new ArrayList<XWikiDocument>(); XWikiDocument doc = new XWikiDocument(new DocumentReference("w", "S", "D")); doc.setNew(false); xdocs.add(doc); modelAccessFacade.saveDocument(eq(doc), (String) anyObject()); expectLastCall(); XWikiRightService rightService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(rightService).anyTimes(); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S.D"), same( getContext()))).andReturn(true); XWikiRequest request = createMockAndAddToDefault(XWikiRequest.class); expect(request.get(eq("createIfNotExists"))).andReturn("false").anyTimes(); context.setRequest(request); replayDefault(); Map<String, Set<DocumentReference>> result = docFormService.checkRightsAndSaveXWikiDocCollection( xdocs); verifyDefault(); assertEquals(2, result.size()); assertEquals(1, result.get("successful").size()); assertEquals(0, result.get("failed").size()); } @Test public void testCheckRightsAndSaveXWikiDocCollection_newWithoutCreateIfNotExists() throws XWikiException { Collection<XWikiDocument> xdocs = new ArrayList<XWikiDocument>(); XWikiDocument doc = new XWikiDocument(new DocumentReference("w", "S", "D")); xdocs.add(doc); XWikiRequest request = createMockAndAddToDefault(XWikiRequest.class); expect(request.get(eq("createIfNotExists"))).andReturn("false").anyTimes(); context.setRequest(request); replayDefault(); Map<String, Set<DocumentReference>> result = docFormService.checkRightsAndSaveXWikiDocCollection( xdocs); verifyDefault(); assertEquals(2, result.size()); assertEquals(0, result.get("successful").size()); assertEquals(1, result.get("failed").size()); } @Test public void testCheckRightsAndSaveXWikiDocCollection_saveDoc_multiple_notRightsOnAll() throws XWikiException { Collection<XWikiDocument> xdocs = new ArrayList<XWikiDocument>(); String docName1 = "HasRight"; String docName2 = "NoRight"; XWikiDocument doc1 = new XWikiDocument(new DocumentReference("w", "S", docName1)); doc1.setNew(false); xdocs.add(doc1); XWikiDocument doc2 = new XWikiDocument(new DocumentReference("w", "S", docName2)); xdocs.add(doc2); XWikiRightService rightService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(rightService).anyTimes(); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S." + docName1), same(getContext()))).andReturn(true); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S." + docName2), same(getContext()))).andReturn(false); XWikiRequest request = createMockAndAddToDefault(XWikiRequest.class); expect(request.get(eq("createIfNotExists"))).andReturn("true").anyTimes(); context.setRequest(request); replayDefault(); Map<String, Set<DocumentReference>> result = docFormService.checkRightsAndSaveXWikiDocCollection( xdocs); verifyDefault(); assertEquals(2, result.size()); assertEquals(0, result.get("successful").size()); assertEquals(2, result.get("failed").size()); DocumentReference[] failed = new DocumentReference[] { null, null }; failed = result.get("failed").toArray(failed); assertTrue((docName1.equals(failed[0].getName()) && docName2.equals(failed[1].getName())) || (docName1.equals(failed[1].getName()) && docName2.equals(failed[0].getName()))); } @Test public void testCheckRightsAndSaveXWikiDocCollection_saveDoc_multiple_rightsOnAll() throws XWikiException, DocumentSaveException { Collection<XWikiDocument> xdocs = new ArrayList<XWikiDocument>(); String docName1 = "HasRight1"; String docName2 = "HasRight2"; XWikiDocument doc1 = new XWikiDocument(new DocumentReference("w", "S", docName1)); xdocs.add(doc1); XWikiDocument doc2 = new XWikiDocument(new DocumentReference("w", "S", docName2)); xdocs.add(doc2); modelAccessFacade.saveDocument(eq(doc1), (String) anyObject()); expectLastCall(); modelAccessFacade.saveDocument(eq(doc2), (String) anyObject()); expectLastCall(); XWikiRightService rightService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(rightService).anyTimes(); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S." + docName1), same(getContext()))).andReturn(true); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S." + docName2), same(getContext()))).andReturn(true); XWikiRequest request = createMockAndAddToDefault(XWikiRequest.class); expect(request.get(eq("createIfNotExists"))).andReturn("true").anyTimes(); context.setRequest(request); replayDefault(); Map<String, Set<DocumentReference>> result = docFormService.checkRightsAndSaveXWikiDocCollection( xdocs); verifyDefault(); assertEquals(2, result.size()); assertEquals(2, result.get("successful").size()); DocumentReference[] success = new DocumentReference[] { null, null }; success = result.get("successful").toArray(success); assertTrue((docName1.equals(success[0].getName()) && docName2.equals(success[1].getName())) || (docName1.equals(success[1].getName()) && docName2.equals(success[0].getName()))); assertEquals(0, result.get("failed").size()); } @Test public void testCheckRightsAndSaveXWikiDocCollection_saveDoc_multiple_rightsOnAll_exception() throws XWikiException, DocumentSaveException { Collection<XWikiDocument> xdocs = new ArrayList<XWikiDocument>(); String docName1 = "HasRight1"; String docName2 = "HasRight2"; DocumentReference doc2Ref = new DocumentReference("w", "S", docName2); XWikiDocument doc1 = new XWikiDocument(new DocumentReference("w", "S", docName1)); xdocs.add(doc1); XWikiDocument doc2 = new XWikiDocument(doc2Ref); xdocs.add(doc2); modelAccessFacade.saveDocument(eq(doc1), (String) anyObject()); expectLastCall(); modelAccessFacade.saveDocument(eq(doc2), (String) anyObject()); expectLastCall().andThrow(new DocumentSaveException(doc2Ref)); XWikiRightService rightService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(rightService).anyTimes(); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S." + docName1), same(getContext()))).andReturn(true); expect(rightService.hasAccessLevel(eq("edit"), eq(getContext().getUser()), eq("w:S." + docName2), same(getContext()))).andReturn(true); XWikiRequest request = createMockAndAddToDefault(XWikiRequest.class); expect(request.get(eq("createIfNotExists"))).andReturn("true").anyTimes(); context.setRequest(request); replayDefault(); Map<String, Set<DocumentReference>> result = docFormService.checkRightsAndSaveXWikiDocCollection( xdocs); verifyDefault(); assertEquals(2, result.size()); assertEquals(1, result.get("successful").size()); assertEquals(docName1, ((DocumentReference) result.get("successful").toArray()[0]).getName()); assertEquals(1, result.get("failed").size()); assertEquals(docName2, ((DocumentReference) result.get("failed").toArray()[0]).getName()); } }