This is an automated email from the ASF dual-hosted git repository.

skylark17 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 785e0fa  [SYNCOPE-1421] Small fixes to the Enduser, added first UI 
tests for the new Enduser
785e0fa is described below

commit 785e0fa659cbe853c81b45a571819d34a01dc64a
Author: skylark17 <[email protected]>
AuthorDate: Thu Jun 6 17:20:19 2019 +0200

    [SYNCOPE-1421] Small fixes to the Enduser, added first UI tests for the new 
Enduser
---
 .../css/accessibility/accessibilityHC.scss         |  13 ++
 .../resources/ui-commons/js/accessibility.js       |   8 +-
 .../console/SyncopeWebApplication.properties       |   2 +-
 .../markup/html/form/AjaxCaptchaFieldPanel.java    |  13 +-
 .../syncope/client/enduser/navigation/Navbar.java  |   3 +-
 .../client/enduser/pages/MustChangePassword.java   |   4 +-
 .../apache/syncope/client/enduser/pages/Self.java  |   7 +-
 .../enduser/pages/SelfConfirmPasswordReset.java    |   6 +-
 .../client/enduser/panels/SelfPwdResetPanel.java   |   5 +-
 .../client/enduser/wizards/any/PlainAttrs.java     |  84 ++++++++++---
 .../enduser/SyncopeWebApplication.properties       |   2 +-
 .../client/enduser/assets/css/syncopeEnduser.scss  |   4 +
 .../markup/html/form/AjaxCaptchaFieldPanel.html    |   4 +-
 .../syncope/fit/console/AbstractTypesITCase.java   |   8 +-
 .../syncope/fit/console/AnyObjectsITCase.java      |   2 +-
 .../syncope/fit/console/AnyTypeClassesITCase.java  |   8 +-
 .../apache/syncope/fit/console/AnyTypesITCase.java |   6 +-
 .../apache/syncope/fit/console/BatchesITCase.java  |   4 +-
 .../fit/console/DisplayAttributesITCase.java       |   2 +-
 .../apache/syncope/fit/console/GroupsITCase.java   |   8 +-
 .../org/apache/syncope/fit/console/LogsITCase.java |   4 +-
 .../syncope/fit/console/NotificationsITCase.java   |   8 +-
 .../syncope/fit/console/ParametersITCase.java      |   8 +-
 .../apache/syncope/fit/console/PoliciesITCase.java |  36 +++---
 .../apache/syncope/fit/console/RealmsITCase.java   |  14 +--
 .../fit/console/RelationshipTypesITCase.java       |   4 +-
 .../apache/syncope/fit/console/ReportsITCase.java  |   6 +-
 .../apache/syncope/fit/console/RolesITCase.java    |   6 +-
 .../apache/syncope/fit/console/SchemasITCase.java  |  12 +-
 .../fit/console/SecurityQuestionsITCase.java       |   6 +-
 .../apache/syncope/fit/console/TopologyITCase.java |  18 +--
 .../apache/syncope/fit/console/UsersITCase.java    |  18 +--
 .../syncope/fit/enduser/AbstractEnduserITCase.java |  29 +++++
 .../fit/enduser/SelfRegistrationITCase.java        | 139 ++++++++++++++++++++-
 .../src/test/resources/enduser.properties          |   2 +-
 35 files changed, 366 insertions(+), 137 deletions(-)

diff --git 
a/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/accessibility/accessibilityHC.scss
 
b/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/accessibility/accessibilityHC.scss
index ababa93..d52aaac 100644
--- 
a/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/accessibility/accessibilityHC.scss
+++ 
b/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/accessibility/accessibilityHC.scss
@@ -297,4 +297,17 @@ div.infolabel,
 
 .login-card {
   background-color: #0f1417;
+}
+
+
+
+
+/* From Console Admin LTE
+============================================================================= 
*/
+.dark-theme .callout.callout-danger, .dark-theme .callout.callout-warning, 
+.dark-theme .callout.callout-info, .dark-theme .callout.callout-success, 
+.dark-theme .alert-success, .dark-theme .alert-danger, .dark-theme 
.label-success, 
+.dark-theme .alert-error, .dark-theme .alert-warning, .dark-theme .alert-info, 
.dark-theme .label-danger, 
+.dark-theme .label-info, .dark-theme .label-warning, .dark-theme 
.label-primary {
+  color: #fff !important;
 }
\ No newline at end of file
diff --git 
a/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/js/accessibility.js
 
b/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/js/accessibility.js
index 790e2b4..36247f7 100644
--- 
a/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/js/accessibility.js
+++ 
b/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/js/accessibility.js
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -99,7 +100,8 @@ $(document).ready(function () {
       locationDomain + '/ui-commons/css/accessibility/accessibilityHC.css'
     ];
 
-    var darkThemeMainClass = 'skin-blue';
+    var darkThemeMainClass = 'dark-theme';
+    var darkThemeSkinClass = 'skin-blue';
     var defaultThemeMainClass = 'skin-green-light';
 
     var doSwitch = function (check, files) {
@@ -118,9 +120,9 @@ $(document).ready(function () {
       doSwitch(check, files);
 
       if ($('body').hasClass(defaultThemeMainClass) && check) {
-        
$('body').removeClass(defaultThemeMainClass).addClass(darkThemeMainClass);
+        
$('body').removeClass(defaultThemeMainClass).addClass(darkThemeMainClass).addClass(darkThemeSkinClass);
       } else {
-        
$('body').removeClass(darkThemeMainClass).addClass(defaultThemeMainClass);
+        
$('body').addClass(defaultThemeMainClass).removeClass(darkThemeMainClass).removeClass(darkThemeSkinClass);
       }
     };
 
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
index b9826b3..fdfc2ef 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
@@ -23,7 +23,7 @@ reports=Reports
 tasks=Tasks
 logout=Logout
 schema=Schema
-operation_succeeded=Operation executed successfully
+operation_succeeded=Operation successfully executed
 operation_error=Error occurred during the requested operation
 alert=Alert:
 confirmDelete=Do you really want to delete the selected item(s)?
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.java
index 40e407a..5599a45 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.java
@@ -20,24 +20,28 @@ package org.apache.syncope.client.enduser.markup.html.form;
 
 import 
org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.validation.IValidator;
 
-public class AjaxCaptchaFieldPanel extends FieldPanel<String> {
+public class AjaxCaptchaFieldPanel extends Panel {
 
     private static final long serialVersionUID = 238940918106696068L;
 
+    private RequiredTextField<String> field;
+
     public AjaxCaptchaFieldPanel(final String id, final String name, final 
IModel<String> model) {
         this(id, name, model, true);
     }
 
     public AjaxCaptchaFieldPanel(
             final String id, final String name, final IModel<String> model, 
final boolean enableOnChange) {
-        super(id, name, model);
+
+        super(id, model);
 
         field = new RequiredTextField<String>("textField", model, 
String.class) {
 
@@ -50,10 +54,11 @@ public class AjaxCaptchaFieldPanel extends 
FieldPanel<String> {
                 tag.put("value", "");
             }
         };
+        field.setLabel(new ResourceModel(name, name));
 
         add(field.setOutputMarkupId(true));
 
-        if (enableOnChange && !isReadOnly()) {
+        if (enableOnChange && !field.isEnabled()) {
             field.add(new 
IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
                 private static final long serialVersionUID = 
-1107858522700306810L;
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/navigation/Navbar.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/navigation/Navbar.java
index 1472128..98dad64 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/navigation/Navbar.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/navigation/Navbar.java
@@ -24,7 +24,6 @@ import java.util.Optional;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.ExtPage;
 import org.apache.syncope.client.enduser.pages.BaseExtPage;
-import org.apache.syncope.client.enduser.pages.Login;
 import org.apache.syncope.client.enduser.pages.Logout;
 import org.apache.syncope.client.enduser.pages.Self;
 import org.apache.syncope.client.ui.commons.Constants;
@@ -103,7 +102,7 @@ public class Navbar extends Panel {
 
             @Override
             protected void onEvent(final AjaxRequestTarget target) {
-                setResponsePage(Login.class);
+                setResponsePage(getApplication().getHomePage());
             }
         });
         add(logoLinkWmc);
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/MustChangePassword.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/MustChangePassword.java
index 60a0d26..5b34eb6 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/MustChangePassword.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/MustChangePassword.java
@@ -46,7 +46,7 @@ public class MustChangePassword extends 
AbstractMustChangePassword {
 
             final PageParameters parameters = new PageParameters();
             parameters.add(Constants.NOTIFICATION_MSG_PARAM, 
getString("self.pwd.change.success"));
-            setResponsePage(Login.class, parameters);
+            setResponsePage(getApplication().getHomePage(), parameters);
 
             setResponsePage(getApplication().getHomePage(), parameters);
         } catch (Exception e) {
@@ -65,7 +65,7 @@ public class MustChangePassword extends 
AbstractMustChangePassword {
 
     @Override
     protected void doCancel() {
-        setResponsePage(Login.class);
+        setResponsePage(getApplication().getHomePage());
     }
 
 }
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Self.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Self.java
index bebdcfe..686f2e2 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Self.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/Self.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.enduser.pages;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.SyncopeWebApplication;
@@ -48,8 +47,6 @@ public class Self extends BaseEnduserWebPage implements 
IEventSource {
 
     private UserWizardBuilder userWizardBuilder;
 
-    protected static final ObjectMapper MAPPER = new ObjectMapper();
-
     protected static final String WIZARD_ID = "wizard";
 
     public Self(final PageParameters parameters) {
@@ -73,7 +70,7 @@ public class Self extends BaseEnduserWebPage implements 
IEventSource {
                         getAttribute(Constants.BEFORE_LOGOUT_PAGE);
                 if (beforeLogout == null) {
                     SyncopeEnduserSession.get().invalidate();
-                    setResponsePage(Login.class);
+                    setResponsePage(getApplication().getHomePage());
                 } else {
                     setResponsePage(beforeLogout);
                 }
@@ -82,7 +79,7 @@ public class Self extends BaseEnduserWebPage implements 
IEventSource {
 
                 final PageParameters parameters = new PageParameters();
                 parameters.add(Constants.NOTIFICATION_MSG_PARAM, 
getString("self.wizard.success"));
-                setResponsePage(Login.class, parameters);
+                setResponsePage(getApplication().getHomePage(), parameters);
             }
         }
         super.onEvent(event);
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
index 6a6cb36..591f2cc 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/pages/SelfConfirmPasswordReset.java
@@ -72,7 +72,7 @@ public class SelfConfirmPasswordReset extends 
BaseEnduserWebPage {
         if (parameters == null || parameters.get("token").isEmpty()) {
             LOG.debug("No token parameter found in the request url");
             parameters.add("errorMessage", 
getString("self.confirm.pwd.reset.error.empty"));
-            setResponsePage(Login.class, parameters);
+            setResponsePage(getApplication().getHomePage(), parameters);
         }
 
         navbar.setEnabled(false);
@@ -135,7 +135,7 @@ public class SelfConfirmPasswordReset extends 
BaseEnduserWebPage {
                             parameters.get("token").toString(), 
passwordField.getDefaultModelObjectAsString());
                     PageParameters parameters = new PageParameters();
                     parameters.add(Constants.NOTIFICATION_MSG_PARAM, 
getString("self.confirm.pwd.reset.success"));
-                    setResponsePage(Login.class, parameters);
+                    setResponsePage(getApplication().getHomePage(), 
parameters);
                 } catch (SyncopeClientException sce) {
                     LOG.error("Unable to complete the 'Password Reset 
Confirmation' process", sce);
                     
SyncopeEnduserSession.get().error(StringUtils.isBlank(sce.getMessage())
@@ -159,7 +159,7 @@ public class SelfConfirmPasswordReset extends 
BaseEnduserWebPage {
 
             @Override
             public void onSubmit() {
-                setResponsePage(Login.class);
+                setResponsePage(getApplication().getHomePage());
             }
 
         };
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
index 94a6ae0..8e8cb2d 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/SelfPwdResetPanel.java
@@ -25,7 +25,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.SyncopeWebApplication;
 import org.apache.syncope.client.enduser.pages.BaseEnduserWebPage;
-import org.apache.syncope.client.enduser.pages.Login;
 import org.apache.syncope.client.enduser.wizards.any.CaptchaPanel;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.DomainDropDown;
@@ -170,7 +169,7 @@ public class SelfPwdResetPanel extends Panel implements 
IEventSource {
                                 requestPasswordReset(usernameText, 
securityAnswerModel.getObject());
                         final PageParameters parameters = new PageParameters();
                         parameters.add(Constants.NOTIFICATION_MSG_PARAM, 
getString("self.pwd.reset.success"));
-                        setResponsePage(Login.class, parameters);
+                        setResponsePage(getApplication().getHomePage(), 
parameters);
                     } catch (SyncopeClientException sce) {
                         LOG.error("Unable to reset password of [{}]", 
usernameText, sce);
                         
SyncopeEnduserSession.get().error(StringUtils.isBlank(sce.getMessage())
@@ -192,7 +191,7 @@ public class SelfPwdResetPanel extends Panel implements 
IEventSource {
 
             @Override
             public void onSubmit() {
-                setResponsePage(Login.class);
+                setResponsePage(getApplication().getHomePage());
             }
 
         };
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
index d749fa2..ee5dcae 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
@@ -48,6 +48,7 @@ import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.Attr;
+import org.apache.syncope.common.lib.Attributable;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
@@ -64,6 +65,7 @@ import org.apache.wicket.markup.html.form.IChoiceRenderer;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
@@ -113,7 +115,7 @@ public class PlainAttrs extends 
AbstractAttrs<PlainSchemaTO> {
 
             @Override
             public WebMarkupContainer getPanel(final String panelId) {
-                return new PlainSchemas(panelId, schemas, attrs);
+                return new PlainSchemasOwn(panelId, schemas, attrs);
             }
         }), Model.of(0)).setOutputMarkupId(true));
 
@@ -134,11 +136,20 @@ public class PlainAttrs extends 
AbstractAttrs<PlainSchemaTO> {
 
                     @Override
                     public WebMarkupContainer getPanel(final String panelId) {
-                        return new PlainSchemas(
+                        return new PlainSchemasMemberships(
                                 panelId,
                                 membershipTO.getGroupName(),
                                 
membershipSchemas.get(membershipTO.getGroupKey()),
-                                new ListModel<>(getAttrsFromTO(membershipTO)));
+                                new LoadableDetachableModel<Attributable>() { 
// SYNCOPE-1439
+
+                            private static final long serialVersionUID = 
526768546610546553L;
+
+                            @Override
+                            protected Attributable load() {
+                                return membershipTO;
+                            }
+
+                        });
                     }
                 }), Model.of(-1)).setOutputMarkupId(true));
             }
@@ -370,22 +381,67 @@ public class PlainAttrs extends 
AbstractAttrs<PlainSchemaTO> {
         return panel;
     }
 
-    public class PlainSchemas extends Schemas {
+    protected class PlainSchemasMemberships extends Schemas {
 
-        private static final long serialVersionUID = -4730563859116024676L;
+        private static final long serialVersionUID = 456754923340249215L;
 
-        public PlainSchemas(
+        public PlainSchemasMemberships(
                 final String id,
+                final String groupName,
                 final Map<String, PlainSchemaTO> schemas,
-                final IModel<List<Attr>> attrTOs) {
-            this(id, null, schemas, attrTOs);
+                final IModel<Attributable> attributableTO) {
+
+            super(id);
+
+            add(new ListView<Attr>("schemas",
+                    new ListModel<Attr>(new ArrayList<Attr>(
+                            
attributableTO.getObject().getPlainAttrs().stream().sorted(attrComparator).
+                                    collect(Collectors.toList())))) {
+
+                private static final long serialVersionUID = 
5306618783986001008L;
+
+                @Override
+                @SuppressWarnings({ "unchecked", "rawtypes" })
+                protected void populateItem(final ListItem<Attr> item) {
+                    Attr attrTO = item.getModelObject();
+
+                    // set default values, if any
+                    if (attrTO.getValues().stream().anyMatch(value -> 
StringUtils.isNotBlank(value))) {
+                        attrTO.getValues().clear();
+                        
attrTO.getValues().addAll(getDefaultValues(attrTO.getSchema(), groupName));
+                    }
+
+                    AbstractFieldPanel<?> panel = 
getFieldPanel(schemas.get(attrTO.getSchema()));
+
+                    panel = new MultiFieldPanel.Builder<>(new 
ListModel<String>() {
+
+                        private static final long serialVersionUID = 
-1765231556272935141L;
+
+                        @Override
+                        public List<String> getObject() {
+                            return 
attributableTO.getObject().getPlainAttr(attrTO.getSchema()).get().getValues();
+                        }
+                    }).build("panel",
+                            attrTO.getSchema(),
+                            FieldPanel.class.cast(panel));
+                    // SYNCOPE-1215 the entire multifield panel must be 
readonly, not only its field
+                    ((MultiFieldPanel) 
panel).setReadOnly(schemas.get(attrTO.getSchema()).isReadonly());
+
+                    item.add(panel);
+                }
+            });
         }
+    }
+
+    protected class PlainSchemasOwn extends Schemas {
 
-        public PlainSchemas(
+        private static final long serialVersionUID = -4730563859116024676L;
+
+        public PlainSchemasOwn(
                 final String id,
-                final String groupName,
                 final Map<String, PlainSchemaTO> schemas,
                 final IModel<List<Attr>> attrTOs) {
+
             super(id);
 
             add(new ListView<Attr>("schemas", attrTOs) {
@@ -397,13 +453,6 @@ public class PlainAttrs extends 
AbstractAttrs<PlainSchemaTO> {
                 protected void populateItem(final ListItem<Attr> item) {
                     Attr attrTO = item.getModelObject();
 
-                    // set default values, if any
-                    if (attrTO.getValues().stream().filter(value -> 
StringUtils.isNotBlank(value))
-                            .collect(Collectors.toList()).isEmpty()) {
-                        attrTO.getValues().clear();
-                        
attrTO.getValues().addAll(getDefaultValues(attrTO.getSchema(), groupName));
-                    }
-
                     AbstractFieldPanel<?> panel = 
getFieldPanel(schemas.get(attrTO.getSchema()));
                     if (schemas.get(attrTO.getSchema()).isMultivalue()) {
                         panel = new MultiFieldPanel.Builder<>(
@@ -421,4 +470,5 @@ public class PlainAttrs extends 
AbstractAttrs<PlainSchemaTO> {
             });
         }
     }
+
 }
diff --git 
a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/SyncopeWebApplication.properties
 
b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/SyncopeWebApplication.properties
index aaf3d62..91038e7 100644
--- 
a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/SyncopeWebApplication.properties
+++ 
b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/SyncopeWebApplication.properties
@@ -23,7 +23,7 @@ reports=Reports
 tasks=Tasks
 logout=Logout
 schema=Schema
-operation_succeeded=Operation executed successfully
+operation_succeeded=Operation successfully executed
 operation_error=Error occurred during the requested operation
 alert=Alert:
 confirmDelete=Do you really want to delete the selected item(s)?
diff --git 
a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/assets/css/syncopeEnduser.scss
 
b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/assets/css/syncopeEnduser.scss
index 2564679..8502a1b 100644
--- 
a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/assets/css/syncopeEnduser.scss
+++ 
b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/assets/css/syncopeEnduser.scss
@@ -173,6 +173,10 @@ body {
     /*min-height: 446px;*/
     min-height: 530px;
 
+    form {
+      height: 530px;
+    }
+
     .captcha_block {
       text-align: center;
       padding-top: 8rem;
diff --git 
a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.html
 
b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.html
index 39471d3..e71b390 100644
--- 
a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.html
+++ 
b/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxCaptchaFieldPanel.html
@@ -17,7 +17,7 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:wicket="http://wicket.apache.org";>
-  <wicket:extend>
+  <wicket:panel>
     <fieldset class="input-group">
       <div id="captcha_text" class="captcha_elem">
         <input type="text" size="27" wicket:id="textField" placeholder=""/>
@@ -26,5 +26,5 @@ under the License.
         <wicket:message 
key="captcha.message">[CAPTCHA_MESSAGE]</wicket:message>
       </div>
     </fieldset>
-  </wicket:extend>
+  </wicket:panel>
 </html>
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
index dbd53a1..6e4ad82 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java
@@ -106,7 +106,7 @@ public abstract class AbstractTypesITCase extends 
AbstractConsoleITCase {
                 + 
"accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
     }
@@ -124,7 +124,7 @@ public abstract class AbstractTypesITCase extends 
AbstractConsoleITCase {
         TESTER.clearFeedbackMessages();
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.clearFeedbackMessages();
     }
@@ -141,7 +141,7 @@ public abstract class AbstractTypesITCase extends 
AbstractConsoleITCase {
 
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.clearFeedbackMessages();
     }
@@ -161,7 +161,7 @@ public abstract class AbstractTypesITCase extends 
AbstractConsoleITCase {
 
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.clearFeedbackMessages();
         TESTER.assertRenderedPage(Types.class);
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
index 6c3cf2c..9138a9c 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyObjectsITCase.java
@@ -114,7 +114,7 @@ public class AnyObjectsITCase extends AbstractConsoleITCase 
{
         assertNotNull(formTester);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.assertComponent(TAB_PANEL
                 + 
"outerObjectsRepeater:0:outer:form:content:customResultBody:resources:"
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypeClassesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypeClassesITCase.java
index 272b2e5..84d5268 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypeClassesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypeClassesITCase.java
@@ -65,7 +65,7 @@ public class AnyTypeClassesITCase extends AbstractTypesITCase 
{
         TESTER.clearFeedbackMessages();
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.clearFeedbackMessages();
         TESTER.assertRenderedPage(Types.class);
@@ -103,7 +103,7 @@ public class AnyTypeClassesITCase extends 
AbstractTypesITCase {
 
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         component = findComponentByProp(KEY, DATATABLE_PATH, name);
@@ -122,7 +122,7 @@ public class AnyTypeClassesITCase extends 
AbstractTypesITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
         component = findComponentByProp(KEY, DATATABLE_PATH, name);
 
@@ -152,7 +152,7 @@ public class AnyTypeClassesITCase extends 
AbstractTypesITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         component = findComponentByProp(KEY, DATATABLE_PATH, anyTypeClassName);
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypesITCase.java
index ba213ab..8ab835b 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AnyTypesITCase.java
@@ -70,7 +70,7 @@ public class AnyTypesITCase extends AbstractTypesITCase {
         TESTER.clearFeedbackMessages();
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.clearFeedbackMessages();
         TESTER.assertRenderedPage(Types.class);
@@ -113,7 +113,7 @@ public class AnyTypesITCase extends AbstractTypesITCase {
         TESTER.clearFeedbackMessages();
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
     }
 
     @Test
@@ -140,7 +140,7 @@ public class AnyTypesITCase extends AbstractTypesITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         component = findComponentByProp(KEY, DATATABLE_PATH, name);
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
index f1eb67f..d6f72a1 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/BatchesITCase.java
@@ -165,7 +165,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
                 + "second:container:actions:actionRepeater:0:action:action",
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertLabel(TAB_PANEL + 
"outerObjectsRepeater:2:outer:form:content:status:"
@@ -220,7 +220,7 @@ public class BatchesITCase extends AbstractConsoleITCase {
                 + "second:container:actions:actionRepeater:1:action:action",
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertLabel(TAB_PANEL + 
"outerObjectsRepeater:2:outer:form:content:status:"
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/DisplayAttributesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/DisplayAttributesITCase.java
index 21cdfb6..66902e4 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/DisplayAttributesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/DisplayAttributesITCase.java
@@ -50,7 +50,7 @@ public class DisplayAttributesITCase extends 
AbstractConsoleITCase {
 
         
TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:"
                 + "3:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.clearFeedbackMessages();
     }
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
index df88ad5..d89eaff 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/GroupsITCase.java
@@ -107,7 +107,7 @@ public class GroupsITCase extends AbstractConsoleITCase {
         formTester.setValue("view:name:textField", group + "_clone");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.clickLink(TAB_PANEL + 
"outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
@@ -134,7 +134,7 @@ public class GroupsITCase extends AbstractConsoleITCase {
                 + 
"outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
                 + "actions:actions:actionRepeater:9:action:action"), 
Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -200,7 +200,7 @@ public class GroupsITCase extends AbstractConsoleITCase {
         assertNotNull(formTester);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertComponent(TAB_PANEL
@@ -223,7 +223,7 @@ public class GroupsITCase extends AbstractConsoleITCase {
                 + 
"outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
                 + "actions:actions:actionRepeater:9:action:action"), 
Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LogsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LogsITCase.java
index b164e28..5cf9eaa 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LogsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/LogsITCase.java
@@ -68,7 +68,7 @@ public class LogsITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(
                 result.getPageRelativePath() + 
":fields:1:field:dropDownChoiceField", Constants.ON_CHANGE);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
     }
 
     @Test
@@ -93,7 +93,7 @@ public class LogsITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(
                 result.getPageRelativePath() + 
":fields:1:field:dropDownChoiceField", Constants.ON_CHANGE);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
     }
 
     private Component searchLog(final String property, final String 
searchPath, final String key) {
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/NotificationsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/NotificationsITCase.java
index a402bf8..58e4c7d 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/NotificationsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/NotificationsITCase.java
@@ -102,7 +102,7 @@ public class NotificationsITCase extends 
AbstractConsoleITCase {
 
         TESTER.cleanupFeedbackMessages();
         formTester.submit("content:form:buttons:finish");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         
TESTER.clickLink("body:configurationLI:configurationUL:notificationsLI:notifications");
@@ -134,7 +134,7 @@ public class NotificationsITCase extends 
AbstractConsoleITCase {
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -165,7 +165,7 @@ public class NotificationsITCase extends 
AbstractConsoleITCase {
                 + 
"firstLevelContainer:first:outerObjectsRepeater:1:outer:container:content:togglePanelContainer:"
                 + "container:actions:actions:actionRepeater:3:action:action");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.clickLink("body:configurationLI:configurationUL:notificationsLI:notifications");
@@ -218,7 +218,7 @@ public class NotificationsITCase extends 
AbstractConsoleITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:2:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp("Subject", 
"body:content:tabbedPanel:panel:container:content:"
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
index c0fa456..589993a 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ParametersITCase.java
@@ -61,7 +61,7 @@ public class ParametersITCase extends AbstractConsoleITCase {
 
         
formTester.submit("content:parametersCreateWizardPanel:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         TESTER.assertRenderedPage(Parameters.class);
@@ -87,7 +87,7 @@ public class ParametersITCase extends AbstractConsoleITCase {
                              
         
formTester.submit("content:parametersCreateWizardPanel:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         TESTER.assertRenderedPage(Parameters.class);
@@ -110,7 +110,7 @@ public class ParametersITCase extends AbstractConsoleITCase 
{
 
         
formTester.submit("content:parametersCreateWizardPanel:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         Component result = findComponentByProp(SCHEMA, 
"body:content:parametersPanel", "deleteParam");
@@ -120,7 +120,7 @@ public class ParametersITCase extends AbstractConsoleITCase 
{
         
TESTER.clickLink("body:content:parametersPanel:outerObjectsRepeater:1:outer:container:content:"
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:1:action:action");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 }
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 0ebf086..178597f 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
@@ -59,7 +59,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -112,7 +112,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -158,7 +158,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit",
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -201,7 +201,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:3:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp("description", 
"body:content:tabbedPanel:panel:container:content:"
@@ -225,7 +225,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:3:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp("description", 
"body:content:tabbedPanel:panel:container:content:"
@@ -249,7 +249,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:3:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp("description", 
"body:content:tabbedPanel:panel:container:content:"
@@ -294,7 +294,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -342,7 +342,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -390,7 +390,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -431,7 +431,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -482,7 +482,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 + "outer:form:content:container:content:wizard:form");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.clickLink(
@@ -524,7 +524,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -579,7 +579,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 + "outer:form:content:container:content:wizard:form");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.clickLink(
@@ -615,7 +615,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -677,7 +677,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         closeCallBack(modal);
@@ -710,7 +710,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         
formTester.select("view:details:container:accountPolicy:dropDownChoiceField", 
0);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.executeAjaxEvent(
@@ -762,7 +762,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
         
formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:14:panel:textField",
 "[email protected]");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:"
@@ -787,7 +787,7 @@ public class PoliciesITCase extends AbstractConsoleITCase {
                 + 
"1:outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:8:"
                 + "action:action"), Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         component = findComponentByProp("username",
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
index 371e24d..58e09c7 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
@@ -56,7 +56,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
 
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.executeAjaxEvent("body:content:body:outerObjectsRepeater:0:outer:form:content:action:actionRepeater:"
@@ -75,7 +75,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:body:container:content:tabbedPanel:panel:actions:actions:actionRepeater:3:action:action");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.assertLabel("body:content:body:container:content:tabbedPanel:panel:container:accountPolicy:field-label",
@@ -94,7 +94,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
                 
"body:content:body:outerObjectsRepeater:0:outer:form:content:form");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.executeAjaxEvent("body:content:body:outerObjectsRepeater:0:outer:form:content:action:actionRepeater:"
@@ -124,7 +124,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
         formTester.setValue("view:username:textField", "'k' + firstname");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertLabel("body:content:realmChoicePanel:container:realm", 
"/odd");
@@ -147,7 +147,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
         formTester.setValue("view:username:textField", "");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -169,7 +169,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
 
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         // ----------------------------------
@@ -215,7 +215,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
 
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         // ----------------------------------
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RelationshipTypesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RelationshipTypesITCase.java
index 4e27563..c82eaed 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RelationshipTypesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RelationshipTypesITCase.java
@@ -82,7 +82,7 @@ public class RelationshipTypesITCase extends 
AbstractTypesITCase {
 
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
     }
 
     @Test
@@ -107,7 +107,7 @@ public class RelationshipTypesITCase extends 
AbstractTypesITCase {
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         result = findComponentByProp(KEY, DATATABLE_PATH, name);
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ReportsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ReportsITCase.java
index d5d199a..511a0df 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ReportsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/ReportsITCase.java
@@ -58,7 +58,7 @@ public class ReportsITCase extends AbstractConsoleITCase {
                 
"body:content:tabbedPanel:panel:firstLevelContainer:first:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.clickLink("body:reportsLI:reports");
@@ -83,7 +83,7 @@ public class ReportsITCase extends AbstractConsoleITCase {
                 + 
"container:content:togglePanelContainer:container:actions:actions:actionRepeater:5:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp(
@@ -150,7 +150,7 @@ public class ReportsITCase extends AbstractConsoleITCase {
                 
"body:content:tabbedPanel:panel:firstLevelContainer:first:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         delete("updateReport");
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RolesITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RolesITCase.java
index 054c78f..e7b3f1d 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RolesITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RolesITCase.java
@@ -62,7 +62,7 @@ public class RolesITCase extends AbstractConsoleITCase {
         formTester = 
TESTER.newFormTester("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.clickLink("body:configurationLI:configurationUL:securityLI:security");
@@ -123,7 +123,7 @@ public class RolesITCase extends AbstractConsoleITCase {
         formTester = 
TESTER.newFormTester("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -146,7 +146,7 @@ public class RolesITCase extends AbstractConsoleITCase {
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:togglePanelContainer:"
                 + "container:actions:actions:actionRepeater:4:action:action"), 
"onclick");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp(KEY, 
"body:content:tabbedPanel:panel:container:content:searchContainer:"
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java
index d5e4268..f10207e 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java
@@ -75,7 +75,7 @@ public class SchemasITCase extends AbstractTypesITCase {
                 + 
"accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         TESTER.assertRenderedPage(Types.class);
@@ -111,7 +111,7 @@ public class SchemasITCase extends AbstractTypesITCase {
                 + 
"accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
     }
 
     @Test
@@ -137,7 +137,7 @@ public class SchemasITCase extends AbstractTypesITCase {
                 + 
"accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");;
+        TESTER.assertInfoMessages("Operation successfully executed");;
 
         TESTER.cleanupFeedbackMessages();
 
@@ -163,7 +163,7 @@ public class SchemasITCase extends AbstractTypesITCase {
                 + 
"container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp(KEY, PLAIN_DATATABLE_PATH, schemaName));
@@ -199,7 +199,7 @@ public class SchemasITCase extends AbstractTypesITCase {
                 + 
"accordionPanel:tabs:2:body:content:outerObjectsRepeater:0:outer:form");
         formTester.submit("content:form:buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
         TESTER.assertRenderedPage(Types.class);
 
@@ -216,7 +216,7 @@ public class SchemasITCase extends AbstractTypesITCase {
                 + 
"container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
                 Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp(KEY, VIRTUAL_DATATABLE_PATH, 
"mynewvir"));
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SecurityQuestionsITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SecurityQuestionsITCase.java
index a63448d..09e3cbd 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SecurityQuestionsITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SecurityQuestionsITCase.java
@@ -56,7 +56,7 @@ public class SecurityQuestionsITCase extends 
AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.clickLink("body:configurationLI:configurationUL:securityLI:security");
@@ -105,7 +105,7 @@ public class SecurityQuestionsITCase extends 
AbstractConsoleITCase {
         TESTER.clickLink(
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -128,7 +128,7 @@ public class SecurityQuestionsITCase extends 
AbstractConsoleITCase {
                 
"body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
                 + 
"togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"),
 "onclick");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         assertNull(findComponentByProp("content",
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
index 2a4cce3..4eedba1 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
@@ -163,7 +163,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         // ajax event required to retrieve AjaxRequestTarget (used into finish 
custom event)
         TESTER.executeAjaxEvent(
                 
"body:toggle:outerObjectsRepeater:0:outer:form:content:form:buttons:finish", 
Constants.ON_CLICK);
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.cleanupFeedbackMessages();
         TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage");
@@ -223,7 +223,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         // ajax event required to retrieve AjaxRequestTarget (used into finish 
custom event)
         
TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
                 + "content:wizard:form:buttons:finish", Constants.ON_CLICK);
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.assertComponent(
                 
"body:toggle:outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", 
AjaxSubmitLink.class);
@@ -233,7 +233,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(
                 
"body:toggle:outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", 
Constants.ON_CLICK);
         TESTER.assertNoErrorMessage();
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         
TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
                 + "content:group:beans:0:fields:0", Constants.ON_CLICK);
@@ -261,7 +261,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         TESTER.getRequest().addParameter("confirm", "true");
         
TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:delete");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage");
@@ -287,7 +287,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
 
         
TESTER.clickLink("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
                 + 
"container:content:startAt:container:content:togglePanelContainer:startAtForm:startAt");
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         component = findComponentByProp("name", 
"body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
                 + 
"firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
@@ -427,7 +427,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
                 + 
"tasks:firstLevelContainer:first:container:content:wizard:form");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -491,7 +491,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         formTester.setValue("view:name:textField", "'k' + name");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         
TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
@@ -525,7 +525,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         formTester.setValue("view:name:textField", "");
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -539,7 +539,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
         TESTER.getRequest().addParameter("confirm", "true");
         
TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:reload");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 }
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 3187cfc..8c7eecb 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
@@ -77,7 +77,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         TESTER.clickLink(TAB_PANEL + 
"outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
                 + "actions:actions:actionRepeater:2:action:action");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
     }
 
     @Test
@@ -225,7 +225,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         assertNotNull(formTester);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
 
         TESTER.assertComponent(TAB_PANEL
                 + 
"outerObjectsRepeater:0:outer:form:content:customResultBody:resources:firstLevelContainer:first:"
@@ -290,7 +290,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         assertNotNull(formTester);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertComponent(TAB_PANEL
@@ -322,7 +322,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(
                 TAB_PANEL + 
"outerObjectsRepeater:0:outer:form:content:form:buttons:finish", 
Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 
@@ -397,7 +397,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         assertNotNull(formTester);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertComponent(TAB_PANEL
@@ -477,7 +477,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         assertNotNull(formTester);
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertComponent(TAB_PANEL
@@ -588,7 +588,7 @@ public class UsersITCase extends AbstractConsoleITCase {
 
         formTester.submit("buttons:finish");
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.assertComponent(TAB_PANEL
@@ -666,7 +666,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(
                 TAB_PANEL + 
"outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", 
Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
 
         TESTER.clickLink("body:realmsLI:realms");
@@ -691,7 +691,7 @@ public class UsersITCase extends AbstractConsoleITCase {
         TESTER.executeAjaxEvent(
                 TAB_PANEL + 
"outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", 
Constants.ON_CLICK);
 
-        TESTER.assertInfoMessages("Operation executed successfully");
+        TESTER.assertInfoMessages("Operation successfully executed");
         TESTER.cleanupFeedbackMessages();
     }
 }
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
index 09bedc7..5065622 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
@@ -25,23 +25,37 @@ import 
com.giffing.wicket.spring.boot.starter.configuration.extensions.core.sett
 import 
com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator.WicketEndpointRepositoryDefault;
 import java.util.Collections;
 import java.util.List;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeWebApplication;
 import org.apache.syncope.client.enduser.commons.PreviewUtils;
 import 
org.apache.syncope.client.enduser.init.ClassPathScanImplementationLookup;
 import org.apache.syncope.client.enduser.init.MIMETypesLoader;
 import org.apache.syncope.client.enduser.pages.Login;
+import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.common.rest.api.service.SyncopeService;
 import org.apache.syncope.fit.ui.AbstractUITCase;
 import org.apache.wicket.util.tester.FormTester;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.jupiter.api.BeforeAll;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
 import 
org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import 
org.apache.syncope.common.keymaster.client.self.SelfKeymasterClientContext;
+import org.apache.syncope.common.rest.api.service.UserService;
 
 public abstract class AbstractEnduserITCase extends AbstractUITCase {
 
+    protected static final String ENV_KEY_CONTENT_TYPE = "jaxrsContentType";
+
+    protected static SyncopeClientFactoryBean clientFactory;
+
+    protected static SyncopeClient adminClient;
+
+    protected static UserService userService;
+
+    @ImportAutoConfiguration(classes = { SelfKeymasterClientContext.class })
     @Configuration
     public static class SyncopeWebApplicationTestConfig {
 
@@ -105,6 +119,21 @@ public abstract class AbstractEnduserITCase extends 
AbstractUITCase {
         }
     }
 
+    @BeforeAll
+    public static void restSetup() {
+        clientFactory = new SyncopeClientFactoryBean().setAddress(ADDRESS);
+
+        String envContentType = System.getProperty(ENV_KEY_CONTENT_TYPE);
+        if (StringUtils.isNotBlank(envContentType)) {
+            clientFactory.setContentType(envContentType);
+        }
+        LOG.info("Performing IT with content type {}", 
clientFactory.getContentType().getMediaType());
+
+        adminClient = clientFactory.create(ADMIN_UNAME, ADMIN_PWD);
+
+        userService = adminClient.getService(UserService.class);
+    }
+
     protected void doLogin(final String user, final String passwd) {
         TESTER.startPage(Login.class);
         TESTER.assertRenderedPage(Login.class);
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/SelfRegistrationITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/SelfRegistrationITCase.java
index 8b1e4b8..07157a3 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/SelfRegistrationITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/SelfRegistrationITCase.java
@@ -18,34 +18,165 @@
  */
 package org.apache.syncope.fit.enduser;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.syncope.client.enduser.pages.Login;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.rest.api.beans.AnyQuery;
+import org.apache.wicket.extensions.markup.html.form.palette.component.Choices;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.TextField;
-import org.junit.jupiter.api.Disabled;
+import org.apache.wicket.util.tester.FormTester;
 import org.junit.jupiter.api.Test;
 
-@Disabled("WIP")
 public class SelfRegistrationITCase extends AbstractEnduserITCase {
 
+    private static final String WIZARD_FORM = "body:wizard:form";
+
     @Test
     public void selfCreate() {
+        String username = "testUser";
+
         TESTER.startPage(Login.class);
         TESTER.assertRenderedPage(Login.class);
 
         TESTER.clickLink("self-registration");
 
-        TESTER.assertComponent("body:wizard:form:username", TextField.class);
+        TESTER.assertComponent(WIZARD_FORM + ":view:username:textField", 
TextField.class);
+        FormTester formTester = TESTER.newFormTester(WIZARD_FORM);
+        assertNotNull(formTester);
+        formTester.setValue("view:username:textField", username);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        // check required field is correctly set
+        TESTER.assertNoInfoMessage();
+        TESTER.assertNoErrorMessage();
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:auxClasses:paletteField:choices", Choices.class);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:groupsContainer:groups:form:filter:textField", TextField.class);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:6:panel:textField",
+                TextField.class);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:12:panel:textField",
+                TextField.class);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:14:panel:textField",
+                TextField.class);
+
+        formTester = TESTER.newFormTester(WIZARD_FORM);
+        assertNotNull(formTester);
+        
formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:6:panel:textField",
+                "User fullname");
+        
formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:12:panel:textField",
+                "User surname");
+        
formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:14:panel:textField",
+                "[email protected]");
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        // check required fields were correctly set
+        TESTER.assertNoInfoMessage();
+        TESTER.assertNoErrorMessage();
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:derSchemas:tabs:0:body:content:schemas:0:panel:textField",
+                TextField.class);
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:virSchemas:tabs:0:body:content:schemas:0:panel:"
+                + "multiValueContainer:innerForm:content:field-label",
+                Label.class);
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:resources:paletteField:choices", Choices.class);
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:finish", 
Constants.ON_CLICK);
+
+        TESTER.assertRenderedPage(Login.class);
+        TESTER.assertComponent("login:username", TextField.class);
+
+        assertFalse(userService.search(new 
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                
fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo(username).query()).
+                build()).getResult().isEmpty());
+
+        TESTER.cleanupFeedbackMessages();
     }
 
     @Test
     public void selfPasswordReset() {
+        TESTER.startPage(Login.class);
+        TESTER.assertRenderedPage(Login.class);
+
+        TESTER.clickLink("self-pwd-reset");
     }
 
     @Test
     public void selfUpdate() {
-        doLogin(ADMIN_UNAME, ADMIN_PWD);
+        String username = "puccini";
+        String newEmail = "[email protected]";
+
+        TESTER.startPage(Login.class);
+        doLogin(username, "password");
+
+        TESTER.assertComponent(WIZARD_FORM + ":view:username:textField", 
TextField.class);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:auxClasses:paletteField:choices", Choices.class);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:groupsContainer:groups:form:filter:textField", TextField.class);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:6:panel:textField",
+                TextField.class);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:12:panel:textField",
+                TextField.class);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:14:panel:textField",
+                TextField.class);
+
+        FormTester formTester = TESTER.newFormTester(WIZARD_FORM);
+        assertNotNull(formTester);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:plainSchemas:tabs:0:body:content:schemas:4:panel:textField",
+                TextField.class);
+        
formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:4:panel:textField",
 newEmail);
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+
+        // check required fields were correctly set
+        TESTER.assertNoInfoMessage();
+        TESTER.assertNoErrorMessage();
+
+        TESTER.assertComponent(WIZARD_FORM + 
":view:derSchemas:tabs:0:body:content:schemas:0:panel:textField",
+                TextField.class);
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:virSchemas:tabs:0:body:content:schemas:0:panel:"
+                + "multiValueContainer:innerForm:content:field-label",
+                Label.class);
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:next", 
Constants.ON_CLICK);
+        TESTER.assertComponent(WIZARD_FORM + 
":view:resources:paletteField:choices", Choices.class);
+
+        TESTER.executeAjaxEvent(WIZARD_FORM + ":buttons:finish", 
Constants.ON_CLICK);
+
+        TESTER.assertRenderedPage(Login.class);
+        TESTER.assertComponent("login:username", TextField.class);
+
+        assertTrue(userService.search(new 
AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                
fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo(username).query()).
+                build()).getResult().stream().anyMatch(userTO -> {
+                    return 
userTO.getPlainAttr("email").get().getValues().get(0).equals(newEmail);
+                }));
+
+        TESTER.cleanupFeedbackMessages();
     }
 
     @Test
     public void mustChangePassword() {
+
     }
 }
diff --git a/fit/enduser-reference/src/test/resources/enduser.properties 
b/fit/enduser-reference/src/test/resources/enduser.properties
index affc0ed..97a84fc 100644
--- a/fit/enduser-reference/src/test/resources/enduser.properties
+++ b/fit/enduser-reference/src/test/resources/enduser.properties
@@ -21,5 +21,5 @@ anonymousKey=${anonymousKey}
 adminUser=${adminUser}
 useGZIPCompression=true
 
-captcha=true
+captcha=false
 xsrf=false

Reply via email to