You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2016/01/25 17:36:45 UTC

syncope git commit: [SYNCOPE-752] Added console tests for Types

Repository: syncope
Updated Branches:
  refs/heads/master d30415675 -> eb0411c84


[SYNCOPE-752] Added console tests for Types


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/eb0411c8
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/eb0411c8
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/eb0411c8

Branch: refs/heads/master
Commit: eb0411c8498aef8051e5d874c7b7fb3b529c963f
Parents: d304156
Author: Marco Di Sabatino Di Diodoro <md...@apache.org>
Authored: Mon Jan 25 17:36:28 2016 +0100
Committer: Marco Di Sabatino Di Diodoro <md...@apache.org>
Committed: Mon Jan 25 17:36:28 2016 +0100

----------------------------------------------------------------------
 .../fit/console/reference/AbstractITCase.java   |  33 +++-
 .../fit/console/reference/commons/TestPage.java |  88 +++++++++++
 .../html/form/AjaxPalettePanelITCase.java       |  59 +++++++
 .../markup/html/form/AjaxTextFieldITCase.java   |  88 +++++++++++
 .../console/reference/pages/TypesITCase.java    | 152 ++++++++++++++++++
 .../pages/types/AnyTypeClassesITCase.java       | 140 +++++++++++++++++
 .../reference/pages/types/AnyTypesITCase.java   | 140 +++++++++++++++++
 .../pages/types/RelationshipTypeITCase.java     | 125 +++++++++++++++
 .../reference/pages/types/SchemasITCase.java    | 157 +++++++++++++++++++
 9 files changed, 981 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
index 8dffed4..834adac 100644
--- a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
@@ -18,14 +18,20 @@
  */
 package org.apache.syncope.fit.console.reference;
 
+import java.lang.reflect.InvocationTargetException;
 import javax.servlet.ServletContext;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
 import org.apache.syncope.client.console.init.ClassPathScanImplementationLookup;
 import org.apache.syncope.client.console.init.ConsoleInitializer;
 import org.apache.syncope.client.console.init.MIMETypesLoader;
 import org.apache.syncope.client.console.pages.Login;
+import org.apache.wicket.Component;
+import org.apache.wicket.core.util.lang.PropertyResolver;
+import org.apache.wicket.markup.repeater.OddEvenItem;
 import org.apache.wicket.util.tester.FormTester;
 import org.apache.wicket.util.tester.WicketTester;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
 import org.junit.Before;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +43,8 @@ public abstract class AbstractITCase {
     public static final String ADMIN = "admin";
 
     public static final String PASSWORD = "password";
+    
+    public static final String KEY = "key";
 
     protected WicketTester wicketTester;
 
@@ -69,9 +77,32 @@ public abstract class AbstractITCase {
         wicketTester.startPage(Login.class);
         wicketTester.assertRenderedPage(Login.class);
 
-        final FormTester formTester = wicketTester.newFormTester("login");
+        FormTester formTester = wicketTester.newFormTester("login");
         formTester.setValue("username", user);
         formTester.setValue("password", passwd);
         formTester.submit("submit");
     }
+
+    protected Component findComponentByProp(final String property, final String searchPath, final String key) {
+        Component component =
+                wicketTester.getComponentFromLastRenderedPage(searchPath);
+
+        Component result = component.getPage().
+                visitChildren(OddEvenItem.class, new IVisitor<OddEvenItem<?>, Component>() {
+
+                    @Override
+                    public void component(final OddEvenItem<?> object, final IVisit<Component> visit) {
+                        
+                        try {
+                            if (PropertyResolver.getPropertyGetter(
+                                    property, object.getModelObject()).invoke(object.getModelObject()).equals(key)) {
+                                visit.stop(object);
+                            }
+                        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
+                            LOG.error("Error invoke method", ex);
+                        }
+                    }
+                });
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/commons/TestPage.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/commons/TestPage.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/commons/TestPage.java
new file mode 100644
index 0000000..cb1bba2
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/commons/TestPage.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.commons;
+
+import java.io.Serializable;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+
+public class TestPage<T extends Serializable, S extends Panel> extends WebPage implements
+        IMarkupResourceStreamProvider {
+
+    private static final long serialVersionUID = 483736530078975170L;
+
+    public static String FIELD = "field";
+
+    private final Form<T> form;
+
+    private final S fieldPanel;
+
+    private TestPage(S field, final Builder<T, S> builder) {
+
+        this.form = builder.form;
+        this.fieldPanel = field;
+        
+        field.setOutputMarkupId(builder.outputMarkupId);
+        add(form);
+        form.add(field);
+    }
+
+    public Form<T> getForm() {
+        return form;
+    }
+
+    public S getFieldPanel() {
+        return fieldPanel;
+    }
+
+    public static class Builder<T extends Serializable, S extends Panel> implements Serializable {
+
+        private static final long serialVersionUID = 4882978420728876617L;
+
+        private final Form<T> form;
+
+        private boolean outputMarkupId;
+
+        public Builder() {
+            this.form = new Form<>("form");
+
+        }
+
+        public Builder<T, S> setOutputMarkupId(final boolean outputMarkupId) {
+            this.outputMarkupId = outputMarkupId;
+            return this;
+        }
+
+        public TestPage<T, S> build(final S field) {
+            return new TestPage<>(field, this);
+        }
+    }
+
+    @Override
+    public IResourceStream getMarkupResourceStream(final MarkupContainer container,
+            final Class<?> containerClass) {
+        return new StringResourceStream("<html><body>"
+                + "<form wicket:id=\"form\"><span wicket:id=\"field\"></span></form></body></html>");
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxPalettePanelITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxPalettePanelITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxPalettePanelITCase.java
new file mode 100644
index 0000000..56f7fd6
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxPalettePanelITCase.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.markup.html.form;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.fit.console.reference.AbstractITCase;
+import org.apache.syncope.fit.console.reference.commons.TestPage;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.util.ListModel;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class AjaxPalettePanelITCase extends AbstractITCase {
+
+    private static final IModel<List<String>> SELECTED = new ListModel<>(new ArrayList<>(Arrays.asList("A", "D")));
+
+    private static final ListModel<String> ALL = new ListModel<>(new ArrayList<>(Arrays.asList("A", "B", "C", "D")));
+
+    @Test
+    public void isRendered() {
+        TestPage<String, AjaxPalettePanel<String>> testPage =
+                new TestPage.Builder<String, AjaxPalettePanel<String>>().build(
+                        new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build(
+                        TestPage.FIELD, SELECTED, ALL));
+        wicketTester.startPage(testPage);
+
+        FormTester formTester = wicketTester.newFormTester(testPage.getForm().getId());
+        formTester.submit();
+
+        Collection<String> list = testPage.getFieldPanel().getModelCollection();
+        assertEquals(2, list.size());
+        Iterator<String> iterator = list.iterator();
+        assertEquals("A", iterator.next());
+        assertEquals("D", iterator.next());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxTextFieldITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxTextFieldITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxTextFieldITCase.java
new file mode 100644
index 0000000..db7ee8d
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/markup/html/form/AjaxTextFieldITCase.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.markup.html.form;
+
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.fit.console.reference.AbstractITCase;
+import org.apache.wicket.util.string.Strings;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.validation.validator.StringValidator;
+import org.junit.Test;
+import org.apache.syncope.fit.console.reference.commons.TestPage;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class AjaxTextFieldITCase extends AbstractITCase {
+
+    private final IModel<String> textModel = Model.of((String) null);
+
+    @Test
+    public void emptyInputConvertedToNull() {
+        TestPage<String, AjaxTextFieldPanel> testPage =
+                new TestPage.Builder<String, AjaxTextFieldPanel>().build(
+                        new AjaxTextFieldPanel(TestPage.FIELD, TestPage.FIELD, textModel));
+        wicketTester.startPage(testPage);
+        FormTester formTester = wicketTester.newFormTester(testPage.getForm().getId());
+        formTester.setValue("field:textField", "");
+        formTester.submit();
+        assertEquals(null, testPage.getFieldPanel().getField().getDefaultModelObject());
+    }
+
+    @Test
+    public void valueAttribute() {
+        TestPage<String, AjaxTextFieldPanel> testPage =
+                new TestPage.Builder<String, AjaxTextFieldPanel>().build(
+                        new AjaxTextFieldPanel(TestPage.FIELD, TestPage.FIELD, textModel));
+        String text = "sometext";
+        textModel.setObject(text);
+        wicketTester.startPage(testPage);
+        assertTrue(wicketTester.getLastResponseAsString().contains(Strings.escapeMarkup(text)));
+    }
+
+    @Test
+    public void nullIsNotValidated() {
+        TestPage<String, AjaxTextFieldPanel> testPage =
+                new TestPage.Builder<String, AjaxTextFieldPanel>().build(
+                        new AjaxTextFieldPanel(TestPage.FIELD, TestPage.FIELD, textModel));
+        testPage.getFieldPanel().getField().setRequired(false);
+        testPage.getFieldPanel().getField().add(StringValidator.minimumLength(2));
+        wicketTester.startPage(testPage);
+        FormTester formTester = wicketTester.newFormTester(testPage.getForm().getId());
+        formTester.setValue("field:textField", "");
+        formTester.submit();
+        assertEquals(null, testPage.getFieldPanel().getDefaultModelObject());
+        assertTrue(testPage.getFieldPanel().getField().isValid());
+    }
+
+    @Test
+    public void requiredAttribute() {
+        TestPage<String, AjaxTextFieldPanel> testPage =
+                new TestPage.Builder<String, AjaxTextFieldPanel>().build(
+                        new AjaxTextFieldPanel(TestPage.FIELD, TestPage.FIELD, textModel));
+        testPage.getFieldPanel().setOutputMarkupId(true);
+        testPage.getFieldPanel().getField().setRequired(true);
+        wicketTester.startPage(testPage);
+        wicketTester.assertLabel("form:field:field-label", "field");
+        wicketTester.assertVisible("form:field:required");
+        wicketTester.assertVisible("form:field:externalAction");
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/TypesITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/TypesITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/TypesITCase.java
new file mode 100644
index 0000000..7a5c63d
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/TypesITCase.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.pages;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.syncope.client.console.pages.Types;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
+import org.apache.syncope.fit.console.reference.AbstractITCase;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Before;
+
+public class TypesITCase extends AbstractITCase {
+
+    protected static final String PLAIN_DATATABLE_PATH = "content:tabbedPanel:panel:"
+            + "collapsePanel:tabs:0:body:content:searchContainer:resultTable";
+
+    protected static final String DATATABLE_PATH =
+            "content:tabbedPanel:panel:searchContainer:resultTable";
+
+    @Before
+    public void login() {
+        doLogin(ADMIN, PASSWORD);
+    }
+
+    protected void browsingToRelationshipType() {
+
+        wicketTester.clickLink("configurationLI:configurationUL:typesLI:types");
+        wicketTester.assertRenderedPage(Types.class);
+
+        wicketTester.clickLink("content:tabbedPanel:tabs-container:tabs:0:link");
+        wicketTester.assertComponent(DATATABLE_PATH + ":tablePanel:groupForm:checkgroup:dataTable",
+                AjaxFallbackDataTable.class);
+    }
+
+    protected void browsingToAnyTypes() {
+
+        wicketTester.clickLink("configurationLI:configurationUL:typesLI:types");
+        wicketTester.assertRenderedPage(Types.class);
+
+        wicketTester.clickLink("content:tabbedPanel:tabs-container:tabs:1:link");
+        wicketTester.assertComponent(DATATABLE_PATH + ":tablePanel:groupForm:checkgroup:dataTable",
+                AjaxFallbackDataTable.class);
+    }
+
+    protected void browsingToAnyTypeClasses() {
+
+        wicketTester.clickLink("configurationLI:configurationUL:typesLI:types");
+        wicketTester.assertRenderedPage(Types.class);
+
+        wicketTester.clickLink("content:tabbedPanel:tabs-container:tabs:2:link");
+        wicketTester.assertComponent(DATATABLE_PATH + ":tablePanel:groupForm:checkgroup:dataTable",
+                AjaxFallbackDataTable.class);
+    }
+
+    protected void browsingToPlainSchemas() {
+
+        wicketTester.clickLink("configurationLI:configurationUL:typesLI:types");
+        wicketTester.assertRenderedPage(Types.class);
+
+        wicketTester.clickLink("content:tabbedPanel:tabs-container:tabs:3:link");
+        wicketTester.assertComponent(PLAIN_DATATABLE_PATH + ":tablePanel:groupForm:checkgroup:dataTable",
+                AjaxFallbackDataTable.class);
+    }
+
+    protected void createPlainSchema(final String key) {
+        browsingToPlainSchemas();
+        wicketTester.clickLink("content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:container:content:add");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:form");
+        formTester.setValue("content:details:form:key:textField", key);
+        formTester.setValue("content:details:form:type:dropDownChoiceField", "3");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:dialog:footer:inputs:0:submit");
+
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.cleanupFeedbackMessages();
+    }
+
+    protected void createAnyTypeClassWithoutSchema(final String name) {
+        browsingToAnyTypeClasses();
+
+        wicketTester.clickLink("content:tabbedPanel:panel:container:content:add");
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue("content:anyTypeClassDetailsPanel:form:key:textField", name);
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.clearFeedbackMessages();
+    }
+
+    protected void createAnyType(final String name) {
+        browsingToAnyTypes();
+
+        wicketTester.clickLink("content:tabbedPanel:panel:container:content:add");
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue("content:anyTypeDetailsPanel:container:form:key:textField", name);
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.clearFeedbackMessages();
+    }
+
+    protected void createRelationshipType(final String name) {
+        browsingToRelationshipType();
+
+        wicketTester.clickLink("content:tabbedPanel:panel:container:content:add");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue("content:relationshipTypeDetails:container:form:key:textField", name);
+        formTester.setValue(
+                "content:relationshipTypeDetails:container:form:description:textField", "test relationshipType");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.clearFeedbackMessages();
+        wicketTester.assertRenderedPage(Types.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypeClassesITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypeClassesITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypeClassesITCase.java
new file mode 100644
index 0000000..3f6b391
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypeClassesITCase.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.pages.types;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.syncope.client.console.pages.Types;
+import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.IndicatingOnConfirmAjaxLink;
+import org.apache.syncope.fit.console.reference.pages.TypesITCase;
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class AnyTypeClassesITCase extends TypesITCase {
+
+    @Test
+    public void read() {
+        browsingToAnyTypeClasses();
+        
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, "csv");
+        wicketTester.assertLabel(
+                result.getPageRelativePath() + ":cells:1:cell", "csv");
+
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:6:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                result.getPageRelativePath() + ":cells:6:cell:panelEdit:editLink");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", BaseModal.class);
+    }
+
+    @Test
+    public void create() {
+        browsingToAnyTypeClasses();
+        final String anyTypeClassTest = "anyTypeClassTest";
+
+        wicketTester.clickLink("content:tabbedPanel:panel:container:content:add");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue("content:anyTypeClassDetailsPanel:form:key:textField", anyTypeClassTest);
+        formTester.setValue(
+                "content:anyTypeClassDetailsPanel:form:container:derSchemas:paletteField:recorder", "mderiveddata");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.clearFeedbackMessages();
+        wicketTester.assertRenderedPage(Types.class);
+
+        wicketTester.clickLink("content:tabbedPanel:tabs-container:tabs:2:link");
+        wicketTester.assertComponent(DATATABLE_PATH + ":tablePanel:groupForm:checkgroup:dataTable",
+                AjaxFallbackDataTable.class);
+
+        wicketTester.assertComponent(DATATABLE_PATH, AjaxDataTablePanel.class);
+
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, anyTypeClassTest);
+
+        wicketTester.assertLabel(result.getPageRelativePath() + ":cells:4:cell", "[mderiveddata]");
+    }
+
+    @Test
+    public void update() {
+        final String plainSchema = "anyPlainSchema";
+        createPlainSchema(plainSchema);
+        browsingToAnyTypeClasses();
+
+        wicketTester.assertComponent(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:"
+                + "body:rows:1:cells:6:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:body:rows:1:cells:6:cell:panelEdit:editLink");
+
+        final FormTester formTester =
+                wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue(
+                "content:anyTypeClassDetailsPanel:form:container:plainSchemas:paletteField:recorder", plainSchema);
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+    }
+
+    @Test
+    public void delete() {
+        final String anyTypeClassName = "zStringDelete";
+        createAnyTypeClassWithoutSchema(anyTypeClassName);
+        browsingToAnyTypeClasses();
+        wicketTester.assertComponent(DATATABLE_PATH, AjaxDataTablePanel.class);
+        
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, anyTypeClassName);
+
+        assertNotNull(result);
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:6:cell:panelDelete:deleteLink",
+                IndicatingOnConfirmAjaxLink.class);
+
+        wicketTester.getRequest().addParameter("confirm", "true");
+        wicketTester.clickLink(
+                wicketTester.getComponentFromLastRenderedPage(
+                        result.getPageRelativePath() + ":cells:6:cell:panelDelete:deleteLink"));
+
+        wicketTester.executeAjaxEvent(wicketTester.getComponentFromLastRenderedPage(
+                result.getPageRelativePath() + ":cells:6:cell:panelDelete:deleteLink"), "click");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.cleanupFeedbackMessages();
+        result = findComponentByProp(KEY, DATATABLE_PATH, anyTypeClassName);
+
+        assertNull(result);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypesITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypesITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypesITCase.java
new file mode 100644
index 0000000..cf77fd6
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/AnyTypesITCase.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.pages.types;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.syncope.client.console.pages.Types;
+import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.IndicatingOnConfirmAjaxLink;
+import org.apache.syncope.fit.console.reference.pages.TypesITCase;
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class AnyTypesITCase extends TypesITCase {
+
+    @Test
+    public void read() {
+        browsingToAnyTypes();
+        wicketTester.assertComponent(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:"
+                + "checkgroup:dataTable:body:rows:1:cells:1:cell", Label.class);
+
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, "GROUP");
+
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:4:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                result.getPageRelativePath() + ":cells:4:cell:panelEdit:editLink");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", BaseModal.class);
+    }
+
+    @Test
+    public void create() {
+        browsingToAnyTypes();
+        final String anyTypeTest = "anyTypeTest2";
+
+        wicketTester.clickLink("content:tabbedPanel:panel:container:content:add");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue("content:anyTypeDetailsPanel:container:form:key:textField", anyTypeTest);
+        formTester.setValue(
+                "content:anyTypeDetailsPanel:container:form:classes:paletteField:recorder", "csv");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.clearFeedbackMessages();
+        wicketTester.assertRenderedPage(Types.class);
+
+        wicketTester.clickLink("content:tabbedPanel:tabs-container:tabs:1:link");
+        wicketTester.assertComponent(DATATABLE_PATH, AjaxDataTablePanel.class);
+
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, anyTypeTest);
+
+        wicketTester.assertLabel(result.getPageRelativePath() + ":cells:1:cell", anyTypeTest);
+        wicketTester.assertLabel(result.getPageRelativePath() + ":cells:3:cell", "[csv]");
+    }
+
+    @Test
+    public void update() {
+        final String name = "anyTypeClassUpdate";
+        createAnyTypeClassWithoutSchema(name);
+        browsingToAnyTypes();
+
+        wicketTester.assertComponent(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:"
+                + "body:rows:1:cells:4:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:body:rows:1:cells:4:cell:panelEdit:editLink");
+
+        final FormTester formTester =
+                wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue(
+                "content:anyTypeDetailsPanel:container:form:classes:paletteField:recorder", name);
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+    }
+
+    @Test
+    public void delete() {
+        final String name = "anyTypeDelete";
+        createAnyType(name);
+        browsingToAnyTypes();
+        
+        wicketTester.assertComponent(DATATABLE_PATH, AjaxDataTablePanel.class);
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, name);
+
+        assertNotNull(result);
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:4:cell:panelDelete:deleteLink",
+                IndicatingOnConfirmAjaxLink.class);
+
+        wicketTester.getRequest().addParameter("confirm", "true");
+        wicketTester.clickLink(
+                wicketTester.getComponentFromLastRenderedPage(
+                        result.getPageRelativePath() + ":cells:4:cell:panelDelete:deleteLink"));
+
+        wicketTester.executeAjaxEvent(wicketTester.getComponentFromLastRenderedPage(
+                result.getPageRelativePath() + ":cells:4:cell:panelDelete:deleteLink"), "onclick");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.cleanupFeedbackMessages();
+        result = findComponentByProp(KEY, DATATABLE_PATH, name);
+
+        assertNull(result);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/RelationshipTypeITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/RelationshipTypeITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/RelationshipTypeITCase.java
new file mode 100644
index 0000000..b7f63ad
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/RelationshipTypeITCase.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.pages.types;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.IndicatingOnConfirmAjaxLink;
+import org.apache.syncope.fit.console.reference.pages.TypesITCase;
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class RelationshipTypeITCase extends TypesITCase {
+
+    @Test
+    public void read() {
+        browsingToRelationshipType();
+
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, "inclusion");
+
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:1:cell", Label.class);
+
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:3:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                result.getPageRelativePath() + ":cells:3:cell:panelEdit:editLink");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:modal", BaseModal.class);
+    }
+
+    @Test
+    public void create() {
+        final String name = "relationshipTypeTest";
+        createRelationshipType(name);
+        browsingToRelationshipType();
+
+        wicketTester.assertComponent(DATATABLE_PATH, AjaxDataTablePanel.class);
+
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, name);
+
+        wicketTester.assertLabel(result.getPageRelativePath() + ":cells:1:cell", name);
+        wicketTester.assertLabel(result.getPageRelativePath() + ":cells:2:cell", "test relationshipType");
+    }
+
+    @Test
+    public void update() {
+        final String name = "relationshipTypeUpdate";
+        createRelationshipType(name);
+        browsingToRelationshipType();
+
+        wicketTester.assertComponent(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:"
+                + "body:rows:1:cells:3:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:body:rows:1:cells:3:cell:panelEdit:editLink");
+
+        final FormTester formTester =
+                wicketTester.newFormTester("content:tabbedPanel:panel:modal:form");
+        formTester.setValue(
+                "content:relationshipTypeDetails:container:form:description:textField", "new description");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:modal:dialog:footer:inputs:0:submit");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+    }
+
+    @Test
+    public void delete() {
+        final String name = "relationshipTypeDelete";
+        createRelationshipType(name);
+        browsingToRelationshipType();
+
+        wicketTester.assertComponent(DATATABLE_PATH, AjaxDataTablePanel.class);
+
+        Component result = findComponentByProp(KEY, DATATABLE_PATH, name);
+
+        assertNotNull(result);
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:3:cell:panelDelete:deleteLink",
+                IndicatingOnConfirmAjaxLink.class);
+
+        wicketTester.getRequest().addParameter("confirm", "true");
+        wicketTester.clickLink(
+                wicketTester.getComponentFromLastRenderedPage(
+                        result.getPageRelativePath() + ":cells:3:cell:panelDelete:deleteLink"));
+
+        wicketTester.executeAjaxEvent(wicketTester.getComponentFromLastRenderedPage(
+                result.getPageRelativePath() + ":cells:3:cell:panelDelete:deleteLink"), "onclick");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.cleanupFeedbackMessages();
+        result = findComponentByProp(KEY, DATATABLE_PATH, name);
+
+        assertNull(result);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eb0411c8/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/SchemasITCase.java
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/SchemasITCase.java b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/SchemasITCase.java
new file mode 100644
index 0000000..fd041eb
--- /dev/null
+++ b/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/pages/types/SchemasITCase.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.fit.console.reference.pages.types;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.syncope.client.console.pages.Types;
+import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.IndicatingOnConfirmAjaxLink;
+import org.apache.syncope.fit.console.reference.pages.TypesITCase;
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.util.tester.FormTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNull;
+
+public class SchemasITCase extends TypesITCase {
+
+    @Test
+    public void readPlainSchema() {
+        browsingToPlainSchemas();
+        wicketTester.assertLabel(
+                PLAIN_DATATABLE_PATH
+                + ":tablePanel:groupForm:"
+                + "checkgroup:dataTable:body:rows:1:cells:1:cell", "aLong");
+
+        wicketTester.assertComponent(
+                PLAIN_DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:"
+                + "body:rows:1:cells:7:cell:panelEdit:editLink", IndicatingAjaxLink.class);
+
+        wicketTester.clickLink(
+                PLAIN_DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:dataTable:"
+                + "body:rows:1:cells:7:cell:panelEdit:editLink");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:"
+                + "panel:collapsePanel:tabs:0:body:content:modal:"
+                + "form:content:kindForm:kind:dropDownChoiceField", DropDownChoice.class);
+    }
+
+    @Test
+    public void createPlainSchema() {
+        browsingToPlainSchemas();
+        wicketTester.clickLink("content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:container:content:add");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:form");
+        formTester.setValue("content:details:form:key:textField", "zBoolean");
+        formTester.setValue("content:details:form:type:dropDownChoiceField", "3");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:dialog:footer:inputs:0:submit");
+
+        wicketTester.assertInfoMessages("Operation executed successfully");
+
+        wicketTester.cleanupFeedbackMessages();
+        wicketTester.assertRenderedPage(Types.class);
+    }
+
+    @Test
+    public void updatePlainSchema() {
+        browsingToPlainSchemas();
+        
+        Component result = findComponentByProp(KEY, PLAIN_DATATABLE_PATH, "firstname");
+        
+        wicketTester.assertLabel(
+                result.getPageRelativePath() + ":cells:1:cell", "firstname");
+
+        wicketTester.clickLink(
+                result.getPageRelativePath() + ":cells:7:cell:panelEdit:editLink");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:"
+                + "panel:collapsePanel:tabs:0:body:content:modal:"
+                + "form:content:kindForm:kind:dropDownChoiceField", DropDownChoice.class);
+
+        final FormTester formTester =
+                wicketTester.newFormTester("content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:modal:form");
+        formTester.setValue("content:details:form:multivalue:checkboxField", "true");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:dialog:footer:inputs:0:submit", true);
+
+        wicketTester.assertInfoMessages("Operation executed successfully");
+    }
+
+    @Test
+    public void deletePlainSchema() {
+        browsingToPlainSchemas();
+        //create new Plain Schema
+        final String schemaName = "zStringDelete";
+        wicketTester.clickLink("content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:container:content:add");
+
+        wicketTester.assertComponent(
+                "content:tabbedPanel:panel:collapsePanel:tabs:0:body:content:modal", Modal.class);
+
+        final FormTester formTester = wicketTester.newFormTester("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:form");
+        formTester.setValue("content:details:form:key:textField", schemaName);
+        formTester.setValue("content:details:form:type:dropDownChoiceField", "0");
+
+        wicketTester.clickLink("content:tabbedPanel:panel:"
+                + "collapsePanel:tabs:0:body:content:modal:dialog:footer:inputs:0:submit");
+
+        wicketTester.assertInfoMessages("Operation executed successfully");;
+
+        wicketTester.cleanupFeedbackMessages();
+
+        //delete plain schema
+        wicketTester.clickLink(
+                PLAIN_DATATABLE_PATH
+                + ":tablePanel:groupForm:checkgroup:"
+                + "dataTable:topToolbars:toolbars:1:span:navigator:last");
+
+        wicketTester.assertComponent(PLAIN_DATATABLE_PATH, AjaxDataTablePanel.class);
+
+        Component result = findComponentByProp(KEY, PLAIN_DATATABLE_PATH, schemaName);
+
+        wicketTester.assertComponent(
+                result.getPageRelativePath() + ":cells:7:cell:panelDelete:deleteLink",
+                IndicatingOnConfirmAjaxLink.class);
+
+        wicketTester.getRequest().addParameter("confirm", "true");
+        wicketTester.clickLink(
+                wicketTester.getComponentFromLastRenderedPage(
+                        result.getPageRelativePath() + ":cells:7:cell:panelDelete:deleteLink"));
+
+        wicketTester.executeAjaxEvent(wicketTester.getComponentFromLastRenderedPage(
+                result.getPageRelativePath() + ":cells:7:cell:panelDelete:deleteLink"), "onclick");
+        wicketTester.assertInfoMessages("Operation executed successfully");
+        wicketTester.cleanupFeedbackMessages();
+
+        assertNull(findComponentByProp(KEY, PLAIN_DATATABLE_PATH, schemaName));
+    }
+}