/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed 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 com.alibaba.citrus.service.form.configuration; import static com.alibaba.citrus.test.TestUtil.*; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.List; import com.alibaba.citrus.service.configuration.support.PropertyEditorRegistrarsSupport; import com.alibaba.citrus.service.form.FormService; import com.alibaba.citrus.service.form.configuration.FormConfig.FieldKeyFormat; import com.alibaba.citrus.service.form.impl.MyPropertyEditorRegistrar; import com.alibaba.citrus.service.form.impl.configuration.FieldConfigImpl; import com.alibaba.citrus.service.form.impl.configuration.FormConfigImpl; import com.alibaba.citrus.service.form.impl.configuration.GroupConfigImpl; import com.alibaba.citrus.service.form.impl.configuration.GroupConfigImpl.ImportImpl; import org.junit.Before; import org.junit.Test; import org.springframework.beans.PropertyEditorRegistrar; import org.springframework.beans.SimpleTypeConverter; public class FormConfigTests extends AbstractConfigTests { private FormConfigImpl formConfig; private GroupConfigImpl group1; private GroupConfigImpl group2; private GroupConfigImpl group3; private GroupConfigImpl group4; @Before public void init() { formConfig = new FormConfigImpl(); group1 = new GroupConfigImpl(); group1.setName("grOUp1"); group1.setFieldConfigImplList(createFieldList(createField("field1"))); group2 = new GroupConfigImpl(); group2.setName("group2"); group2.setFieldConfigImplList(createFieldList(createField("field2"))); group3 = new GroupConfigImpl(); group3.setName("GROUP3"); group3.setFieldConfigImplList(createFieldList(createField("field3"))); group4 = new GroupConfigImpl(); group4.setName("group4"); group4.setFieldConfigImplList(createFieldList(createField("field4"), createField("field4.2"))); } private FieldConfigImpl createField(String fieldName) { FieldConfigImpl field = new FieldConfigImpl(); field.setName(fieldName); return field; } private void initForm(List<GroupConfigImpl> groupList) throws Exception { formConfig.setGroupConfigImplList(groupList); formConfig.afterPropertiesSet(); } private PropertyEditorRegistrarsSupport getRegisrarsSupport() { return (PropertyEditorRegistrarsSupport) formConfig.getPropertyEditorRegistrar(); } @Test public void getFormService() { // default assertNull(formConfig.getFormService()); // set null try { formConfig.setFormService(null); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("formService")); } // not null FormService formService = createMock(FormService.class); formConfig.setFormService(formService); assertSame(formService, formConfig.getFormService()); } @Test public void isPostOnlyByDefault() { // default value assertTrue(formConfig.isPostOnlyByDefault()); // set value formConfig.setPostOnlyByDefault(false); assertFalse(formConfig.isPostOnlyByDefault()); } @Test public void getFieldKeyFormat() { // default value assertSame(FieldKeyFormat.compressed, formConfig.getFieldKeyFormat()); // set value formConfig.setFieldKeyFormat(FieldKeyFormat.uncompressed); assertSame(FieldKeyFormat.uncompressed, formConfig.getFieldKeyFormat()); } @Test public void getGroupConfigList() throws Exception { // default is empty assertTrue(formConfig.getGroupConfigList().isEmpty()); // group name is null try { initForm(createGroupList(new GroupConfigImpl())); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("name")); } // set groups initForm(createGroupList(group1, group2, group3)); assertEquals(3, formConfig.getGroupConfigList().size()); assertArrayEquals(new Object[] { group1, group2, group3 }, formConfig.getGroupConfigList().toArray()); // set null try { initForm(null); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("no groups")); } // unmodifiable try { formConfig.getGroupConfigList().clear(); fail(); } catch (UnsupportedOperationException e) { } // set duplicated groups try { initForm(createGroupList(group1, group2, group1)); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("Duplicated group name: grOUp1")); } } @Test public void getGroupConfig() throws Exception { // not init assertNull(null, formConfig.getGroupConfig("test")); // init initForm(createGroupList(group1, group2, group3)); // case insensitive assertSame(group1, formConfig.getGroupConfig("GROUP1")); assertSame(group2, formConfig.getGroupConfig("group2")); assertSame(group3, formConfig.getGroupConfig("grOUP3")); } @Test public void getGroupConfigByKey() throws Exception { // not init try { formConfig.getGroupConfigByKey("test"); fail(); } catch (IllegalStateException e) { assertThat(e, exception("groupsByKey not inited")); } // init initForm(createGroupList(group1, group2, group3)); // case insensitive assertSame(group1, formConfig.getGroupConfigByKey("g")); assertSame(group2, formConfig.getGroupConfigByKey("gr")); assertSame(group3, formConfig.getGroupConfigByKey("gro")); } @Test public void getPropertyEditorRegistrars() { // default is empty assertEquals(0, getRegisrarsSupport().size()); // set PropertyEditorRegistrar r1 = createMock(PropertyEditorRegistrar.class); PropertyEditorRegistrar r2 = createMock(PropertyEditorRegistrar.class); formConfig.setPropertyEditorRegistrars(new PropertyEditorRegistrar[] { r1, r2 }); assertArrayEquals(new PropertyEditorRegistrar[] { r1, r2 }, getRegisrarsSupport().getPropertyEditorRegistrars()); // set null/empty formConfig.setPropertyEditorRegistrars(null); assertArrayEquals(new PropertyEditorRegistrar[0], getRegisrarsSupport().getPropertyEditorRegistrars()); formConfig.setPropertyEditorRegistrars(new PropertyEditorRegistrar[0]); assertArrayEquals(new PropertyEditorRegistrar[0], getRegisrarsSupport().getPropertyEditorRegistrars()); } @Test public void registerCustomEditors() { PropertyEditorRegistrar registrar = new MyPropertyEditorRegistrar(); formConfig.setPropertyEditorRegistrars(new PropertyEditorRegistrar[] { registrar }); SimpleTypeConverter registry = new SimpleTypeConverter(); formConfig.getPropertyEditorRegistrar().registerCustomEditors(registry); assertEquals(new Integer(123), registry.convertIfNecessary("anything", Integer.class)); } @Test public void initFormConfig() throws Exception { // no groups try { initForm(null); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("no groups")); } initForm(createGroupList(group1, group2, group3)); // group.getFormConfig() assertSame(formConfig, group1.getFormConfig()); assertSame(formConfig, group2.getFormConfig()); assertSame(formConfig, group3.getFormConfig()); // group keys assertEquals("g", group1.getKey()); assertEquals("gr", group2.getKey()); assertEquals("gro", group3.getKey()); } @Test public void extendGroup_extend_notFound() throws Exception { group1.setParentGroup("group2"); group2.setParentGroup("group3"); try { initForm(createGroupList(group1, group2)); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("Parent or imported group name \"group3\" not found")); } } @Test public void extendGroup_import_notFound() throws Exception { group1.setParentGroup("group2"); group2.setImports(createImportList(new ImportImpl("group3", null))); try { initForm(createGroupList(group1, group2)); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("Parent or imported group name \"group3\" not found")); } } @Test public void extendGroup_extends_cycle() throws Exception { group1.setParentGroup("group2"); group2.setParentGroup("group3"); group3.setParentGroup("group1"); try { initForm(createGroupList(group1, group2, group3)); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("Cycle detected: grOUp1 -> group2 -> GROUP3 -> grOUp1")); } } @Test public void extendGroup_import_cycle() throws Exception { group1.setParentGroup("group2"); group2.setParentGroup("group3"); group3.setImports(createImportList(new ImportImpl("group1", null))); try { initForm(createGroupList(group1, group2, group3)); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("Cycle detected: grOUp1 -> group2 -> GROUP3 -> grOUp1")); } } @Test public void extendAndImportGroup() throws Exception { // group1 -> group2 group1.setParentGroup("group2"); // group2 imports group3.* group2.setImports(createImportList(new ImportImpl("group3", null))); // group3 imports group4.field4 group3.setImports(createImportList(new ImportImpl("group4", "field4"))); initForm(createGroupList(group1, group2, group3, group4)); assertFields(group1, "field1", "field2", "field3", "field4"); assertFields(group2, "field2", "field3", "field4"); assertFields(group3, "field3", "field4"); assertFields(group4, "field4", "field4.2"); } private void assertFields(GroupConfig group, String... fieldNames) { List<FieldConfig> fields = group.getFieldConfigList(); assertEquals(fieldNames.length, fields.size()); int i = 0; for (FieldConfig field : fields) { assertEquals(fieldNames[i++], field.getName()); } } @Test public void toString_() throws Exception { // empty assertEquals("FormConfig[groups: 0]", formConfig.toString()); // with groups initForm(createGroupList(group1, group2, group3)); assertEquals("FormConfig[groups: 3]", formConfig.toString()); } }