/*
* (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* This library 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.
*
* Contributors:
* Nuxeo - initial API and implementation
*
* $Id: TestActionFilter.java 28610 2008-01-09 17:13:52Z sfermigier $
*/
package org.nuxeo.ecm.platform.actions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import javax.faces.context.FacesContext;
import org.junit.Before;
import org.junit.Test;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.platform.actions.jsf.JSFActionContext;
import org.nuxeo.ecm.platform.ui.web.jsf.MockFacesContext;
import org.nuxeo.runtime.test.NXRuntimeTestCase;
/**
* @author <a href="mailto:at@nuxeo.com">Anahide Tchertchian</a>
*/
public class TestActionFilter extends NXRuntimeTestCase {
protected DocumentModel doc;
protected ActionService as;
protected MockFacesContext facesContext;
@Before
public void setUp() throws Exception {
super.setUp();
deployBundle("org.nuxeo.ecm.core.schema");
deployContrib("org.nuxeo.ecm.actions", "OSGI-INF/actions-framework.xml");
deployContrib("org.nuxeo.ecm.actions.jsf.tests",
"test-filters-contrib.xml");
deployContrib("org.nuxeo.ecm.actions.jsf.tests",
"test-filters-override-contrib.xml");
as = (ActionService) runtime.getComponent(ActionService.ID);
facesContext = new MockFacesContext();
facesContext.setCurrent();
assertNotNull(FacesContext.getCurrentInstance());
}
protected ActionContext getActionContext(DocumentModel doc) {
ActionContext context = new JSFActionContext(facesContext);
context.setCurrentDocument(doc);
return context;
}
protected boolean filterAccept(DocumentModel doc, ActionFilter filter) {
// XXX AT: action is not used anyway
Action action = new Action();
return filter.accept(action, getActionContext(doc));
}
private ActionFilter getFilter(String name) {
return as.getFilterRegistry().getFilter(name);
}
@Test
public void testAccessors() {
ActionFilter filter = new DefaultActionFilter();
filter.setId("foo");
assertEquals("foo", filter.getId());
filter = new DefaultActionFilter("bar", null);
assertEquals("bar", filter.getId());
}
@Test
public void testNull() {
ActionFilter filter = getFilter("null");
assertTrue(filterAccept(null, filter));
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(null, filter));
}
@Test
public void testWorkspaceOrSection() {
ActionFilter filter = getFilter("WorkspaceOrSection");
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Section", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("File", new String[0]);
assertFalse(filterAccept(doc, filter));
}
// test it also works with 2 filters with grant = true
@Test
public void testWorkspaceOrSection2() {
ActionFilter filter = getFilter("WorkspaceOrSection2");
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Section", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("File", new String[0]);
assertFalse(filterAccept(doc, filter));
}
@Test
public void testNotFolderish() {
ActionFilter filter = getFilter("NotFolderish");
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Workspace", new String[] { "Folderish" });
assertFalse(filterAccept(doc, filter));
doc = new MockDocumentModel("File", new String[] { "Folderish" });
assertFalse(filterAccept(doc, filter));
}
@Test
public void testWorkspaceOrSectionFolderish() {
ActionFilter filter = getFilter("WorkspaceOrSectionFolderish");
doc = new MockDocumentModel("Workspace", new String[0]);
assertFalse(filterAccept(doc, filter));
doc = new MockDocumentModel("Workspace", new String[] { "Folderish" });
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("File", new String[] { "Folderish" });
assertFalse(filterAccept(doc, filter));
}
@Test
public void testWorkspaceOrSectionNotFolderish() {
ActionFilter filter = getFilter("WorkspaceOrSectionNotFolderish");
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Workspace", new String[] { "Folderish" });
assertFalse(filterAccept(doc, filter));
doc = new MockDocumentModel("File", new String[] { "Folderish" });
assertFalse(filterAccept(doc, filter));
}
@Test
public void testBadExpression() {
ActionFilter filter = getFilter("badExpression");
doc = new MockDocumentModel("Workspace", new String[0]);
assertFalse(filterAccept(doc, filter));
}
@Test
public void testSF() {
ActionFilter filter = getFilter("CheckId");
doc = new MockDocumentModel("Workspace", new String[0]);
assertEquals("My Document ID", doc.getId());
facesContext.mapVariable("document", doc);
try {
assertTrue(filterAccept(doc, filter));
} finally {
facesContext.resetExpressions();
}
}
// non regression test for NXP-408 : the action is considered valid if no
// denying rule is found and at least one granting rule is found. Check
// that
// when no denying rule is found and no granting rule is found, filter is
// not valid.
@Test
public void testNoDenyingRuleNoGrantingRule() {
ActionFilter filter = getFilter("NoDenyingRuleNoGrantingRule");
doc = new MockDocumentModel("NorWorkspaceNorSection", new String[0]);
assertFalse(filterAccept(doc, filter));
}
@Test
public void testOverrideFilter() {
ActionFilter filter = getFilter("OverridenFilter");
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Section", new String[0]);
assertFalse(filterAccept(doc, filter));
}
@Test
public void testAppendFilter() {
ActionFilter filter = getFilter("AppenedFilter");
DefaultActionFilter dFilter = (DefaultActionFilter) filter;
assertEquals(2, dFilter.getRules().length);
doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Section", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("Folder", new String[0]);
assertTrue(filterAccept(doc, filter));
doc = new MockDocumentModel("File", new String[0]);
assertFalse(filterAccept(doc, filter));
}
@Test
public void testFilterCaching() {
ActionFilter filter = getFilter("WorkspaceOrSection");
Action action = new Action();
ActionContext context = new JSFActionContext(facesContext);
context.setCurrentDocument(doc);
assertEquals(0, context.size());
filter.accept(action, context);
// something cached
assertEquals(1, context.size());
Object precomputed = context.getLocalVariable(DefaultActionFilter.PRECOMPUTED_KEY);
assertNotNull(precomputed);
}
@Test
public void testGroupFilter() {
ActionFilter filter = getFilter("GroupFilter");
DefaultActionFilter dFilter = (DefaultActionFilter) filter;
assertEquals(1, dFilter.getRules().length);
FilterRule rule = dFilter.getRules()[0];
assertEquals("administrators", rule.groups[0]);
}
public void testCheckFilter() {
// test workspace or section
DocumentModel doc = new MockDocumentModel("Workspace", new String[0]);
assertTrue(as.checkFilter("WorkspaceOrSection", getActionContext(doc)));
doc = new MockDocumentModel("Section", new String[0]);
assertTrue(as.checkFilter("WorkspaceOrSection", getActionContext(doc)));
doc = new MockDocumentModel("File", new String[0]);
assertFalse(as.checkFilter("WorkspaceOrSection", getActionContext(doc)));
// test bad expression
doc = new MockDocumentModel("Workspace", new String[0]);
assertFalse(as.checkFilter("badExpression", getActionContext(doc)));
}
@Test
public void testGetAction() throws Exception {
deployContrib("org.nuxeo.ecm.actions.jsf.tests",
"test-actions-contrib.xml");
DocumentModel doc = new MockDocumentModel("Workspace", new String[0]);
Action action = as.getAction("singleActionRetrievedWithFilter",
getActionContext(doc), true);
assertNotNull(action);
assertTrue(action.getAvailable());
action = as.getAction("singleActionRetrievedWithFilter",
getActionContext(doc), false);
assertNotNull(action);
assertTrue(action.getAvailable());
doc = new MockDocumentModel("File", new String[0]);
action = as.getAction("singleActionRetrievedWithFilter",
getActionContext(doc), true);
assertNull(action);
action = as.getAction("singleActionRetrievedWithFilter",
getActionContext(doc), false);
assertNotNull(action);
assertFalse(action.getAvailable());
}
}