[SYNCOPE-1030] fix + integration test
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/d0dc9b35 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/d0dc9b35 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/d0dc9b35 Branch: refs/heads/master Commit: d0dc9b35f8e901c692c6df8b3016fd2384d94d62 Parents: b193aec Author: fmartelli <fabio.marte...@gmail.com> Authored: Mon Feb 27 15:18:15 2017 +0100 Committer: fmartelli <fabio.marte...@gmail.com> Committed: Mon Feb 27 15:19:05 2017 +0100 ---------------------------------------------------------------------- .../client/console/panels/BeanPanel.java | 4 - .../syncope/client/console/panels/Realm.java | 2 +- .../client/console/panels/RealmDetails.java | 6 +- .../client/console/rest/PolicyRestClient.java | 15 ++ .../syncope/fit/console/PoliciesITCase.java | 136 +++++++++++++++++-- .../apache/syncope/fit/console/UsersITCase.java | 5 +- 6 files changed, 148 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/d0dc9b35/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java index ee4303f..c09fb43 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java @@ -227,10 +227,6 @@ public class BeanPanel<T extends Serializable> extends Panel { new PropertyModel<List<String>>(bean.getObject(), fieldName), new ListModel(Arrays.asList(listItemType.getEnumConstants()))).hideLabel(); } else { - if (((List) wrapper.getPropertyValue(fieldName)).isEmpty()) { - ((List) wrapper.getPropertyValue(fieldName)).add(null); - } - panel = new MultiFieldPanel.Builder<>( new PropertyModel<List<String>>(bean.getObject(), fieldName)).build( "value", http://git-wip-us.apache.org/repos/asf/syncope/blob/d0dc9b35/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java index d210aa7..7837f12 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java @@ -220,7 +220,7 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { afterObj.getAttrMap().get(ConnIdSpecialAttributeName.NAME).getValues()) ? StringUtils.EMPTY : afterObj.getAttrMap().get(ConnIdSpecialAttributeName.NAME).getValues(). - iterator().next(); + iterator().next(); return new Label("field", remoteId); } else if ("status".equalsIgnoreCase(key)) { http://git-wip-us.apache.org/repos/asf/syncope/blob/d0dc9b35/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java index 3d646df..603e49b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java @@ -19,7 +19,7 @@ package org.apache.syncope.client.console.panels; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; @@ -64,7 +64,7 @@ public class RealmDetails extends Panel { @Override protected Map<String, String> load() { - Map<String, String> res = new HashMap<>(); + Map<String, String> res = new LinkedHashMap<>(); for (AbstractPolicyTO policyTO : policyRestClient.getPolicies(PolicyType.ACCOUNT)) { res.put(policyTO.getKey(), policyTO.getDescription()); } @@ -78,7 +78,7 @@ public class RealmDetails extends Panel { @Override protected Map<String, String> load() { - Map<String, String> res = new HashMap<>(); + Map<String, String> res = new LinkedHashMap<>(); for (AbstractPolicyTO policyTO : policyRestClient.getPolicies(PolicyType.PASSWORD)) { res.put(policyTO.getKey(), policyTO.getDescription()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/d0dc9b35/client/console/src/main/java/org/apache/syncope/client/console/rest/PolicyRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/PolicyRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/PolicyRestClient.java index 3bfaef6..759600e 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/PolicyRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/PolicyRestClient.java @@ -18,7 +18,10 @@ */ package org.apache.syncope.client.console.rest; +import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import org.apache.syncope.common.lib.policy.AbstractPolicyTO; import org.apache.syncope.common.lib.types.PolicyType; @@ -47,6 +50,7 @@ public class PolicyRestClient extends BaseRestClient { try { res.addAll((List<T>) getService(PolicyService.class).list(type)); + Collections.sort(res, new PolicyComparator()); } catch (Exception ignore) { LOG.debug("No policy found", ignore); } @@ -65,4 +69,15 @@ public class PolicyRestClient extends BaseRestClient { public void delete(final String key) { getService(PolicyService.class).delete(key); } + + private class PolicyComparator implements Comparator<AbstractPolicyTO>, Serializable { + + private static final long serialVersionUID = -4921433085213223115L; + + @Override + public int compare(final AbstractPolicyTO left, final AbstractPolicyTO right) { + return left == null ? -1 : right == null ? 1 : left.getDescription().compareTo(right.getDescription()); + } + + } } http://git-wip-us.apache.org/repos/asf/syncope/blob/d0dc9b35/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java index 5916ce0..67ed20b 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/PoliciesITCase.java @@ -18,12 +18,18 @@ */ package org.apache.syncope.fit.console; +import static org.apache.syncope.fit.console.AbstractConsoleITCase.TESTER; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal; import org.apache.syncope.client.console.commons.Constants; import org.apache.syncope.client.console.pages.Policies; +import org.apache.syncope.client.console.pages.Realms; import org.apache.syncope.common.lib.types.ConflictResolutionAction; import org.apache.wicket.Component; import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.util.tester.FormTester; import org.junit.Assert; import org.junit.Before; @@ -84,8 +90,9 @@ public class PoliciesITCase extends AbstractConsoleITCase { "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button", Constants.ON_CLICK); - Assert.assertNotNull(findComponentByProp("description", "body:content:tabbedPanel:panel:container:content:" - + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", description)); + component = findComponentByProp("description", "body:content:tabbedPanel:panel:container:content:" + + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", description); + Assert.assertNotNull(component); } private void createPasswordPolicy(final String description) { @@ -423,13 +430,10 @@ public class PoliciesITCase extends AbstractConsoleITCase { deleteAccountPolicy(description); } - @Test - public void createComposeDeleteAccountPolicy() { - final String description = "Account Policy To Be Composed"; - createAccountPolicy(description); + private void composeDefaultAccountPolicy(final String policyDescription, final String ruleName) { Component component = findComponentByProp("description", "body:content:tabbedPanel:panel:container:content:" - + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", description); + + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", policyDescription); Assert.assertNotNull(component); TESTER.clickLink(component.getPageRelativePath() + ":cells:9:cell:panelCompose:composeLink"); @@ -443,7 +447,7 @@ public class PoliciesITCase extends AbstractConsoleITCase { FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:outerObjectsRepeater:3:" + "outer:form:content:container:content:wizard:form"); - formTester.setValue("view:name:textField", "myrule"); + formTester.setValue("view:name:textField", ruleName); formTester.setValue("view:configuration:dropDownChoiceField", "0"); formTester.submit("buttons:next"); @@ -452,6 +456,7 @@ public class PoliciesITCase extends AbstractConsoleITCase { formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:outerObjectsRepeater:3:" + "outer:form:content:container:content:wizard:form"); + formTester.setValue("view:bean:propView:1:value:spinner", "6"); formTester.submit("buttons:finish"); TESTER.assertInfoMessages("Operation executed successfully"); @@ -459,7 +464,7 @@ public class PoliciesITCase extends AbstractConsoleITCase { component = findComponentByProp("name", "body:content:tabbedPanel:panel:outerObjectsRepeater:3:outer:form:" + "content:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", - "myrule"); + ruleName); Assert.assertNotNull(component); @@ -467,7 +472,13 @@ public class PoliciesITCase extends AbstractConsoleITCase { "body:content:tabbedPanel:panel:outerObjectsRepeater:3:outer:form:content:container:content:exit"); closeCallBack(modal); + } + @Test + public void createComposeDeleteAccountPolicy() { + final String description = "Account Policy To Be Composed"; + createAccountPolicy(description); + composeDefaultAccountPolicy(description, "myrule"); deleteAccountPolicy(description); } @@ -663,4 +674,111 @@ public class PoliciesITCase extends AbstractConsoleITCase { deletePullPolicy(description); } + + @Test + public void issueSYNCOPE1030() { + final String description = "SYNCOPE-1030"; + // Create account policy + createAccountPolicy(description); + composeDefaultAccountPolicy(description, "issue"); + + // goto realms + TESTER.clickLink("body:realmsLI:realms"); + TESTER.assertRenderedPage(Realms.class); + + // edit root realm + TESTER.clickLink( + "body:content:body:container:content:tabbedPanel:panel:actions:actions:panelEdit:editLink"); + TESTER.assertComponent("body:content:body:outerObjectsRepeater:0:outer", Modal.class); + + // set new account policy + TESTER.assertLabel("body:content:body:outerObjectsRepeater:0:outer:form:content:form:view:details:container:" + + "accountPolicy:field-label", "Account Policy"); + + FormTester formTester = TESTER.newFormTester( + "body:content:body:outerObjectsRepeater:0:outer:form:content:form"); + formTester.select("view:details:container:accountPolicy:dropDownChoiceField", 0); + formTester.submit("buttons:finish"); + + TESTER.assertInfoMessages("Operation executed successfully"); + TESTER.cleanupFeedbackMessages(); + + TESTER.executeAjaxEvent( + "body:content:body:outerObjectsRepeater:0:outer:form:content:action:panelClose:closeLink", + Constants.ON_CLICK); + + // create user with a valid account name + TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link"); + + Component component = findComponentByProp("username", + "body:content:body:container:content:tabbedPanel:panel:searchResult:container:content:" + + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini"); + assertNotNull(component); + + TESTER.clickLink(component.getPageRelativePath() + ":cells:6:cell:panelClone:cloneLink"); + + TESTER.assertComponent( + "body:content:body:container:content:tabbedPanel:panel:searchResult:" + + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField", + TextField.class); + + formTester = TESTER.newFormTester( + "body:content:body:container:content:tabbedPanel:panel:searchResult:" + + "outerObjectsRepeater:0:outer:form:content:form"); + assertNotNull(formTester); + formTester.submit("buttons:next"); + + formTester = TESTER.newFormTester( + "body:content:body:container:content:tabbedPanel:panel:searchResult:" + + "outerObjectsRepeater:0:outer:form:content:form"); + assertNotNull(formTester); + formTester.submit("buttons:next"); + + formTester = TESTER.newFormTester( + "body:content:body:container:content:tabbedPanel:panel:searchResult:" + + "outerObjectsRepeater:0:outer:form:content:form"); + assertNotNull(formTester); + formTester.submit("buttons:next"); + + formTester = TESTER.newFormTester( + "body:content:body:container:content:tabbedPanel:panel:searchResult:" + + "outerObjectsRepeater:0:outer:form:content:form"); + assertNotNull(formTester); + + formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:6:panel:textField", "rossini 1030"); + formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:14:panel:textField", "ross1...@apace.org"); + formTester.submit("buttons:finish"); + + TESTER.assertInfoMessages("Operation executed successfully"); + TESTER.cleanupFeedbackMessages(); + + TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:" + + "outerObjectsRepeater:0:outer:form:content:action:panelClose:closeLink"); + + component = findComponentByProp("username", + "body:content:body:container:content:tabbedPanel:panel:searchResult:container:content:" + + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini_clone"); + assertNotNull(component); + + // delete the new user + TESTER.getRequest().addParameter("confirm", "true"); + TESTER.clickLink(TESTER.getComponentFromLastRenderedPage( + component.getPageRelativePath() + ":cells:6:cell:panelDelete:deleteLink")); + + TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage( + component.getPageRelativePath() + ":cells:6:cell:panelDelete:deleteLink"), "onclick"); + + TESTER.assertInfoMessages("Operation executed successfully"); + TESTER.cleanupFeedbackMessages(); + + component = findComponentByProp("username", + "body:content:body:container:content:tabbedPanel:panel:searchResult:container:content:" + + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini_clone"); + assertNull(component); + + // delete default policy + TESTER.clickLink("body:configurationLI:configurationUL:policiesLI:policies"); + TESTER.assertRenderedPage(Policies.class); + deleteAccountPolicy(description); + } } http://git-wip-us.apache.org/repos/asf/syncope/blob/d0dc9b35/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java index 9d0f8e5..2631395 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/UsersITCase.java @@ -86,9 +86,8 @@ public class UsersITCase extends AbstractConsoleITCase { TESTER.clickLink(component.getPageRelativePath() + ":cells:6:cell:panelClone:cloneLink"); - TESTER. - assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField", - TextField.class); + TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField", + TextField.class); FormTester formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form"); assertNotNull(formTester);