Merge pull request #4834 from pedroigor/KEYCLOAK-5806

[KEYCLOAK-5806] - Create policy button to associated policies
This commit is contained in:
Bill Burke authored and GitHub committed 2017-12-16 23:44:35 -05:00
commit 118e998570
32 files changed
+709 -95

No files matched your search

@@ -17,8 +17,8 @@
package org.keycloak.testsuite.console.page.clients.authorization.policy;
import org.jboss.arquillian.graphene.page.Page;
import org.keycloak.representations.idm.authorization.AbstractPolicyRepresentation;
import org.keycloak.representations.idm.authorization.AggregatePolicyRepresentation;
import org.keycloak.representations.idm.authorization.UserPolicyRepresentation;
/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
@@ -37,6 +37,10 @@ public class AggregatePolicy implements PolicyTypeUI {
}
public void update(AggregatePolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
public void createPolicy(AbstractPolicyRepresentation expected) {
form().createPolicy(expected);
}
}
@@ -16,13 +16,30 @@
*/
package org.keycloak.testsuite.console.page.clients.authorization.policy;
import java.util.Set;
import static org.keycloak.testsuite.util.UIUtils.performOperationWithPageReload;
import static org.openqa.selenium.By.tagName;
import java.util.List;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.jboss.arquillian.graphene.page.Page;
import org.keycloak.representations.idm.authorization.AbstractPolicyRepresentation;
import org.keycloak.representations.idm.authorization.AggregatePolicyRepresentation;
import org.keycloak.representations.idm.authorization.ClientPolicyRepresentation;
import org.keycloak.representations.idm.authorization.GroupPolicyRepresentation;
import org.keycloak.representations.idm.authorization.JSPolicyRepresentation;
import org.keycloak.representations.idm.authorization.Logic;
import org.keycloak.representations.idm.authorization.RolePolicyRepresentation;
import org.keycloak.representations.idm.authorization.RulePolicyRepresentation;
import org.keycloak.representations.idm.authorization.TimePolicyRepresentation;
import org.keycloak.representations.idm.authorization.UserPolicyRepresentation;
import org.keycloak.testsuite.console.page.fragment.ModalDialog;
import org.keycloak.testsuite.console.page.fragment.MultipleStringSelect2;
import org.keycloak.testsuite.page.Form;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.ui.Select;
@@ -45,12 +62,36 @@ public class AggregatePolicyForm extends Form {
private WebElement deleteButton;
@FindBy(id = "s2id_policies")
private MultipleStringSelect2 policySelect;
private PolicySelect policySelect;
@FindBy(xpath = "//div[@class='modal-dialog']")
protected ModalDialog modalDialog;
public void populate(AggregatePolicyRepresentation expected) {
@FindBy(id = "create-policy")
private Select createPolicySelect;
@Page
private RolePolicy rolePolicy;
@Page
private UserPolicy userPolicy;
@Page
private ClientPolicy clientPolicy;
@Page
private JSPolicy jsPolicy;
@Page
private TimePolicy timePolicy;
@Page
private RulePolicy rulePolicy;
@Page
private GroupPolicy groupPolicy;
public void populate(AggregatePolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
logic.selectByValue(expected.getLogic().name());
@@ -58,9 +99,11 @@ public class AggregatePolicyForm extends Form {
Set<String> selectedPolicies = policySelect.getSelected();
Set<String> policies = expected.getPolicies();
for (String policy : policies) {
if (!selectedPolicies.contains(policy)) {
policySelect.select(policy);
if (policies != null) {
for (String policy : policies) {
if (!selectedPolicies.contains(policy)) {
policySelect.select(policy);
}
}
}
@@ -79,7 +122,9 @@ public class AggregatePolicyForm extends Form {
}
}
save();
if (save) {
save();
}
}
public void delete() {
@@ -97,4 +142,55 @@ public class AggregatePolicyForm extends Form {
return representation;
}
public void createPolicy(AbstractPolicyRepresentation expected) {
performOperationWithPageReload(() -> createPolicySelect.selectByValue(expected.getType()));
if ("role".equals(expected.getType())) {
rolePolicy.form().populate((RolePolicyRepresentation) expected, true);
} else if ("user".equalsIgnoreCase(expected.getType())) {
userPolicy.form().populate((UserPolicyRepresentation) expected, true);
} else if ("client".equalsIgnoreCase(expected.getType())) {
clientPolicy.form().populate((ClientPolicyRepresentation) expected, true);
} else if ("js".equalsIgnoreCase(expected.getType())) {
jsPolicy.form().populate((JSPolicyRepresentation) expected, true);
} else if ("time".equalsIgnoreCase(expected.getType())) {
timePolicy.form().populate((TimePolicyRepresentation) expected, true);
} else if ("rules".equalsIgnoreCase(expected.getType())) {
rulePolicy.form().populate((RulePolicyRepresentation) expected, true);
} else if ("group".equalsIgnoreCase(expected.getType())) {
groupPolicy.form().populate((GroupPolicyRepresentation) expected, true);
}
}
public class PolicySelect extends MultipleStringSelect2 {
@Override
protected List<WebElement> getSelectedElements() {
return getRoot().findElements(By.xpath("(//table[@id='selected-policies'])/tbody/tr")).stream()
.filter(webElement -> webElement.findElements(tagName("td")).size() > 1)
.collect(Collectors.toList());
}
@Override
protected BiFunction<WebElement, String, Boolean> deselect() {
return (webElement, name) -> {
List<WebElement> tds = webElement.findElements(tagName("td"));
if (!tds.get(0).getText().isEmpty()) {
if (tds.get(0).getText().equals(name)) {
tds.get(3).click();
return true;
}
}
return false;
};
}
@Override
protected Function<WebElement, String> representation() {
return webElement -> webElement.findElements(tagName("td")).get(0).getText();
}
}
}
@@ -36,6 +36,6 @@ public class ClientPolicy implements PolicyTypeUI {
}
public void update(ClientPolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -56,14 +56,16 @@ public class ClientPolicyForm extends Form {
@FindBy(xpath = "//div[@class='modal-dialog']")
protected ModalDialog modalDialog;
public void populate(ClientPolicyRepresentation expected) {
public void populate(ClientPolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
logic.selectByValue(expected.getLogic().name());
clientsInput.update(expected.getClients());
save();
if (save) {
save();
}
}
public void delete() {
@@ -18,7 +18,6 @@ package org.keycloak.testsuite.console.page.clients.authorization.policy;
import org.jboss.arquillian.graphene.page.Page;
import org.keycloak.representations.idm.authorization.GroupPolicyRepresentation;
import org.keycloak.representations.idm.authorization.RolePolicyRepresentation;
/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
@@ -37,6 +36,6 @@ public class GroupPolicy implements PolicyTypeUI {
}
public void update(GroupPolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -63,7 +63,7 @@ public class GroupPolicyForm extends Form {
@Drone
private WebDriver driver;
public void populate(GroupPolicyRepresentation expected) {
public void populate(GroupPolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
setInputValue(groupsClaim, expected.getGroupsClaim());
@@ -109,7 +109,9 @@ public class GroupPolicyForm extends Form {
});
}
save();
if (save) {
save();
}
}
private void unselect(String path) {
@@ -17,7 +17,6 @@
package org.keycloak.testsuite.console.page.clients.authorization.policy;
import org.jboss.arquillian.graphene.page.Page;
import org.keycloak.representations.idm.authorization.AggregatePolicyRepresentation;
import org.keycloak.representations.idm.authorization.JSPolicyRepresentation;
/**
@@ -37,6 +36,6 @@ public class JSPolicy implements PolicyTypeUI {
}
public void update(JSPolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -45,7 +45,7 @@ public class JSPolicyForm extends Form {
@FindBy(xpath = "//div[@class='modal-dialog']")
protected ModalDialog modalDialog;
public void populate(JSPolicyRepresentation expected) {
public void populate(JSPolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
logic.selectByValue(expected.getLogic().name());
@@ -54,7 +54,9 @@ public class JSPolicyForm extends Form {
scriptExecutor.executeScript("angular.element(document.getElementById('code')).scope().policy.code = '" + expected.getCode() + "'");
save();
if (save) {
save();
}
}
public void delete() {
@@ -79,40 +79,44 @@ public class Policies extends Form {
return table;
}
public <P extends PolicyTypeUI> P create(AbstractPolicyRepresentation expected) {
public <P extends PolicyTypeUI> P create(AbstractPolicyRepresentation expected, boolean save) {
String type = expected.getType();
performOperationWithPageReload(() -> createSelect.selectByValue(type));
if ("role".equals(type)) {
rolePolicy.form().populate((RolePolicyRepresentation) expected);
rolePolicy.form().populate((RolePolicyRepresentation) expected, save);
return (P) rolePolicy;
} else if ("user".equals(type)) {
userPolicy.form().populate((UserPolicyRepresentation) expected);
userPolicy.form().populate((UserPolicyRepresentation) expected, save);
return (P) userPolicy;
} else if ("aggregate".equals(type)) {
aggregatePolicy.form().populate((AggregatePolicyRepresentation) expected);
aggregatePolicy.form().populate((AggregatePolicyRepresentation) expected, save);
return (P) aggregatePolicy;
} else if ("js".equals(type)) {
jsPolicy.form().populate((JSPolicyRepresentation) expected);
jsPolicy.form().populate((JSPolicyRepresentation) expected, save);
return (P) jsPolicy;
} else if ("time".equals(type)) {
timePolicy.form().populate((TimePolicyRepresentation) expected);
timePolicy.form().populate((TimePolicyRepresentation) expected, save);
return (P) timePolicy;
} else if ("rules".equals(type)) {
rulePolicy.form().populate((RulePolicyRepresentation) expected);
rulePolicy.form().populate((RulePolicyRepresentation) expected, save);
return (P) rulePolicy;
} else if ("client".equals(type)) {
clientPolicy.form().populate((ClientPolicyRepresentation) expected);
clientPolicy.form().populate((ClientPolicyRepresentation) expected, save);
return (P) clientPolicy;
} else if ("group".equals(type)) {
groupPolicy.form().populate((GroupPolicyRepresentation) expected);
groupPolicy.form().populate((GroupPolicyRepresentation) expected, save);
return (P) groupPolicy;
}
return null;
}
public <P extends PolicyTypeUI> P create(AbstractPolicyRepresentation expected) {
return create(expected, true);
}
public void update(String name, AbstractPolicyRepresentation representation) {
for (WebElement row : policies().rows()) {
PolicyRepresentation actual = policies().toRepresentation(row);
@@ -121,21 +125,21 @@ public class Policies extends Form {
String type = representation.getType();
if ("role".equals(type)) {
rolePolicy.form().populate((RolePolicyRepresentation) representation);
rolePolicy.form().populate((RolePolicyRepresentation) representation, true);
} else if ("user".equals(type)) {
userPolicy.form().populate((UserPolicyRepresentation) representation);
userPolicy.form().populate((UserPolicyRepresentation) representation, true);
} else if ("aggregate".equals(type)) {
aggregatePolicy.form().populate((AggregatePolicyRepresentation) representation);
aggregatePolicy.form().populate((AggregatePolicyRepresentation) representation, true);
} else if ("js".equals(type)) {
jsPolicy.form().populate((JSPolicyRepresentation) representation);
jsPolicy.form().populate((JSPolicyRepresentation) representation, true);
} else if ("time".equals(type)) {
timePolicy.form().populate((TimePolicyRepresentation) representation);
timePolicy.form().populate((TimePolicyRepresentation) representation, true);
} else if ("rules".equals(type)) {
rulePolicy.form().populate((RulePolicyRepresentation) representation);
rulePolicy.form().populate((RulePolicyRepresentation) representation, true);
} else if ("client".equals(type)) {
clientPolicy.form().populate((ClientPolicyRepresentation) representation);
clientPolicy.form().populate((ClientPolicyRepresentation) representation, true);
} else if ("group".equals(type)) {
groupPolicy.form().populate((GroupPolicyRepresentation) representation);
groupPolicy.form().populate((GroupPolicyRepresentation) representation, true);
}
return;
@@ -36,6 +36,6 @@ public class RolePolicy implements PolicyTypeUI {
}
public void update(RolePolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -64,7 +64,7 @@ public class RolePolicyForm extends Form {
@FindBy(xpath = "//div[@class='modal-dialog']")
protected ModalDialog modalDialog;
public void populate(RolePolicyRepresentation expected) {
public void populate(RolePolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
logic.selectByValue(expected.getLogic().name());
@@ -88,7 +88,9 @@ public class RolePolicyForm extends Form {
unSelect(roles, realmRoleSelect.getSelected());
unSelect(roles, clientRoleSelect.getSelected());
save();
if (save) {
save();
}
}
private void unSelect(Set<RolePolicyRepresentation.RoleDefinition> roles, Set<RolePolicyRepresentation.RoleDefinition> selection) {
@@ -36,6 +36,6 @@ public class RulePolicy implements PolicyTypeUI {
}
public void update(RulePolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -75,7 +75,7 @@ public class RulePolicyForm extends Form {
@FindBy(id = "resolveModule")
private WebElement resolveModuleButton;
public void populate(RulePolicyRepresentation expected) {
public void populate(RulePolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
setInputValue(artifactGroupId, expected.getArtifactGroupId());
@@ -94,7 +94,9 @@ public class RulePolicyForm extends Form {
scannerPeriodUnit.selectByVisibleText(expected.getScannerPeriodUnit());
logic.selectByValue(expected.getLogic().name());
save();
if (save) {
save();
}
}
public void delete() {
@@ -36,6 +36,6 @@ public class TimePolicy implements PolicyTypeUI {
}
public void update(TimePolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -81,7 +81,7 @@ public class TimePolicyForm extends Form {
@FindBy(xpath = "//div[@class='modal-dialog']")
protected ModalDialog modalDialog;
public void populate(TimePolicyRepresentation expected) {
public void populate(TimePolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
logic.selectByValue(expected.getLogic().name());
@@ -98,7 +98,9 @@ public class TimePolicyForm extends Form {
setInputValue(minute, expected.getMinute());
setInputValue(minuteEnd, expected.getMinuteEnd());
save();
if (save) {
save();
}
}
public void delete() {
@@ -36,6 +36,6 @@ public class UserPolicy implements PolicyTypeUI {
}
public void update(UserPolicyRepresentation expected) {
form().populate(expected);
form().populate(expected, true);
}
}
@@ -56,14 +56,16 @@ public class UserPolicyForm extends Form {
@FindBy(xpath = "//div[@class='modal-dialog']")
protected ModalDialog modalDialog;
public void populate(UserPolicyRepresentation expected) {
public void populate(UserPolicyRepresentation expected, boolean save) {
setInputValue(name, expected.getName());
setInputValue(description, expected.getDescription());
logic.selectByValue(expected.getLogic().name());
usersInput.update(expected.getUsers());
save();
if (save) {
save();
}
}
public void delete() {
@@ -20,21 +20,35 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.UUID;
import java.util.stream.Collectors;
import org.junit.Before;
import org.junit.Test;
import org.keycloak.admin.client.resource.AuthorizationResource;
import org.keycloak.admin.client.resource.ClientsResource;
import org.keycloak.admin.client.resource.PoliciesResource;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.admin.client.resource.RolePoliciesResource;
import org.keycloak.admin.client.resource.RolesResource;
import org.keycloak.admin.client.resource.UsersResource;
import org.keycloak.common.Version;
import org.keycloak.representations.idm.RoleRepresentation;
import org.keycloak.representations.idm.authorization.AggregatePolicyRepresentation;
import org.keycloak.representations.idm.authorization.ClientPolicyRepresentation;
import org.keycloak.representations.idm.authorization.GroupPolicyRepresentation;
import org.keycloak.representations.idm.authorization.JSPolicyRepresentation;
import org.keycloak.representations.idm.authorization.Logic;
import org.keycloak.representations.idm.authorization.RolePolicyRepresentation;
import org.keycloak.representations.idm.authorization.RulePolicyRepresentation;
import org.keycloak.representations.idm.authorization.TimePolicyRepresentation;
import org.keycloak.representations.idm.authorization.UserPolicyRepresentation;
import org.keycloak.testsuite.admin.ApiUtil;
import org.keycloak.testsuite.console.page.clients.authorization.policy.AggregatePolicy;
import org.keycloak.testsuite.console.page.clients.authorization.policy.UserPolicy;
import org.keycloak.testsuite.util.ClientBuilder;
import org.keycloak.testsuite.util.GroupBuilder;
import org.keycloak.testsuite.util.UserBuilder;
/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
@@ -44,16 +58,22 @@ public class AggregatePolicyManagementTest extends AbstractAuthorizationSettings
@Before
public void configureTest() {
super.configureTest();
RolesResource realmRoles = testRealmResource().roles();
RealmResource realmResource = testRealmResource();
RolesResource realmRoles = realmResource.roles();
realmRoles.create(new RoleRepresentation("Role A", "", false));
realmRoles.create(new RoleRepresentation("Role B", "", false));
UsersResource users = realmResource.users();
users.create(UserBuilder.create().username("user a").build());
ClientsResource clients = realmResource.clients();
clients.create(ClientBuilder.create().clientId("client a").build());
realmResource.groups().add(GroupBuilder.create().name("Group A").build());
RolePolicyRepresentation policyA = new RolePolicyRepresentation();
policyA.setName("Policy A");
policyA.addRole("Role A");
AuthorizationResource authorization = testRealmResource().clients().get(newClient.getId()).authorization();
AuthorizationResource authorization = realmResource.clients().get(newClient.getId()).authorization();
PoliciesResource policies = authorization.policies();
RolePoliciesResource roles = policies.role();
@@ -138,6 +158,138 @@ public class AggregatePolicyManagementTest extends AbstractAuthorizationSettings
assertNull(authorizationPage.authorizationTabs().policies().policies().findByName(expected.getName()));
}
@Test
public void testCreateWithChild() {
AggregatePolicyRepresentation expected = new AggregatePolicyRepresentation();
expected.setName("Test Child Create Aggregate Policy");
expected.setDescription("description");
AggregatePolicy policy = authorizationPage.authorizationTabs().policies().create(expected, false);
RolePolicyRepresentation childPolicy = new RolePolicyRepresentation();
childPolicy.setName(UUID.randomUUID().toString());
childPolicy.addRole("Role A");
policy.createPolicy(childPolicy);
policy.form().save();
assertAlertSuccess();
expected.addPolicy(childPolicy.getName());
authorizationPage.navigateTo();
AggregatePolicy actual = authorizationPage.authorizationTabs().policies().name(expected.getName());
assertPolicy(expected, actual);
}
@Test
public void testCreateWithChildAndSelectedPolicy() {
AggregatePolicyRepresentation expected = new AggregatePolicyRepresentation();
expected.setName("Test Child Create And Select Aggregate Policy");
expected.setDescription("description");
expected.addPolicy("Policy C");
AggregatePolicy policy = authorizationPage.authorizationTabs().policies().create(expected, false);
RolePolicyRepresentation childRolePolicy = new RolePolicyRepresentation();
childRolePolicy.setName(UUID.randomUUID().toString());
childRolePolicy.addRole("Role A");
policy.createPolicy(childRolePolicy);
expected.addPolicy(childRolePolicy.getName());
UserPolicyRepresentation childUserPolicy = new UserPolicyRepresentation();
childUserPolicy.setName(UUID.randomUUID().toString());
childUserPolicy.setDescription("description");
childUserPolicy.addUser("user a");
policy.createPolicy(childUserPolicy);
expected.addPolicy(childUserPolicy.getName());
ClientPolicyRepresentation childClientPolicy = new ClientPolicyRepresentation();
childClientPolicy.setName(UUID.randomUUID().toString());
childClientPolicy.setDescription("description");
childClientPolicy.addClient("client a");
policy.createPolicy(childClientPolicy);
expected.addPolicy(childClientPolicy.getName());
JSPolicyRepresentation childJSPolicy = new JSPolicyRepresentation();
childJSPolicy.setName(UUID.randomUUID().toString());
childJSPolicy.setDescription("description");
childJSPolicy.setCode("$evaluation.grant();");
policy.createPolicy(childJSPolicy);
expected.addPolicy(childJSPolicy.getName());
TimePolicyRepresentation childTimePolicy = new TimePolicyRepresentation();
childTimePolicy.setName(UUID.randomUUID().toString());
childTimePolicy.setDescription("description");
childTimePolicy.setNotBefore("2017-01-01 00:00:00");
childTimePolicy.setNotBefore("2018-01-01 00:00:00");
policy.createPolicy(childTimePolicy);
expected.addPolicy(childTimePolicy.getName());
RulePolicyRepresentation rulePolicy = new RulePolicyRepresentation();
rulePolicy.setName(UUID.randomUUID().toString());
rulePolicy.setDescription("description");
rulePolicy.setArtifactGroupId("org.keycloak");
rulePolicy.setArtifactId("photoz-authz-policy");
rulePolicy.setArtifactVersion(Version.VERSION);
rulePolicy.setModuleName("PhotozAuthzOwnerPolicy");
rulePolicy.setSessionName("MainOwnerSession");
rulePolicy.setScannerPeriod("1");
rulePolicy.setScannerPeriodUnit("Minutes");
policy.createPolicy(rulePolicy);
expected.addPolicy(rulePolicy.getName());
GroupPolicyRepresentation childGroupPolicy = new GroupPolicyRepresentation();
childGroupPolicy.setName(UUID.randomUUID().toString());
childGroupPolicy.setDescription("description");
childGroupPolicy.setGroupsClaim("groups");
childGroupPolicy.addGroupPath("/Group A", true);
policy.createPolicy(childGroupPolicy);
expected.addPolicy(childGroupPolicy.getName());
policy.form().save();
assertAlertSuccess();
authorizationPage.navigateTo();
AggregatePolicy actual = authorizationPage.authorizationTabs().policies().name(expected.getName());
assertPolicy(expected, actual);
}
@Test
public void testUpdateWithChild() {
AggregatePolicyRepresentation expected = new AggregatePolicyRepresentation();
expected.setName("Test Child Update Aggregate Policy");
expected.setDescription("description");
expected.addPolicy("Policy C");
AggregatePolicy policy = authorizationPage.authorizationTabs().policies().create(expected);
assertAlertSuccess();
assertPolicy(expected, policy);
RolePolicyRepresentation childPolicy = new RolePolicyRepresentation();
childPolicy.setName(UUID.randomUUID().toString());
childPolicy.addRole("Role A");
policy.createPolicy(childPolicy);
policy.form().save();
expected.addPolicy(childPolicy.getName());
authorizationPage.navigateTo();
AggregatePolicy actual = authorizationPage.authorizationTabs().policies().name(expected.getName());
assertPolicy(expected, actual);
}
private AggregatePolicyRepresentation createPolicy(AggregatePolicyRepresentation expected) {
AggregatePolicy policy = authorizationPage.authorizationTabs().policies().create(expected);
assertAlertSuccess();