/*
* (C) Copyright 2015 Netcentric AG.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package biz.netcentric.cq.tools.actool.configreader;
import static biz.netcentric.cq.tools.actool.configreader.YamlConfigReaderTest.getYamlList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.MockitoAnnotations.initMocks;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import biz.netcentric.cq.tools.actool.configmodel.AceBean;
import biz.netcentric.cq.tools.actool.configmodel.AcesConfig;
import biz.netcentric.cq.tools.actool.configmodel.AuthorizableConfigBean;
import biz.netcentric.cq.tools.actool.configmodel.AuthorizablesConfig;
import biz.netcentric.cq.tools.actool.configmodel.GlobalConfiguration;
import biz.netcentric.cq.tools.actool.history.AcInstallationLog;
import biz.netcentric.cq.tools.actool.validators.exceptions.AcConfigBeanValidationException;
public class YamlMacroProcessorTest {
@Mock
YamlMacroChildNodeObjectsProviderImpl yamlMacroChildNodeObjectsProvider;
@Mock
AcInstallationLog installLog;
@Mock
Session session;
@InjectMocks
YamlMacroProcessorImpl yamlMacroProcessor = new YamlMacroProcessorImpl();
@Before
public void setup() {
initMocks(this);
}
@Test
public void testGroupLoop() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-loop.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals("Number of groups", 10, groups.size());
assertEquals("Path of group", "/home/groups/BRAND1", groups.getAuthorizableConfig("content-BRAND1-reader").getPath());
assertEquals("Path of group", "/home/groups/BRAND1", groups.getAuthorizableConfig("content-BRAND1-writer").getPath());
assertEquals("Path of group", "/home/groups/BRAND2", groups.getAuthorizableConfig("content-BRAND2-reader").getPath());
assertEquals("Path of group", "/home/groups/BRAND2", groups.getAuthorizableConfig("content-BRAND2-writer").getPath());
assertEquals("Path of group", "/home/groups/BRAND3", groups.getAuthorizableConfig("content-BRAND3-reader").getPath());
assertEquals("Path of group", "/home/groups/BRAND3", groups.getAuthorizableConfig("content-BRAND3-writer").getPath());
assertEquals("Path of group", "/home/groups/VAR1", groups.getAuthorizableConfig("content-VAR1").getPath());
assertEquals("Path of group", "/home/groups/VAR2", groups.getAuthorizableConfig("content-VAR2").getPath());
assertEquals("Path of group", "/home/groups/VAR3", groups.getAuthorizableConfig("content-VAR3").getPath());
}
@Test
public void testNestedGroupLoop() throws IOException, AcConfigBeanValidationException, RepositoryException {
final ConfigReader yamlConfigReader = new YamlConfigReader();
List<LinkedHashMap> yamlList = getYamlList("test-nested-loops.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals("Number of groups", 13, groups.size());
assertEquals("Path of group", "/home/groups/BRAND1", groups.getAuthorizableConfig("content-BRAND1-reader").getPath());
assertEquals("Path of group", "/home/groups/BRAND1/MKT1", groups.getAuthorizableConfig("content-BRAND1-MKT1-writer").getPath());
}
@Test
public void testAceLoop() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-loop.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AcesConfig aces = readAceConfigs(yamlList);
assertEquals("Number of ACEs", 7, aces.size());
final Set<AceBean> group1 = aces.filterByPrincipalName("content-BRAND-MKT1-reader");
assertEquals("Number of ACEs for groupA", 1, group1.size());
final Set<AceBean> group2 = aces.filterByPrincipalName("content-BRAND-MKT2-writer");
assertEquals("Number of ACEs for groupB", 2, group2.size());
}
/** @see <a href=
* "https://github.com/Netcentric/accesscontroltool/issues/14">https://github.com/Netcentric/accesscontroltool/issues/14</a> */
@Test
public void testAceLoopWithHyphen() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-loop-with-hyphen.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AcesConfig aces = readAceConfigs(yamlList);
assertEquals("Number of ACEs", 7, aces.size());
final Set<AceBean> group1 = aces.filterByPrincipalName("content-BRAND-MKT-1-reader");
assertEquals("Number of ACEs for groupA", 1, group1.size());
final Set<AceBean> group2 = aces.filterByPrincipalName("content-BRAND-MKT-2-writer");
assertEquals("Number of ACEs for groupB", 2, group2.size());
}
@Test
public void testNestedLoop() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-nested-loops.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AcesConfig aces = readAceConfigs(yamlList);
assertEquals("Number of ACEs", 12, aces.size());
assertFalse(aces.filterByPrincipalName("content-BRAND1-reader").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND1-writer").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND2-reader").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND2-writer").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND1-MKT1-reader").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND1-MKT1-writer").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND2-MKT1-reader").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND2-MKT1-writer").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND1-MKT2-reader").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND1-MKT2-writer").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND2-MKT2-reader").isEmpty());
assertFalse(aces.filterByPrincipalName("content-BRAND2-MKT2-writer").isEmpty());
AceBean b1m1r = aces.filterByPrincipalName("content-BRAND1-MKT1-reader").iterator().next();
assertEquals("JCR path", "/content/BRAND1/MKT1", b1m1r.getJcrPath());
}
@Test
public void testIf() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-if.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AcesConfig aces = readAceConfigs(yamlList);
assertEquals("Number of Groups in ACE Section", 3, aces.size());
final Set<AceBean> group1 = aces.filterByPrincipalName("content-reader");
assertEquals("Number of ACEs for groupA", 1, group1.size());
final Set<AceBean> group2 = aces.filterByPrincipalName("content-writer");
assertEquals("Number of ACEs for groupB", 2, group2.size());
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals("Number of groups", 1, groups.size());
assertEquals("Path of group", "/home/groups/folder2", groups.getAuthorizableConfig("content-writer").getPath());
}
@Test
public void testLoopChildrenOf() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-loop-children-of.yaml");
String contentLocationChildrenFromYamlFile = "/content/test";
doReturn(getExampleValuesForLoopOverChildrenOfPath()).when(yamlMacroChildNodeObjectsProvider)
.getValuesForPath(contentLocationChildrenFromYamlFile, installLog, session);
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
// new Yaml().dump(yamlList, new PrintWriter(System.out));
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals(4, groups.size());
AuthorizableConfigBean group1 = groups.getAuthorizableConfig("content-node1-reader");
assertEquals("/home/groups/test", group1.getPath());
assertEquals("Jcr Content Property in Name val1", group1.getName());
AuthorizableConfigBean group2 = groups.getAuthorizableConfig("content-node1-writer");
assertEquals("/home/groups/test", group2.getPath());
assertEquals("Writer of Node 1", group2.getName());
}
private List<Object> getExampleValuesForLoopOverChildrenOfPath() {
List<Object> result = new ArrayList<Object>();
Map<String, Object> test1 = new HashMap<String, Object>() {
{
put("path", "/content/test/node1");
put("name", "node1");
put("title", "Node 1");
put("jcr:content", new HashMap<String, Object>() {
{
put("jcr:title", "testJcrTitle");
put("prop", "val1");
}
});
}
};
result.add(test1);
Map<String, Object> test2 = new HashMap<String, Object>() {
{
put("path", "/content/test/node2");
put("name", "node2");
put("title", "Node 2");
put("jcr:content", new HashMap<String, Object>() {
{
put("jcr:title", "testJcrTitle");
put("prop", "val2");
}
});
}
};
result.add(test2);
return result;
}
@Test
public void testSystemUser() throws IOException, AcConfigBeanValidationException, RepositoryException {
List<LinkedHashMap> yamlList = getYamlList("test-system-user.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AuthorizablesConfig users = readUserConfigs(yamlList);
assertEquals("Number of users", 1, users.size());
AuthorizableConfigBean user = users.getAuthorizableConfig("test-system-user");
assertEquals(user.isSystemUser(), true);
assertEquals(user.getName(), "Test System User");
}
// --- using YamlConfigReader to make assertions easier (the raw yaml structure makes it really hard)
private AcesConfig readAceConfigs(final List<LinkedHashMap> yamlList)
throws RepositoryException, AcConfigBeanValidationException {
AuthorizablesConfig groups = readGroupConfigs(yamlList);
return new YamlConfigReader().getAceConfigurationBeans(yamlList, null, session);
}
private AuthorizablesConfig readGroupConfigs(List<LinkedHashMap> yamlList) throws AcConfigBeanValidationException {
return new YamlConfigReader().getGroupConfigurationBeans(yamlList, null);
}
private GlobalConfiguration readGlobalConfig(List<LinkedHashMap> yamlList) throws AcConfigBeanValidationException {
return new YamlConfigReader().getGlobalConfiguration(yamlList);
}
private AuthorizablesConfig readUserConfigs(List<LinkedHashMap> yamlList)
throws AcConfigBeanValidationException {
return new YamlConfigReader().getUserConfigurationBeans(yamlList, null);
}
@Test
public void testVariables() throws Exception {
List<LinkedHashMap> yamlList = getYamlList("test-variables.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
GlobalConfiguration globalConfiguration = readGlobalConfig(yamlList);
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals("var2 and var1", groups.getAuthorizableConfig("testGroup").getName());
assertEquals("var3 and var1", groups.getAuthorizableConfig("testGroup").getDescription());
assertEquals("var1-BRAND1", groups.getAuthorizableConfig("testGroupNested-BRAND1").getName());
assertEquals("var1-BRAND2", groups.getAuthorizableConfig("testGroupNested-BRAND2").getName());
assertEquals("var1-BRAND3", groups.getAuthorizableConfig("testGroupNested-BRAND3").getName());
}
@Test
public void testVariableForLdap() throws Exception {
List<LinkedHashMap> yamlList = getYamlList("test-variables-ldap.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals("cn=editor-group,ou=mydepart,ou=Groups,dc=comp,dc=com;IDPNAME",
groups.getAuthorizableConfig("aem-only-editor-group").getExternalId());
}
@Test
public void testLoopWithArrVariable() throws Exception {
List<LinkedHashMap> yamlList = getYamlList("test-loop-with-variable-evaluating-to-arr.yaml");
yamlList = yamlMacroProcessor.processMacros(yamlList, installLog, session);
AuthorizablesConfig groups = readGroupConfigs(yamlList);
assertEquals("Name of val1", groups.getAuthorizableConfig("content-reader-loop1-val1").getName());
assertEquals("Name of val2", groups.getAuthorizableConfig("content-reader-loop1-val2").getName());
assertEquals("Name of val3", groups.getAuthorizableConfig("content-reader-loop2-val3").getName());
assertEquals("Name of val4", groups.getAuthorizableConfig("content-reader-loop2-val4").getName());
assertEquals("Name of val1", groups.getAuthorizableConfig("content-reader-loop2-val1").getName());
}
@Test
public void testDefRegEx() throws Exception {
Matcher matcher = yamlMacroProcessor.variableDefPattern.matcher("DEF test=\"val\"");
assertTrue(matcher.find());
assertEquals("test", matcher.group(1));
assertEquals(null, matcher.group(2));
assertEquals("\"", matcher.group(3));
assertEquals("val", matcher.group(4));
assertEquals("\"", matcher.group(5));
matcher = yamlMacroProcessor.variableDefPattern.matcher("DEF test=val");
assertTrue(matcher.find());
assertEquals("test", matcher.group(1));
assertEquals(null, matcher.group(2));
assertEquals("", matcher.group(3));
assertEquals("val", matcher.group(4));
assertEquals("", matcher.group(5));
matcher = yamlMacroProcessor.variableDefPattern.matcher("DEF test=[val1,val2]");
assertTrue(matcher.find());
assertEquals("test", matcher.group(1));
assertEquals("val1,val2", matcher.group(2));
assertEquals(null, matcher.group(3));
assertEquals(null, matcher.group(4));
assertEquals(null, matcher.group(5));
}
}