/*
* (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Nuxeo - initial API and implementation
*/
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.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.nuxeo.runtime.test.NXRuntimeTestCase;
/**
* @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
*/
public class TestAction extends NXRuntimeTestCase {
ActionService as;
@Before
public void setUp() throws Exception {
super.setUp();
deployContrib("org.nuxeo.ecm.actions", "OSGI-INF/actions-framework.xml");
deployContrib("org.nuxeo.ecm.actions.tests", "test-actions-contrib.xml");
as = (ActionService) runtime.getComponent(ActionService.ID);
}
@Test
public void testActionExtensionPoint() {
Collection<Action> actions = as.getActionRegistry().getActions();
assertEquals(9, actions.size());
Action newDocument = as.getAction("newDocument");
assertEquals("newDocument", newDocument.getId());
assertEquals("select_document_type", newDocument.getLink());
assertEquals("action.new.document", newDocument.getLabel());
assertTrue(newDocument.isEnabled());
assertEquals("/icons/action_add.gif", newDocument.getIcon());
String[] categories = newDocument.getCategories();
assertEquals(1, categories.length);
assertEquals("folder", categories[0]);
List<String> filterIds = new ArrayList<>();
filterIds.add("createChild");
assertEquals(filterIds, newDocument.getFilterIds());
Action logout = as.getAction("logout");
assertEquals("logout", logout.getId());
assertEquals("logout", logout.getLink());
assertEquals("Logout", logout.getLabel());
assertTrue(logout.isEnabled());
assertEquals("/icons/logout.gif", logout.getIcon());
categories = logout.getCategories();
assertEquals(1, categories.length);
assertEquals("global", categories[0]);
filterIds.clear();
assertEquals(filterIds, logout.getFilterIds());
Action viewHiddenInfo = as.getAction("viewHiddenInfo");
assertEquals("viewHiddenInfo", viewHiddenInfo.getId());
assertEquals("view_hidden_info", viewHiddenInfo.getLink());
assertEquals("viewHiddenInfo", viewHiddenInfo.getLabel());
assertFalse(viewHiddenInfo.isEnabled());
assertNull(viewHiddenInfo.getIcon());
categories = logout.getCategories();
assertEquals(1, categories.length);
assertEquals("global", categories[0]);
filterIds.clear();
assertEquals(filterIds, viewHiddenInfo.getFilterIds());
Action view = as.getAction("TAB_VIEW");
assertEquals("TAB_VIEW", view.getId());
assertEquals("view", view.getLink());
assertEquals("View", view.getLabel());
assertTrue(view.isEnabled());
assertEquals("/icons/view.gif", view.getIcon());
categories = view.getCategories();
assertEquals(2, categories.length);
assertEquals("tabs", categories[0]);
assertEquals("view", categories[1]);
filterIds.clear();
filterIds.add("MyCustomFilter");
assertEquals(filterIds, view.getFilterIds());
}
@Test
public void testFilterExtensionPoint() {
Collection<ActionFilter> filters = as.getFilterRegistry().getFilters();
assertEquals(5, filters.size());
ActionFilter f1 = as.getFilter("MyCustomFilter");
DefaultActionFilter f2 = (DefaultActionFilter) as.getFilter("theFilter");
DefaultActionFilter f3 = (DefaultActionFilter) as.getFilter("createChild");
assertSame(DummyFilter.class, f1.getClass());
assertSame(DefaultActionFilter.class, f2.getClass());
assertSame(DefaultActionFilter.class, f3.getClass());
assertEquals("MyCustomFilter", f1.getId());
assertEquals("theFilter", f2.getId());
assertEquals("createChild", f3.getId());
assertEquals(2, f2.getRules().length);
FilterRule rule1 = f2.getRules()[0];
FilterRule rule2 = f2.getRules()[1];
assertTrue(rule1.grant);
assertTrue(rule2.grant);
assertEquals(1, rule1.conditions.length);
assertEquals(2, rule2.conditions.length);
assertEquals("EL condition", rule1.conditions[0]);
assertEquals("EL condition 1", rule2.conditions[0]);
assertEquals("EL condition 2", rule2.conditions[1]);
assertEquals(2, rule1.permissions.length);
assertEquals(0, rule2.permissions.length);
assertEquals("admin", rule1.permissions[0]);
assertEquals("editor", rule1.permissions[1]);
assertEquals(2, rule1.facets.length);
assertEquals(0, rule2.facets.length);
assertEquals("Viewable", rule1.facets[0]);
assertEquals("Writable", rule1.facets[1]);
assertEquals(1, f3.getRules().length);
FilterRule rule = f3.getRules()[0];
assertTrue(rule.grant);
assertEquals(1, rule.permissions.length);
assertEquals("Write", rule.permissions[0]);
assertEquals(1, rule.facets.length);
assertEquals("Versionable", rule.facets[0]);
assertEquals(2, rule.types.length);
assertEquals("Workspace", rule.types[0]);
assertEquals("Section", rule.types[1]);
assertEquals(1, rule.schemas.length);
assertEquals("Folder", rule.schemas[0]);
assertEquals(1, rule.conditions.length);
assertEquals("principal.getName()=='gandalf'", rule.conditions[0]);
}
@Test
public void testActionOverride() throws Exception {
Action viewAction = as.getAction("TAB_VIEW");
assertNotNull(viewAction);
assertEquals(2, viewAction.getCategories().length);
assertFalse(Arrays.asList(viewAction.getCategories()).contains("OVERRIDE"));
assertEquals(1, viewAction.getFilterIds().size());
assertTrue(viewAction.getFilterIds().contains("MyCustomFilter"));
Action disabledAction = as.getAction("disabledAction");
assertFalse(disabledAction.isEnabled());
// deploy override
deployContrib("org.nuxeo.ecm.actions.tests", "test-actions-override-contrib.xml");
Action oviewAction = as.getAction("TAB_VIEW");
assertNotNull(oviewAction);
assertEquals("newConfirm", oviewAction.getConfirm());
assertEquals(3, oviewAction.getCategories().length);
assertTrue(Arrays.asList(oviewAction.getCategories()).contains("OVERRIDE"));
assertTrue(Arrays.asList(oviewAction.getCategories()).contains("view"));
List<String> filterIds = oviewAction.getFilterIds();
assertNotNull(filterIds);
assertEquals(5, filterIds.size());
assertEquals("MyCustomFilter", filterIds.get(0));
assertEquals("newFilterId1", filterIds.get(1));
// filter 4 is not embedded => comes first
assertEquals("newFilterId4", filterIds.get(2));
assertEquals("newFilter2", filterIds.get(3));
assertEquals("newFilter3", filterIds.get(4));
// check corresponding filters are registered correctly
ActionFilter filter = as.getFilter("foo");
assertNull(filter);
filter = as.getFilter("MyCustomFilter");
assertNotNull(filter);
// no filter by that name
filter = as.getFilter("newFilterId1");
assertNull(filter);
// no filter by that name
filter = as.getFilter("newFilterId4");
assertNull(filter);
filter = as.getFilter("newFilter2");
assertNotNull(filter);
filter = as.getFilter("newFilter3");
assertNotNull(filter);
disabledAction = as.getAction("disabledAction");
assertFalse(disabledAction.isEnabled());
}
// NXP-7287: test override of inner filter
@Test
public void testActionOverrideOfInnerFilter() throws Exception {
Action previewAction = as.getAction("TAB_WITH_LOCAL_FILTER");
assertNotNull(previewAction);
assertEquals(1, previewAction.getCategories().length);
assertTrue(Arrays.asList(previewAction.getCategories()).contains("VIEW_ACTION_LIST"));
assertFalse(Arrays.asList(previewAction.getCategories()).contains("OVERRIDE"));
List<String> previewFilterIds = previewAction.getFilterIds();
assertEquals(1, previewFilterIds.size());
assertTrue(previewFilterIds.contains("local_filter"));
DefaultActionFilter previewFilter = (DefaultActionFilter) as.getFilter("local_filter");
FilterRule[] previewRules = previewFilter.getRules();
assertNotNull(previewRules);
assertEquals(1, previewRules.length);
assertTrue(previewRules[0].grant);
assertEquals("filter defined in action", previewRules[0].types[0]);
// deploy override
deployContrib("org.nuxeo.ecm.actions.tests", "test-actions-override-contrib.xml");
Action opreviewAction = as.getAction("TAB_WITH_LOCAL_FILTER");
assertNotNull(opreviewAction);
assertEquals(1, opreviewAction.getCategories().length);
assertTrue(Arrays.asList(opreviewAction.getCategories()).contains("VIEW_ACTION_LIST"));
assertFalse(Arrays.asList(opreviewAction.getCategories()).contains("OVERRIDE"));
assertEquals(1, opreviewAction.getFilterIds().size());
assertTrue(opreviewAction.getFilterIds().contains("local_filter"));
DefaultActionFilter opreviewFilter = (DefaultActionFilter) as.getFilter("local_filter");
FilterRule[] opreviewRules = opreviewFilter.getRules();
assertNotNull(opreviewRules);
assertEquals(2, opreviewRules.length);
assertTrue(opreviewRules[0].grant);
assertEquals("filter defined in action", previewRules[0].types[0]);
assertFalse(opreviewRules[1].grant);
assertEquals("filter overriden globally", opreviewRules[1].types[0]);
}
// NXP-9677: test override of inner filter after uninstall of the first
// contribution
@Test
public void testActionUninstallOverrideOfInnerFilter() throws Exception {
Action previewAction = as.getAction("TAB_WITH_LOCAL_FILTER");
assertNotNull(previewAction);
assertEquals(1, previewAction.getCategories().length);
assertTrue(Arrays.asList(previewAction.getCategories()).contains("VIEW_ACTION_LIST"));
assertFalse(Arrays.asList(previewAction.getCategories()).contains("OVERRIDE"));
List<String> previewFilterIds = previewAction.getFilterIds();
assertEquals(1, previewFilterIds.size());
assertTrue(previewFilterIds.contains("local_filter"));
DefaultActionFilter previewFilter = (DefaultActionFilter) as.getFilter("local_filter");
FilterRule[] previewRules = previewFilter.getRules();
assertNotNull(previewRules);
assertEquals(1, previewRules.length);
assertTrue(previewRules[0].grant);
assertEquals("filter defined in action", previewRules[0].types[0]);
// uninstall first, this time
undeployContrib("org.nuxeo.ecm.actions.tests", "test-actions-contrib.xml");
// deploy override
deployContrib("org.nuxeo.ecm.actions.tests", "test-actions-override-innerfilter-contrib.xml");
Action opreviewAction = as.getAction("TAB_WITH_LOCAL_FILTER");
assertNotNull(opreviewAction);
assertEquals(1, opreviewAction.getCategories().length);
assertTrue(Arrays.asList(opreviewAction.getCategories()).contains("OVERRIDE"));
assertFalse(Arrays.asList(opreviewAction.getCategories()).contains("VIEW_ACTION_LIST"));
assertEquals(1, opreviewAction.getFilterIds().size());
assertTrue(opreviewAction.getFilterIds().contains("local_filter"));
DefaultActionFilter opreviewFilter = (DefaultActionFilter) as.getFilter("local_filter");
FilterRule[] opreviewRules = opreviewFilter.getRules();
assertNotNull(opreviewRules);
assertEquals(1, opreviewRules.length);
assertFalse(opreviewRules[0].grant);
assertEquals("filter re-defined in action", opreviewRules[0].types[0]);
}
// NXP-7287: test override by inner filter
@Test
public void testActionOverrideByInnerFilter() throws Exception {
Action previewAction = as.getAction("TAB_WITH_GLOBAL_FILTER");
assertNotNull(previewAction);
assertEquals(1, previewAction.getCategories().length);
assertTrue(Arrays.asList(previewAction.getCategories()).contains("VIEW_ACTION_LIST"));
assertFalse(Arrays.asList(previewAction.getCategories()).contains("OVERRIDE"));
List<String> previewFilterIds = previewAction.getFilterIds();
assertEquals(1, previewFilterIds.size());
assertTrue(previewFilterIds.contains("filter_defined_globally"));
DefaultActionFilter previewFilter = (DefaultActionFilter) as.getFilter("filter_defined_globally");
FilterRule[] previewRules = previewFilter.getRules();
assertNotNull(previewRules);
assertEquals(1, previewRules.length);
assertFalse(previewRules[0].grant);
assertEquals("filter defined in its extension point", previewRules[0].types[0]);
// deploy override
deployContrib("org.nuxeo.ecm.actions.tests", "test-actions-override-contrib.xml");
Action opreviewAction = as.getAction("TAB_WITH_GLOBAL_FILTER");
assertNotNull(opreviewAction);
assertEquals(2, opreviewAction.getCategories().length);
assertTrue(Arrays.asList(opreviewAction.getCategories()).contains("VIEW_ACTION_LIST"));
assertTrue(Arrays.asList(opreviewAction.getCategories()).contains("OVERRIDE"));
assertEquals(1, opreviewAction.getFilterIds().size());
assertTrue(opreviewAction.getFilterIds().contains("filter_defined_globally"));
DefaultActionFilter opreviewFilter = (DefaultActionFilter) as.getFilter("filter_defined_globally");
FilterRule[] opreviewRules = opreviewFilter.getRules();
assertNotNull(opreviewRules);
assertEquals(2, opreviewRules.length);
assertFalse(opreviewRules[0].grant);
assertEquals("filter defined in its extension point", previewRules[0].types[0]);
assertFalse(opreviewRules[1].grant);
assertEquals("local override of global filter", opreviewRules[1].types[0]);
}
// test sort of actions with same order value
@Test
public void testActionSort() {
List<Action> actions;
Action a1 = new Action("id1", null);
Action a2 = new Action("id2", null);
actions = new ArrayList<>(Arrays.asList(a1, a2));
Collections.sort(actions);
assertEquals("id1", actions.get(0).getId());
assertEquals("id2", actions.get(1).getId());
// now start with opposite order
actions = new ArrayList<>(Arrays.asList(a2, a1));
Collections.sort(actions);
assertEquals("id1", actions.get(0).getId());
assertEquals("id2", actions.get(1).getId());
}
/**
* NXP-8739: test that after an action is cloned, availability set on it does not impact the action used on service
*
* @since 5.6
*/
@Test
public void testActionClone() {
Action action1 = as.getAction("viewHiddenInfo");
assertTrue(action1.getAvailable());
action1.setAvailable(false);
assertFalse(action1.getAvailable());
Action action2 = as.getAction("viewHiddenInfo");
assertTrue(action2.getAvailable());
// check first action has not changed
assertFalse(action1.getAvailable());
}
@SuppressWarnings("unchecked")
@Test
public void testActionProperties() throws Exception {
Action action = as.getAction("actionTestProperties");
assertTrue(action.getAvailable());
Map<String, Serializable> properties = action.getProperties();
assertEquals(3, properties.size());
// Test single property
assertEquals("property", properties.get("property"));
// Test property list
String[] actionList = (String[]) action.getProperties().get("list");
assertEquals("listItemA", actionList[0]);
assertEquals("listItemB", actionList[1]);
// Test property map
Map<String, Serializable> mapProperties = (Map<String, Serializable>) action.getProperties().get("map");
assertEquals("mapProperty", mapProperties.get("mapProperty"));
String[] mapActionList = (String[]) mapProperties.get("mapList");
assertEquals("mapListItemA", mapActionList[0]);
assertEquals("mapListItemB", mapActionList[1]);
// Test sub property map
Map<String, Serializable> subMapProperties = (Map<String, Serializable>) mapProperties.get("subMap");
assertEquals("subMapProperty", subMapProperties.get("subMapProperty"));
// deploy override
deployContrib("org.nuxeo.ecm.actions.tests", "test-actions-override-contrib.xml");
action = as.getAction("actionTestProperties");
properties = action.getProperties();
assertEquals(4, properties.size());
// Test added single property
assertEquals("newProperty", properties.get("newProperty"));
}
@Test
public void testUnknownAction() throws Exception {
Action a = as.getAction("FOO", null, true);
assertNull(a);
}
}