ACS-3358 Support isShared field. (#1301)

* Use the new include method.

* ACS-3358 Rename the shared field to isShared.

* ACS-3358 Make isShared an optional field.

* ACS-3358 Add TAS tests for the optional isShared field.

* ACS-3358 Upgrade to release version of TAS REST API. [tas]

* ACS-3358 Update test descriptions.

* ACS-3358 Update toString of Rule.
This commit is contained in:
Tom Page
2022-08-12 15:37:57 +01:00
committed by GitHub
parent 0c017ac30c
commit 4bae0f2060
17 changed files with 458 additions and 198 deletions

View File

@@ -72,7 +72,11 @@ public class CreateRulesTests extends RestTest
ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder(); ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
} }
/** Check we can create a rule. */ /**
* Check we can create a rule.
* <p>
* Also check that the isShared field is not returned when not requested.
*/
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY }) @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void createRule() public void createRule()
{ {
@@ -83,7 +87,8 @@ public class CreateRulesTests extends RestTest
restClient.assertStatusCodeIs(CREATED); restClient.assertStatusCodeIs(CREATED);
rule.assertThat().field("id").isNotNull() rule.assertThat().field("id").isNotNull()
.assertThat().field("name").is("ruleName"); .assertThat().field("name").is("ruleName")
.assertThat().field("isShared").isNull();
} }
/** Check creating a rule in a non-existent folder returns an error. */ /** Check creating a rule in a non-existent folder returns an error. */
@@ -252,6 +257,20 @@ public class CreateRulesTests extends RestTest
restClient.assertLastError().containsSummary("Rule name is a mandatory parameter"); restClient.assertLastError().containsSummary("Rule name is a mandatory parameter");
} }
/** Check we can create a rule. */
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void createRuleAndIncludeFieldsInResponse()
{
RestRuleModel ruleModel = createRuleModel("ruleName");
RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
.include("isShared")
.createSingleRule(ruleModel);
restClient.assertStatusCodeIs(CREATED);
rule.assertThat().field("isShared").isNotNull();
}
public RestRuleModel testRolePermissionsWith(UserRole userRole) public RestRuleModel testRolePermissionsWith(UserRole userRole)
{ {
STEP("Create a user and use them to create a private site containing a folder"); STEP("Create a user and use them to create a private site containing a folder");

View File

@@ -33,7 +33,6 @@ import static org.springframework.http.HttpStatus.OK;
import org.alfresco.rest.RestTest; import org.alfresco.rest.RestTest;
import org.alfresco.rest.model.RestRuleModel; import org.alfresco.rest.model.RestRuleModel;
import org.alfresco.rest.model.RestRuleModelsCollection;
import org.alfresco.rest.model.RestRuleSetModel; import org.alfresco.rest.model.RestRuleSetModel;
import org.alfresco.rest.model.RestRuleSetModelsCollection; import org.alfresco.rest.model.RestRuleSetModelsCollection;
import org.alfresco.utility.model.FolderModel; import org.alfresco.utility.model.FolderModel;
@@ -122,7 +121,7 @@ public class GetRuleSetsTests extends RestTest
STEP("Get the rule sets and owning folders"); STEP("Get the rule sets and owning folders");
RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI() RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI()
.usingNode(ruleFolder) .usingNode(ruleFolder)
.usingParams("include=owningFolder") .include("owningFolder")
.getListOfRuleSets(); .getListOfRuleSets();
restClient.assertStatusCodeIs(OK); restClient.assertStatusCodeIs(OK);
@@ -139,7 +138,7 @@ public class GetRuleSetsTests extends RestTest
STEP("Get the rule sets and inclusion type"); STEP("Get the rule sets and inclusion type");
RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI() RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI()
.usingNode(ruleFolder) .usingNode(ruleFolder)
.usingParams("include=inclusionType") .include("inclusionType")
.getListOfRuleSets(); .getListOfRuleSets();
restClient.assertStatusCodeIs(OK); restClient.assertStatusCodeIs(OK);
@@ -201,7 +200,7 @@ public class GetRuleSetsTests extends RestTest
STEP("Get the rule set and owning folder"); STEP("Get the rule set and owning folder");
RestRuleSetModel ruleSet = restClient.authenticateUser(user).withCoreAPI() RestRuleSetModel ruleSet = restClient.authenticateUser(user).withCoreAPI()
.usingNode(ruleFolder) .usingNode(ruleFolder)
.usingParams("include=owningFolder") .include("owningFolder")
.getRuleSet(ruleSetId); .getRuleSet(ruleSetId);
restClient.assertStatusCodeIs(OK); restClient.assertStatusCodeIs(OK);

View File

@@ -91,7 +91,11 @@ public class GetRulesTests extends RestTest
assertTrue("Expected no rules to be present.", rules.isEmpty()); assertTrue("Expected no rules to be present.", rules.isEmpty());
} }
/** Check we can get all the rules for a folder. */ /**
* Check we can get all the rules for a folder.
* <p>
* Also check that the isShared field is not returned when not requested.
*/
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY }) @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void getRulesList() public void getRulesList()
{ {
@@ -102,8 +106,9 @@ public class GetRulesTests extends RestTest
rules.assertThat().entriesListCountIs(createdRules.size()); rules.assertThat().entriesListCountIs(createdRules.size());
IntStream.range(0, createdRules.size()).forEach(i -> IntStream.range(0, createdRules.size()).forEach(i ->
rules.getEntries().get(i).onModel() rules.getEntries().get(i).onModel()
.assertThat().field("id").is(createdRules.get(i).getId()) .assertThat().field("id").is(createdRules.get(i).getId())
.assertThat().field("name").is(createdRules.get(i).getName())); .assertThat().field("name").is(createdRules.get(i).getName())
.assertThat().field("isShared").isNull());
} }
/** Check we get a 404 if trying to load rules for a folder that doesn't exist. */ /** Check we get a 404 if trying to load rules for a folder that doesn't exist. */
@@ -128,7 +133,26 @@ public class GetRulesTests extends RestTest
restClient.assertStatusCodeIs(NOT_FOUND); restClient.assertStatusCodeIs(NOT_FOUND);
} }
/** Check we can get a rule by its id. */ /** Check we can get all the rules for a folder along with the extra "include" fields. */
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void getRulesListWithIncludedFields()
{
STEP("Get the rules that apply to the folder");
RestRuleModelsCollection rules = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
.include("isShared")
.getListOfRules();
rules.assertThat().entriesListCountIs(createdRules.size());
IntStream.range(0, createdRules.size()).forEach(i ->
rules.getEntries().get(i).onModel()
.assertThat().field("isShared").isNotNull());
}
/**
* Check we can get a rule by its id.
* <p>
* Also check that the isShared field is not returned when not requested.
*/
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY }) @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void getSingleRule() public void getSingleRule()
{ {
@@ -138,7 +162,8 @@ public class GetRulesTests extends RestTest
restClient.assertStatusCodeIs(OK); restClient.assertStatusCodeIs(OK);
rule.assertThat().field("id").is(createdRuleA.getId()) rule.assertThat().field("id").is(createdRuleA.getId())
.assertThat().field("name").is(createdRuleA.getName()); .assertThat().field("name").is(createdRuleA.getName())
.assertThat().field("isShared").isNull();
} }
/** Check we get a 404 if trying to load a rule from a folder that doesn't exist. */ /** Check we get a 404 if trying to load a rule from a folder that doesn't exist. */
@@ -174,6 +199,18 @@ public class GetRulesTests extends RestTest
restClient.assertStatusCodeIs(NOT_FOUND); restClient.assertStatusCodeIs(NOT_FOUND);
} }
/** Check we can get a rule by its id along with any included fields. */
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void getSingleRuleWithIncludedFields()
{
STEP("Load a particular rule");
RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
.include("isShared")
.getSingleRule(createdRuleA.getId());
rule.assertThat().field("isShared").isNotNull();
}
/** Check that a user without read permission cannot view the folder rules. */ /** Check that a user without read permission cannot view the folder rules. */
public void requireReadPermissionToGetRule() public void requireReadPermissionToGetRule()
{ {

View File

@@ -64,7 +64,11 @@ public class UpdateRulesTests extends RestTest
ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder(); ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
} }
/** Check we can update a rule. */ /**
* Check we can update a rule.
* <p>
* Also check that the isShared field is not returned when not requested.
*/
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY }) @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void updateRule() public void updateRule()
{ {
@@ -77,7 +81,8 @@ public class UpdateRulesTests extends RestTest
restClient.assertStatusCodeIs(OK); restClient.assertStatusCodeIs(OK);
updatedRule.assertThat().field("id").is(rule.getId()) updatedRule.assertThat().field("id").is(rule.getId())
.assertThat().field("name").is("Updated rule name"); .assertThat().field("name").is("Updated rule name")
.assertThat().field("isShared").isNull();
} }
/** Check we get a 404 if trying to update a rule in a folder that doesn't exist. */ /** Check we get a 404 if trying to update a rule in a folder that doesn't exist. */
@@ -179,6 +184,21 @@ public class UpdateRulesTests extends RestTest
updatedRule.assertThat().field("id").is(rule.getId()); updatedRule.assertThat().field("id").is(rule.getId());
} }
/** Check we can update a rule and get the included fields. */
@Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
public void updateRuleWithIncludedFields()
{
RestRuleModel rule = createAndSaveRule("Rule name");
STEP("Try to update the rule.");
RestRuleModel updatedRuleModel = createRuleModel("Updated rule name");
RestRuleModel updatedRule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
.include("isShared")
.updateRule(rule.getId(), updatedRuleModel);
updatedRule.assertThat().field("isShared").isNotNull();
}
private RestRuleModel createAndSaveRule(String name) private RestRuleModel createAndSaveRule(String name)
{ {
return createAndSaveRule(name, List.of(createActionModel())); return createAndSaveRule(name, List.of(createActionModel()));

View File

@@ -120,7 +120,7 @@
<dependency.mariadb.version>2.7.4</dependency.mariadb.version> <dependency.mariadb.version>2.7.4</dependency.mariadb.version>
<dependency.tas-utility.version>3.0.49</dependency.tas-utility.version> <dependency.tas-utility.version>3.0.49</dependency.tas-utility.version>
<dependency.rest-assured.version>5.1.1</dependency.rest-assured.version> <dependency.rest-assured.version>5.1.1</dependency.rest-assured.version>
<dependency.tas-restapi.version>1.108</dependency.tas-restapi.version> <dependency.tas-restapi.version>1.110</dependency.tas-restapi.version>
<dependency.tas-cmis.version>1.32</dependency.tas-cmis.version> <dependency.tas-cmis.version>1.32</dependency.tas-cmis.version>
<dependency.tas-email.version>1.9</dependency.tas-email.version> <dependency.tas-email.version>1.9</dependency.tas-email.version>
<dependency.tas-webdav.version>1.7</dependency.tas-webdav.version> <dependency.tas-webdav.version>1.7</dependency.tas-webdav.version>

View File

@@ -26,6 +26,8 @@
package org.alfresco.rest.api; package org.alfresco.rest.api;
import java.util.List;
import org.alfresco.rest.api.model.rules.Rule; import org.alfresco.rest.api.model.rules.Rule;
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
@@ -33,8 +35,6 @@ import org.alfresco.rest.framework.resource.parameters.Paging;
import org.alfresco.service.Experimental; import org.alfresco.service.Experimental;
import org.alfresco.service.cmr.rule.RuleServiceException; import org.alfresco.service.cmr.rule.RuleServiceException;
import java.util.List;
/** /**
* Folder node rules API. * Folder node rules API.
* *
@@ -47,10 +47,11 @@ public interface Rules
* *
* @param folderNodeId - folder node ID * @param folderNodeId - folder node ID
* @param ruleSetId - rule set ID * @param ruleSetId - rule set ID
* @param includes - The list of optional fields to include in the response.
* @param paging - {@link Paging} information * @param paging - {@link Paging} information
* @return {@link CollectionWithPagingInfo} containing a list page of folder rules * @return {@link CollectionWithPagingInfo} containing a list page of folder rules
*/ */
CollectionWithPagingInfo<Rule> getRules(String folderNodeId, String ruleSetId, Paging paging); CollectionWithPagingInfo<Rule> getRules(String folderNodeId, String ruleSetId, List<String> includes, Paging paging);
/** /**
* Get rule for rule's ID and check associations with folder node and rule set node * Get rule for rule's ID and check associations with folder node and rule set node
@@ -58,9 +59,10 @@ public interface Rules
* @param folderNodeId - folder node ID * @param folderNodeId - folder node ID
* @param ruleSetId - rule set ID * @param ruleSetId - rule set ID
* @param ruleId - rule ID * @param ruleId - rule ID
* @param includes - The list of optional fields to include in the response.
* @return {@link Rule} definition * @return {@link Rule} definition
*/ */
Rule getRuleById(String folderNodeId, String ruleSetId, String ruleId); Rule getRuleById(String folderNodeId, String ruleSetId, String ruleId, List<String> includes);
/** /**
* Create new rules (and potentially a rule set if "_default_" is supplied). * Create new rules (and potentially a rule set if "_default_" is supplied).
@@ -68,11 +70,12 @@ public interface Rules
* @param folderNodeId The node id of a folder. * @param folderNodeId The node id of a folder.
* @param ruleSetId The id of a rule set (or "_default_" to use/create the default rule set for the folder). * @param ruleSetId The id of a rule set (or "_default_" to use/create the default rule set for the folder).
* @param rule The definition of the rule. * @param rule The definition of the rule.
* @param includes The list of optional fields to include in the response.
* @return The newly created rules. * @return The newly created rules.
* @throws InvalidArgumentException If the nodes are not the expected types, or the rule set does not correspond to the folder. * @throws InvalidArgumentException If the nodes are not the expected types, or the rule set does not correspond to the folder.
* @throws RuleServiceException If the folder is already linked to another rule set. * @throws RuleServiceException If the folder is already linked to another rule set.
*/ */
List<Rule> createRules(String folderNodeId, String ruleSetId, List<Rule> rule); List<Rule> createRules(String folderNodeId, String ruleSetId, List<Rule> rule, List<String> includes);
/** /**
* Update a rule. * Update a rule.
@@ -81,9 +84,10 @@ public interface Rules
* @param ruleSetId The id of a rule set within the folder (or "_default_" to use the default rule set for the folder). * @param ruleSetId The id of a rule set within the folder (or "_default_" to use the default rule set for the folder).
* @param ruleId The rule id. * @param ruleId The rule id.
* @param rule The new version of the rule. * @param rule The new version of the rule.
* @param includes The list of optional fields to include in the response.
* @return The newly updated rule. * @return The newly updated rule.
*/ */
Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule); Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule, List<String> includes);
/** /**
* Delete rule for rule's ID and check associations with folder node and rule set node * Delete rule for rule's ID and check associations with folder node and rule set node

View File

@@ -0,0 +1,64 @@
/*
* #%L
* Alfresco Remote API
* %%
* Copyright (C) 2005 - 2022 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.rest.api.impl.rules;
import java.util.List;
import org.alfresco.rest.api.model.rules.Rule;
import org.alfresco.service.Experimental;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.rule.RuleService;
/** Responsible for creating {@link Rule} objects. */
@Experimental
public class RuleLoader
{
public static final String IS_SHARED = "isShared";
private RuleService ruleService;
private NodeValidator nodeValidator;
public Rule loadRule(org.alfresco.service.cmr.rule.Rule ruleModel, List<String> includes)
{
Rule rule = Rule.from(ruleModel);
if (includes != null && includes.contains(IS_SHARED))
{
NodeRef ruleSet = ruleService.getRuleSetNode(ruleModel.getNodeRef());
boolean isShared = nodeValidator.isRuleSetNotNullAndShared(ruleSet);
rule.setIsShared(isShared);
}
return rule;
}
public void setRuleService(RuleService ruleService)
{
this.ruleService = ruleService;
}
public void setNodeValidator(NodeValidator nodeValidator)
{
this.nodeValidator = nodeValidator;
}
}

View File

@@ -52,7 +52,7 @@ public class RuleSetLoader
* @param includes A list of fields to include. * @param includes A list of fields to include.
* @return The rule set object. * @return The rule set object.
*/ */
protected RuleSet loadRuleSet(NodeRef ruleSetNodeRef, NodeRef folderNodeRef, List<String> includes) public RuleSet loadRuleSet(NodeRef ruleSetNodeRef, NodeRef folderNodeRef, List<String> includes)
{ {
String ruleSetId = ruleSetNodeRef.getId(); String ruleSetId = ruleSetNodeRef.getId();
RuleSet ruleSet = RuleSet.of(ruleSetId); RuleSet ruleSet = RuleSet.of(ruleSetId);

View File

@@ -50,47 +50,53 @@ public class RulesImpl implements Rules
private Nodes nodes; private Nodes nodes;
private RuleService ruleService; private RuleService ruleService;
private NodeValidator validator; private NodeValidator validator;
private RuleLoader ruleLoader;
@Override @Override
public CollectionWithPagingInfo<Rule> getRules(final String folderNodeId, final String ruleSetId, final Paging paging) public CollectionWithPagingInfo<Rule> getRules(final String folderNodeId,
final String ruleSetId,
final List<String> includes,
final Paging paging)
{ {
final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, false); final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, false);
final NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef); validator.validateRuleSetNode(ruleSetId, folderNodeRef);
final boolean isShared = validator.isRuleSetNotNullAndShared(ruleSetNodeRef);
final List<Rule> rules = ruleService.getRules(folderNodeRef).stream() final List<Rule> rules = ruleService.getRules(folderNodeRef).stream()
.map(ruleModel -> Rule.from(ruleModel, isShared)) .map(ruleModel -> ruleLoader.loadRule(ruleModel, includes))
.collect(Collectors.toList()); .collect(Collectors.toList());
return ListPage.of(rules, paging); return ListPage.of(rules, paging);
} }
@Override @Override
public Rule getRuleById(final String folderNodeId, final String ruleSetId, final String ruleId) public Rule getRuleById(final String folderNodeId, final String ruleSetId, final String ruleId, final List<String> includes)
{ {
final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, false); final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, false);
final NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef); final NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef);
final NodeRef ruleNodeRef = validator.validateRuleNode(ruleId, ruleSetNodeRef); final NodeRef ruleNodeRef = validator.validateRuleNode(ruleId, ruleSetNodeRef);
return Rule.from(ruleService.getRule(ruleNodeRef), validator.isRuleSetNotNullAndShared(ruleSetNodeRef)); return ruleLoader.loadRule(ruleService.getRule(ruleNodeRef), includes);
} }
@Override @Override
public List<Rule> createRules(final String folderNodeId, final String ruleSetId, final List<Rule> rules) public List<Rule> createRules(final String folderNodeId, final String ruleSetId, final List<Rule> rules, final List<String> includes)
{ {
final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, true); final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, true);
// Don't validate the ruleset node if -default- is passed since we may need to create it. // Don't validate the ruleset node if -default- is passed since we may need to create it.
final NodeRef ruleSetNodeRef = (RuleSet.isNotDefaultId(ruleSetId)) ? validator.validateRuleSetNode(ruleSetId, folderNodeRef) : null; if (RuleSet.isNotDefaultId(ruleSetId))
{
validator.validateRuleSetNode(ruleSetId, folderNodeRef);
}
return rules.stream() return rules.stream()
.map(rule -> rule.toServiceModel(nodes)) .map(rule -> rule.toServiceModel(nodes))
.map(rule -> ruleService.saveRule(folderNodeRef, rule)) .map(rule -> ruleService.saveRule(folderNodeRef, rule))
.map(rule -> Rule.from(rule, validator.isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef))) .map(rule -> ruleLoader.loadRule(rule, includes))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override @Override
public Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule) public Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule, List<String> includes)
{ {
LOGGER.debug("Updating rule in folder {}, rule set {}, rule {} to {}", folderNodeId, ruleSetId, ruleId, rule); LOGGER.debug("Updating rule in folder {}, rule set {}, rule {} to {}", folderNodeId, ruleSetId, ruleId, rule);
@@ -98,8 +104,7 @@ public class RulesImpl implements Rules
NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef); NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef);
validator.validateRuleNode(ruleId, ruleSetNodeRef); validator.validateRuleNode(ruleId, ruleSetNodeRef);
boolean shared = validator.isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef); return ruleLoader.loadRule(ruleService.saveRule(folderNodeRef, rule.toServiceModel(nodes)), includes);
return Rule.from(ruleService.saveRule(folderNodeRef, rule.toServiceModel(nodes)), shared);
} }
@Override @Override
@@ -126,4 +131,9 @@ public class RulesImpl implements Rules
{ {
this.validator = validator; this.validator = validator;
} }
public void setRuleLoader(RuleLoader ruleLoader)
{
this.ruleLoader = ruleLoader;
}
} }

View File

@@ -46,7 +46,7 @@ public class Rule
private boolean enabled; private boolean enabled;
private boolean cascade; private boolean cascade;
private boolean asynchronous; private boolean asynchronous;
private boolean shared; private Boolean isShared;
private String errorScript; private String errorScript;
private List<RuleTrigger> triggers; private List<RuleTrigger> triggers;
private CompositeCondition conditions; private CompositeCondition conditions;
@@ -58,7 +58,7 @@ public class Rule
* @param ruleModel - {@link org.alfresco.service.cmr.rule.Rule} service POJO * @param ruleModel - {@link org.alfresco.service.cmr.rule.Rule} service POJO
* @return {@link Rule} REST model * @return {@link Rule} REST model
*/ */
public static Rule from(final org.alfresco.service.cmr.rule.Rule ruleModel, final boolean shared) public static Rule from(final org.alfresco.service.cmr.rule.Rule ruleModel)
{ {
if (ruleModel == null) if (ruleModel == null)
{ {
@@ -70,8 +70,7 @@ public class Rule
.description(ruleModel.getDescription()) .description(ruleModel.getDescription())
.enabled(!ruleModel.getRuleDisabled()) .enabled(!ruleModel.getRuleDisabled())
.cascade(ruleModel.isAppliedToChildren()) .cascade(ruleModel.isAppliedToChildren())
.asynchronous(ruleModel.getExecuteAsynchronously()) .asynchronous(ruleModel.getExecuteAsynchronously());
.shared(shared);
if (ruleModel.getNodeRef() != null) { if (ruleModel.getNodeRef() != null) {
builder.id(ruleModel.getNodeRef().getId()); builder.id(ruleModel.getNodeRef().getId());
@@ -185,14 +184,14 @@ public class Rule
this.errorScript = errorScript; this.errorScript = errorScript;
} }
public boolean isShared() public Boolean isIsShared()
{ {
return shared; return isShared;
} }
public void setShared(boolean shared) public void setIsShared(Boolean shared)
{ {
this.shared = shared; this.isShared = shared;
} }
public List<String> getTriggers() public List<String> getTriggers()
@@ -233,7 +232,7 @@ public class Rule
public String toString() public String toString()
{ {
return "Rule{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", description='" + description + '\'' + ", enabled=" + enabled + ", cascade=" + cascade return "Rule{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", description='" + description + '\'' + ", enabled=" + enabled + ", cascade=" + cascade
+ ", asynchronous=" + asynchronous + ", shared=" + shared + ", errorScript='" + errorScript + '\'' + ", triggers=" + triggers + ", conditions=" + conditions + ", asynchronous=" + asynchronous + ", isShared=" + isShared + ", errorScript='" + errorScript + '\'' + ", triggers=" + triggers + ", conditions=" + conditions
+ ", actions=" + actions + '}'; + ", actions=" + actions + '}';
} }
@@ -245,15 +244,23 @@ public class Rule
if (o == null || getClass() != o.getClass()) if (o == null || getClass() != o.getClass())
return false; return false;
Rule rule = (Rule) o; Rule rule = (Rule) o;
return enabled == rule.enabled && cascade == rule.cascade && asynchronous == rule.asynchronous && shared == rule.shared && Objects.equals(id, rule.id) && Objects.equals( return enabled == rule.enabled
name, rule.name) && Objects.equals(description, rule.description) && Objects.equals(errorScript, rule.errorScript) && Objects.equals(triggers, rule.triggers) && cascade == rule.cascade
&& Objects.equals(conditions, rule.conditions) && Objects.equals(actions, rule.actions); && asynchronous == rule.asynchronous
&& Objects.equals(isShared, rule.isShared)
&& Objects.equals(id, rule.id)
&& Objects.equals(name, rule.name)
&& Objects.equals(description, rule.description)
&& Objects.equals(errorScript, rule.errorScript)
&& Objects.equals(triggers, rule.triggers)
&& Objects.equals(conditions, rule.conditions)
&& Objects.equals(actions, rule.actions);
} }
@Override @Override
public int hashCode() public int hashCode()
{ {
return Objects.hash(id, name, description, enabled, cascade, asynchronous, shared, errorScript, triggers, conditions, actions); return Objects.hash(id, name, description, enabled, cascade, asynchronous, isShared, errorScript, triggers, conditions, actions);
} }
public static Builder builder() public static Builder builder()
@@ -270,7 +277,7 @@ public class Rule
private boolean enabled; private boolean enabled;
private boolean cascade; private boolean cascade;
private boolean asynchronous; private boolean asynchronous;
private boolean shared; private Boolean isShared;
private String errorScript; private String errorScript;
private List<RuleTrigger> triggers; private List<RuleTrigger> triggers;
private CompositeCondition conditions; private CompositeCondition conditions;
@@ -312,9 +319,9 @@ public class Rule
return this; return this;
} }
public Builder shared(boolean shared) public Builder isShared(Boolean isShared)
{ {
this.shared = shared; this.isShared = isShared;
return this; return this;
} }
@@ -351,7 +358,7 @@ public class Rule
rule.setEnabled(enabled); rule.setEnabled(enabled);
rule.setCascade(cascade); rule.setCascade(cascade);
rule.setAsynchronous(asynchronous); rule.setAsynchronous(asynchronous);
rule.setShared(shared); rule.setIsShared(isShared);
rule.setErrorScript(errorScript); rule.setErrorScript(errorScript);
rule.setTriggers(triggers); rule.setTriggers(triggers);
rule.setConditions(conditions); rule.setConditions(conditions);

View File

@@ -26,6 +26,9 @@
package org.alfresco.rest.api.nodes; package org.alfresco.rest.api.nodes;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import org.alfresco.rest.api.Rules; import org.alfresco.rest.api.Rules;
import org.alfresco.rest.api.model.rules.Rule; import org.alfresco.rest.api.model.rules.Rule;
import org.alfresco.rest.framework.WebApiDescription; import org.alfresco.rest.framework.WebApiDescription;
@@ -38,9 +41,6 @@ import org.alfresco.service.Experimental;
import org.alfresco.util.PropertyCheck; import org.alfresco.util.PropertyCheck;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/** /**
* Folder node's rules. * Folder node's rules.
* *
@@ -82,7 +82,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
{ {
final String ruleSetId = parameters.getRelationshipId(); final String ruleSetId = parameters.getRelationshipId();
return rules.getRules(folderNodeId, ruleSetId, parameters.getPaging()); return rules.getRules(folderNodeId, ruleSetId, parameters.getInclude(), parameters.getPaging());
} }
/** /**
@@ -106,7 +106,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
{ {
final String ruleId = parameters.getRelationship2Id(); final String ruleId = parameters.getRelationship2Id();
return rules.getRuleById(folderNodeId, ruleSetId, ruleId); return rules.getRuleById(folderNodeId, ruleSetId, ruleId, parameters.getInclude());
} }
/** /**
@@ -129,7 +129,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
{ {
final String ruleSetId = parameters.getRelationshipId(); final String ruleSetId = parameters.getRelationshipId();
return rules.createRules(folderNodeId, ruleSetId, ruleList); return rules.createRules(folderNodeId, ruleSetId, ruleList, parameters.getInclude());
} }
/** /**
@@ -153,7 +153,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
{ {
String ruleSetId = parameters.getRelationshipId(); String ruleSetId = parameters.getRelationshipId();
String ruleId = parameters.getRelationship2Id(); String ruleId = parameters.getRelationship2Id();
return rules.updateRuleById(folderNodeId, ruleSetId, ruleId, rule); return rules.updateRuleById(folderNodeId, ruleSetId, ruleId, rule, parameters.getInclude());
} }
/** /**

View File

@@ -880,6 +880,11 @@
</property> </property>
</bean> </bean>
<bean id="ruleLoader" class="org.alfresco.rest.api.impl.rules.RuleLoader">
<property name="ruleService" ref="RuleService" />
<property name="nodeValidator" ref="nodeValidator" />
</bean>
<bean class="org.alfresco.rest.api.nodes.NodeRuleSetsRelation"> <bean class="org.alfresco.rest.api.nodes.NodeRuleSetsRelation">
<property name="ruleSets" ref="RuleSets" /> <property name="ruleSets" ref="RuleSets" />
</bean> </bean>
@@ -888,6 +893,7 @@
<property name="nodes" ref="Nodes" /> <property name="nodes" ref="Nodes" />
<property name="validator" ref="nodeValidator"/> <property name="validator" ref="nodeValidator"/>
<property name="ruleService" ref="RuleService" /> <property name="ruleService" ref="RuleService" />
<property name="ruleLoader" ref="ruleLoader" />
</bean> </bean>
<bean id="Rules" class="org.springframework.aop.framework.ProxyFactoryBean"> <bean id="Rules" class="org.springframework.aop.framework.ProxyFactoryBean">

View File

@@ -0,0 +1,121 @@
/*
* #%L
* Alfresco Remote API
* %%
* Copyright (C) 2005 - 2022 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.rest.api.impl.rules;
import static java.util.Collections.emptyList;
import static org.alfresco.rest.api.impl.rules.RuleLoader.IS_SHARED;
import static org.alfresco.rest.api.model.rules.RuleTrigger.OUTBOUND;
import static org.alfresco.rest.api.model.rules.RuleTrigger.UPDATE;
import static org.alfresco.service.cmr.repository.StoreRef.STORE_REF_WORKSPACE_SPACESSTORE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.MockitoAnnotations.openMocks;
import java.util.List;
import org.alfresco.rest.api.model.rules.Rule;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.rule.RuleService;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
/** Unit tests for {@link RuleLoader}. */
public class RuleLoaderTest
{
private static final String NODE_ID = "node-id";
private static final NodeRef NODE_REF = new NodeRef(STORE_REF_WORKSPACE_SPACESSTORE, NODE_ID);
private static final String TITLE = "title";
private static final String DESCRIPTION = "description";
private static final boolean ENABLED = true;
private static final boolean CASCADE = true;
private static final boolean EXECUTE_ASYNCHRONOUSLY = false;
private static final List<String> TRIGGERS = List.of("update", "outbound");
private static final NodeRef RULE_SET_NODE = new NodeRef("rule://set/");
@InjectMocks
private RuleLoader ruleLoader;
@Mock
private RuleService ruleServiceMock;
@Mock
private NodeValidator nodeValidatorMock;
private org.alfresco.service.cmr.rule.Rule serviceRule = createServiceRule();
@Before
public void setUp()
{
openMocks(this);
}
@Test
public void testLoadRule()
{
Rule rule = ruleLoader.loadRule(serviceRule, emptyList());
Rule expected = Rule.builder().id(NODE_ID)
.name(TITLE)
.description(DESCRIPTION)
.enabled(ENABLED)
.cascade(CASCADE)
.asynchronous(EXECUTE_ASYNCHRONOUSLY)
.triggers(List.of(UPDATE, OUTBOUND)).create();
assertThat(rule).isEqualTo(expected);
}
@Test
public void testLoadRule_noExceptionWithNullInclude()
{
ruleLoader.loadRule(serviceRule, null);
}
@Test
public void testLoadRule_includeIsShared()
{
// Simulate the rule set being shared.
given(ruleServiceMock.getRuleSetNode(NODE_REF)).willReturn(RULE_SET_NODE);
given(nodeValidatorMock.isRuleSetNotNullAndShared(RULE_SET_NODE)).willReturn(true);
Rule rule = ruleLoader.loadRule(serviceRule, List.of(IS_SHARED));
assertThat(rule).extracting("isShared").isEqualTo(true);
}
private org.alfresco.service.cmr.rule.Rule createServiceRule()
{
org.alfresco.service.cmr.rule.Rule rule = new org.alfresco.service.cmr.rule.Rule();
rule.setNodeRef(NODE_REF);
rule.setTitle(TITLE);
rule.setDescription(DESCRIPTION);
rule.setRuleDisabled(!ENABLED);
rule.applyToChildren(CASCADE);
rule.setExecuteAsynchronously(EXECUTE_ASYNCHRONOUSLY);
rule.setRuleTypes(TRIGGERS);
return rule;
}
}

View File

@@ -36,16 +36,14 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then; import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.IntStream;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.alfresco.repo.action.ActionImpl;
import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.Nodes;
import org.alfresco.rest.api.model.rules.CompositeCondition;
import org.alfresco.rest.api.model.rules.Rule; import org.alfresco.rest.api.model.rules.Rule;
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
@@ -54,7 +52,6 @@ import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundE
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Paging;
import org.alfresco.service.Experimental; import org.alfresco.service.Experimental;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.rule.RuleService; import org.alfresco.service.cmr.rule.RuleService;
@@ -74,47 +71,51 @@ public class RulesImplTest extends TestCase
private static final String FOLDER_NODE_ID = "dummy-folder-node-id"; private static final String FOLDER_NODE_ID = "dummy-folder-node-id";
private static final String RULE_SET_ID = "dummy-rule-set-id"; private static final String RULE_SET_ID = "dummy-rule-set-id";
private static final String RULE_ID = "dummy-rule-id"; private static final String RULE_ID = "dummy-rule-id";
private static final NodeRef folderNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_NODE_ID); private static final NodeRef FOLDER_NODE_REF = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_NODE_ID);
private static final NodeRef ruleSetNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID); private static final NodeRef RULE_SET_NODE_REF = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID);
private static final NodeRef ruleNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_ID); private static final NodeRef RULE_NODE_REF = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_ID);
private static final Paging paging = Paging.DEFAULT; private static final Paging PAGING = Paging.DEFAULT;
private static final Action action = new ActionImpl(folderNodeRef, "actionId", "actionDefinitionName"); private static final List<String> INCLUDE = emptyList();
@Mock @Mock
private Nodes nodesMock; private Nodes nodesMock;
@Mock @Mock
private NodeValidator nodeValidatorMock; private NodeValidator nodeValidatorMock;
@Mock @Mock
private RuleService ruleServiceMock; private RuleService ruleServiceMock;
@Mock
private RuleLoader ruleLoaderMock;
@InjectMocks @InjectMocks
private RulesImpl rules; private RulesImpl rules;
@Mock
private Rule ruleMock;
private org.alfresco.service.cmr.rule.Rule ruleModel = createRule(RULE_ID);
@Before @Before
@Override @Override
public void setUp() throws Exception public void setUp() throws Exception
{ {
MockitoAnnotations.openMocks(this); MockitoAnnotations.openMocks(this);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
given(nodeValidatorMock.validateRuleNode(any(), any())).willReturn(ruleNodeRef); given(nodeValidatorMock.validateRuleNode(any(), any())).willReturn(RULE_NODE_REF);
given(ruleServiceMock.getRule(RULE_NODE_REF)).willReturn(ruleModel);
given(ruleServiceMock.getRules(FOLDER_NODE_REF)).willReturn(List.of(ruleModel));
given(ruleLoaderMock.loadRule(ruleModel, INCLUDE)).willReturn(ruleMock);
} }
@Test @Test
public void testGetRules() public void testGetRules()
{ {
given(ruleServiceMock.getRules(any())).willReturn(List.of(createRule(RULE_ID)));
// when // when
final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging); final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).should().getRules(folderNodeRef); then(ruleServiceMock).should().getRules(FOLDER_NODE_REF);
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
assertThat(rulesPage) assertThat(rulesPage)
.isNotNull() .isNotNull()
@@ -122,10 +123,7 @@ public class RulesImplTest extends TestCase
.isNotNull() .isNotNull()
.extracting(Collection::size) .extracting(Collection::size)
.isEqualTo(1); .isEqualTo(1);
assertThat(rulesPage.getCollection().stream().findFirst().orElse(null)) assertThat(rulesPage.getCollection().stream().findFirst().get()).isEqualTo(ruleMock);
.isNotNull()
.extracting(Rule::getId)
.isEqualTo(RULE_ID);
} }
@Test @Test
@@ -134,9 +132,9 @@ public class RulesImplTest extends TestCase
given(ruleServiceMock.getRules(any())).willReturn(emptyList()); given(ruleServiceMock.getRules(any())).willReturn(emptyList());
// when // when
final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging); final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING);
then(ruleServiceMock).should().getRules(folderNodeRef); then(ruleServiceMock).should().getRules(FOLDER_NODE_REF);
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
assertThat(rulesPage) assertThat(rulesPage)
.isNotNull() .isNotNull()
@@ -156,7 +154,7 @@ public class RulesImplTest extends TestCase
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging)); () -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
@@ -170,15 +168,15 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleSetValidationExceptions()) for (Exception exception : ruleSetValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging)); () -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -187,23 +185,17 @@ public class RulesImplTest extends TestCase
@Test @Test
public void testGetRuleById() public void testGetRuleById()
{ {
given(ruleServiceMock.getRule(any())).willReturn(createRule(RULE_ID));
// when // when
final Rule rule = rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID); final Rule rule = rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef); then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(nodesMock).shouldHaveNoInteractions(); then(nodesMock).shouldHaveNoInteractions();
then(ruleServiceMock).should().getRule(ruleNodeRef); then(ruleServiceMock).should().getRule(RULE_NODE_REF);
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
assertThat(rule) assertThat(rule).isEqualTo(ruleMock);
.isNotNull()
.extracting(Rule::getId)
.isEqualTo(RULE_ID);
} }
@Test @Test
@@ -216,7 +208,7 @@ public class RulesImplTest extends TestCase
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID)); () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
@@ -230,15 +222,15 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleSetValidationExceptions()) for (Exception exception : ruleSetValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID)); () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -250,17 +242,17 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleValidationExceptions()) for (Exception exception : ruleValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception);
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID)); () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef); then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -275,21 +267,18 @@ public class RulesImplTest extends TestCase
org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody); given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule); given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleBody)).willReturn(serviceRule);
given(serviceRule.getNodeRef()).willReturn(ruleNodeRef); given(ruleLoaderMock.loadRule(serviceRule, INCLUDE)).willReturn(ruleMock);
given(serviceRule.getAction()).willReturn(action);
// when // when
List<Rule> actual = rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), ruleList); List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), ruleList, INCLUDE);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef); then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, ruleBody.toServiceModel(nodesMock));
then(ruleServiceMock).should().saveRule(folderNodeRef, ruleBody.toServiceModel(nodesMock));
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
List<Rule> expected = List.of(Rule.from(serviceRule, false)); List<Rule> expected = List.of(ruleMock);
assertThat(actual).isEqualTo(expected); assertThat(actual).isEqualTo(expected);
} }
@@ -302,20 +291,17 @@ public class RulesImplTest extends TestCase
org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody); given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule); given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleBody)).willReturn(serviceRule);
given(serviceRule.getNodeRef()).willReturn(ruleNodeRef); given(ruleLoaderMock.loadRule(serviceRule, INCLUDE)).willReturn(ruleMock);
given(serviceRule.getAction()).willReturn(action);
// when // when
List<Rule> actual = rules.createRules(folderNodeRef.getId(), DEFAULT_ID, ruleList); List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), DEFAULT_ID, ruleList, INCLUDE);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().isRuleSetNotNullAndShared(null, folderNodeRef);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).should().saveRule(folderNodeRef, ruleBody.toServiceModel(nodesMock)); then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, ruleBody.toServiceModel(nodesMock));
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
List<Rule> expected = List.of(Rule.from(serviceRule, false)); assertThat(actual).isEqualTo(List.of(ruleMock));
assertThat(actual).isEqualTo(expected);
} }
@Test @Test
@@ -324,7 +310,7 @@ public class RulesImplTest extends TestCase
List<Rule> ruleList = emptyList(); List<Rule> ruleList = emptyList();
// when // when
List<Rule> actual = rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), ruleList); List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), ruleList, INCLUDE);
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
assertThat(actual).isEqualTo(emptyList()); assertThat(actual).isEqualTo(emptyList());
@@ -336,30 +322,27 @@ public class RulesImplTest extends TestCase
{ {
List<Rule> ruleBodyList = new ArrayList<>(); List<Rule> ruleBodyList = new ArrayList<>();
List<Rule> expected = new ArrayList<>(); List<Rule> expected = new ArrayList<>();
for (String ruleId : List.of("A", "B", "C")) IntStream.range(0, 3).forEach(i -> {
{
Rule ruleBody = mock(Rule.class); Rule ruleBody = mock(Rule.class);
ruleBodyList.add(ruleBody); ruleBodyList.add(ruleBody);
org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody); given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule); given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleBody)).willReturn(serviceRule);
NodeRef ruleNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, ruleId); Rule ruleMock = mock(Rule.class);
given(serviceRule.getNodeRef()).willReturn(ruleNodeRef); given(ruleLoaderMock.loadRule(serviceRule, INCLUDE)).willReturn(ruleMock);
given(serviceRule.getAction()).willReturn(action); expected.add(ruleMock);
expected.add(Rule.from(serviceRule, false)); });
}
// when // when
List<Rule> actual = rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), ruleBodyList); List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), ruleBodyList, INCLUDE);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should(times(ruleBodyList.size())).isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
for (Rule ruleBody : ruleBodyList) for (Rule ruleBody : ruleBodyList)
{ {
then(ruleServiceMock).should().saveRule(folderNodeRef, ruleBody.toServiceModel(nodesMock)); then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, ruleBody.toServiceModel(nodesMock));
} }
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
assertThat(actual).isEqualTo(expected); assertThat(actual).isEqualTo(expected);
@@ -375,7 +358,7 @@ public class RulesImplTest extends TestCase
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), emptyList())); () -> rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), emptyList(), INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
@@ -389,15 +372,15 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleSetValidationExceptions()) for (Exception exception : ruleSetValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), emptyList())); () -> rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), emptyList(), INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -408,33 +391,22 @@ public class RulesImplTest extends TestCase
public void testUpdateRuleById() public void testUpdateRuleById()
{ {
Rule ruleBody = mock(Rule.class); Rule ruleBody = mock(Rule.class);
given(nodeValidatorMock.isRuleSetNotNullAndShared(any(), any())).willReturn(true);
org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody); given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class); org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule); given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleBody)).willReturn(serviceRule);
given(serviceRule.getNodeRef()).willReturn(ruleNodeRef); given(ruleLoaderMock.loadRule(serviceRule, INCLUDE)).willReturn(ruleMock);
given(serviceRule.getAction()).willReturn(action);
// when // when
Rule updatedRule = rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, ruleBody); Rule updatedRule = rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, ruleBody, INCLUDE);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef); then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).should().saveRule(folderNodeRef, serviceRuleBody); then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, serviceRuleBody);
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
assertThat(updatedRule).isEqualTo(ruleMock);
Rule expected = Rule.builder().id(RULE_ID)
.enabled(true)
.shared(true)
.triggers(emptyList())
.conditions(CompositeCondition.builder().inverted(false).create())
.create();
assertThat(updatedRule).isEqualTo(expected);
} }
@Test @Test
@@ -447,7 +419,7 @@ public class RulesImplTest extends TestCase
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, mock(Rule.class))); () -> rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, mock(Rule.class), INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
@@ -461,15 +433,15 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleSetValidationExceptions()) for (Exception exception : ruleSetValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, mock(Rule.class))); () -> rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, mock(Rule.class), INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -481,17 +453,17 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleValidationExceptions()) for (Exception exception : ruleValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception);
// when // when
assertThatExceptionOfType(exception.getClass()).isThrownBy( assertThatExceptionOfType(exception.getClass()).isThrownBy(
() -> rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, mock(Rule.class))); () -> rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, mock(Rule.class), INCLUDE));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef); then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -499,19 +471,16 @@ public class RulesImplTest extends TestCase
@Test @Test
public void testDeleteRuleById() { public void testDeleteRuleById() {
org.alfresco.service.cmr.rule.Rule rule = createRule(RULE_ID);
given(ruleServiceMock.getRule(any())).willReturn(rule);
//when //when
rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID); rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef); then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(nodesMock).shouldHaveNoInteractions(); then(nodesMock).shouldHaveNoInteractions();
then(ruleServiceMock).should().getRule(ruleNodeRef); then(ruleServiceMock).should().getRule(RULE_NODE_REF);
then(ruleServiceMock).should().removeRule(folderNodeRef, rule); then(ruleServiceMock).should().removeRule(FOLDER_NODE_REF, ruleModel);
then(ruleServiceMock).shouldHaveNoMoreInteractions(); then(ruleServiceMock).shouldHaveNoMoreInteractions();
} }
@@ -539,7 +508,7 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleSetValidationExceptions()) for (Exception exception : ruleSetValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
// when // when
@@ -547,7 +516,7 @@ public class RulesImplTest extends TestCase
() -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID)); () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -559,8 +528,8 @@ public class RulesImplTest extends TestCase
for (Exception exception : ruleValidationExceptions()) for (Exception exception : ruleValidationExceptions())
{ {
Mockito.reset(nodeValidatorMock); Mockito.reset(nodeValidatorMock);
given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef); given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef); given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception); given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception);
// when // when
@@ -568,8 +537,8 @@ public class RulesImplTest extends TestCase
() -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID)); () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true); then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef); then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef); then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
then(nodeValidatorMock).shouldHaveNoMoreInteractions(); then(nodeValidatorMock).shouldHaveNoMoreInteractions();
then(ruleServiceMock).shouldHaveNoInteractions(); then(ruleServiceMock).shouldHaveNoInteractions();
} }
@@ -580,7 +549,6 @@ public class RulesImplTest extends TestCase
final org.alfresco.service.cmr.rule.Rule rule = new org.alfresco.service.cmr.rule.Rule(); final org.alfresco.service.cmr.rule.Rule rule = new org.alfresco.service.cmr.rule.Rule();
rule.setNodeRef(nodeRef); rule.setNodeRef(nodeRef);
rule.setRuleType("ruleType"); rule.setRuleType("ruleType");
rule.setAction(action);
return rule; return rule;
} }

View File

@@ -51,7 +51,6 @@ public class RuleTest
private static final boolean RULE_ENABLED = true; private static final boolean RULE_ENABLED = true;
private static final boolean RULE_CASCADE = true; private static final boolean RULE_CASCADE = true;
private static final boolean RULE_ASYNC = true; private static final boolean RULE_ASYNC = true;
private static final boolean RULE_SHARED = true;
private static final String ERROR_SCRIPT = "error-script-ref"; private static final String ERROR_SCRIPT = "error-script-ref";
@Test @Test
@@ -61,7 +60,7 @@ public class RuleTest
final Rule expectedRule = createRuleWithDefaultValues(); final Rule expectedRule = createRuleWithDefaultValues();
// when // when
final Rule actualRule = Rule.from(ruleModel, RULE_SHARED); final Rule actualRule = Rule.from(ruleModel);
assertThat(actualRule).isNotNull().usingRecursiveComparison().isEqualTo(expectedRule); assertThat(actualRule).isNotNull().usingRecursiveComparison().isEqualTo(expectedRule);
@@ -74,7 +73,7 @@ public class RuleTest
final Rule expectedRule = Rule.builder().enabled(true).create(); final Rule expectedRule = Rule.builder().enabled(true).create();
// when // when
final Rule actualRule = Rule.from(ruleModel, false); final Rule actualRule = Rule.from(ruleModel);
assertThat(actualRule).isNotNull().usingRecursiveComparison().isEqualTo(expectedRule); assertThat(actualRule).isNotNull().usingRecursiveComparison().isEqualTo(expectedRule);
@@ -108,7 +107,6 @@ public class RuleTest
.enabled(RULE_ENABLED) .enabled(RULE_ENABLED)
.cascade(RULE_CASCADE) .cascade(RULE_CASCADE)
.asynchronous(RULE_ASYNC) .asynchronous(RULE_ASYNC)
.shared(RULE_SHARED)
.triggers(List.of(RuleTrigger.INBOUND, RuleTrigger.UPDATE)) .triggers(List.of(RuleTrigger.INBOUND, RuleTrigger.UPDATE))
.errorScript(ERROR_SCRIPT) .errorScript(ERROR_SCRIPT)
.conditions(CompositeCondition.from(Collections.emptyList())) .conditions(CompositeCondition.from(Collections.emptyList()))

View File

@@ -26,6 +26,10 @@
package org.alfresco.rest.api.nodes; package org.alfresco.rest.api.nodes;
import static org.mockito.BDDMockito.then;
import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.alfresco.rest.api.Rules; import org.alfresco.rest.api.Rules;
import org.alfresco.rest.framework.resource.parameters.Paging; import org.alfresco.rest.framework.resource.parameters.Paging;
@@ -40,17 +44,15 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.then;
@Experimental @Experimental
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class NodeRulesRelationTest extends TestCase public class NodeRulesRelationTest extends TestCase
{ {
private static final String FOLDER_NODE_ID = "dummy-node-id"; private static final String FOLDER_NODE_ID = "dummy-node-id";
private static final String RULE_SET_ID = "dummy-rule-set-id"; private static final String RULE_SET_ID = "dummy-rule-set-id";
private static final String RULE_ID = "dummy-rule-id"; private static final String RULE_ID = "dummy-rule-id";
private static final List<String> INCLUDE = List.of("include-field");
private static final Paging PAGING = Paging.DEFAULT;
@Mock @Mock
private Rules rulesMock; private Rules rulesMock;
@@ -68,35 +70,34 @@ public class NodeRulesRelationTest extends TestCase
@Test @Test
public void testReadAll() public void testReadAll()
{ {
final Paging paging = Paging.DEFAULT; final Parameters parameters = ParamsExtender.valueOf(PAGING, FOLDER_NODE_ID, RULE_SET_ID, null, INCLUDE);
final Parameters parameters = ParamsExtender.valueOf(paging, FOLDER_NODE_ID, RULE_SET_ID, null);
// when // when
nodeRulesRelation.readAll(FOLDER_NODE_ID, parameters); nodeRulesRelation.readAll(FOLDER_NODE_ID, parameters);
then(rulesMock).should().getRules(eq(FOLDER_NODE_ID), eq(RULE_SET_ID), eq(paging)); then(rulesMock).should().getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING);
then(rulesMock).shouldHaveNoMoreInteractions(); then(rulesMock).shouldHaveNoMoreInteractions();
} }
@Test @Test
public void testReadById() public void testReadById()
{ {
final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID); final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
// when // when
nodeRulesRelation.readById(FOLDER_NODE_ID, RULE_SET_ID, parameters); nodeRulesRelation.readById(FOLDER_NODE_ID, RULE_SET_ID, parameters);
then(rulesMock).should().getRuleById(eq(FOLDER_NODE_ID), eq(RULE_SET_ID), eq(RULE_ID)); then(rulesMock).should().getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
then(rulesMock).shouldHaveNoMoreInteractions(); then(rulesMock).shouldHaveNoMoreInteractions();
} }
@Test @Test
public void testDeleteById() { public void testDeleteById() {
final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID); final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
// when // when
nodeRulesRelation.delete(FOLDER_NODE_ID, RULE_SET_ID, parameters); nodeRulesRelation.delete(FOLDER_NODE_ID, RULE_SET_ID, parameters);
then(rulesMock).should().deleteRuleById(eq(FOLDER_NODE_ID), eq(RULE_SET_ID), eq(RULE_ID)); then(rulesMock).should().deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
then(rulesMock).shouldHaveNoMoreInteractions(); then(rulesMock).shouldHaveNoMoreInteractions();
} }
} }

View File

@@ -28,6 +28,7 @@ package org.alfresco.rest.framework.tests.core;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import java.io.InputStream; import java.io.InputStream;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.alfresco.rest.framework.jacksonextensions.BeanPropertiesFilter; import org.alfresco.rest.framework.jacksonextensions.BeanPropertiesFilter;
@@ -72,4 +73,9 @@ public class ParamsExtender extends Params
{ {
return new ParamsExtender(entityId, relationshipId, relationship2Id, null, null, null, new Params.RecognizedParams(null, paging, null, null, null, null, null, null, false)); return new ParamsExtender(entityId, relationshipId, relationship2Id, null, null, null, new Params.RecognizedParams(null, paging, null, null, null, null, null, null, false));
} }
public static Params valueOf(Paging paging, String entityId, String relationshipId, String relationship2Id, List<String> include)
{
return new ParamsExtender(entityId, relationshipId, relationship2Id, null, null, null, new Params.RecognizedParams(null, paging, null, null, include, null, null, null, false));
}
} }