/*
* 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;
import static com.alibaba.citrus.test.TestUtil.*;
import static com.alibaba.citrus.util.CollectionUtil.*;
import static org.junit.Assert.*;
import java.io.Serializable;
import java.util.Map;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class FieldTests extends AbstractFormServiceTests {
private Form form;
private Group group;
private Field field1;
private Field field2;
@BeforeClass
public static void initFactory() {
factory = createContext("services-form.xml", true);
}
@Before
public void init() throws Exception {
getFormService("form1");
invokePost(null);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(false, group.isValidated());
assertEquals(true, group.isValid());
assertEquals("default1", field1.getValue()); // specified default value
assertEquals(null, field2.getValue()); // default is null
}
@Test
public void getFieldConfig() {
assertSame(group.getGroupConfig(), field1.getFieldConfig().getGroupConfig());
assertSame(group.getGroupConfig(), field2.getFieldConfig().getGroupConfig());
}
@Test
public void getGroup() {
assertSame(group, field1.getGroup());
assertSame(group, field2.getGroup());
}
@Test
public void getKey() {
assertEquals("_fm.g._0.f", field1.getKey());
assertEquals("_fm.g._0.fi", field2.getKey());
}
@Test
public void getAbsentKey() {
assertEquals("_fm.g._0.f.absent", field1.getAbsentKey());
assertEquals("_fm.g._0.fi.absent", field2.getAbsentKey());
}
@Test
public void getAttachmentKey() {
assertEquals("_fm.g._0.f.attach", field1.getAttachmentKey());
assertEquals("_fm.g._0.fi.attach", field2.getAttachmentKey());
}
@Test
public void getName() {
assertEquals("field1", field1.getName());
assertEquals("field2", field2.getName());
}
@Test
public void getDisplayName() {
assertEquals("我的字段1", field1.getDisplayName());
assertEquals("field2", field2.getDisplayName()); // same as field name
}
@Test
public void getDefaultValue() {
assertEquals("default1", field1.getDefaultValue());
assertEquals(null, field2.getDefaultValue());
group = form.getGroup("group3");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals("default1", field1.getDefaultValue());
assertEquals(null, field2.getDefaultValue());
}
@Test
public void getDefaultValues() {
assertArrayEquals(new String[] { "default1" }, field1.getDefaultValues());
assertArrayEquals(new String[0], field2.getDefaultValues());
group = form.getGroup("group3");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertArrayEquals(new String[] { "default1", "default2", "default3" }, field1.getDefaultValues());
assertArrayEquals(new String[0], field2.getDefaultValues());
}
@Test
public void getValue() throws Exception {
assertEquals("default1", field1.getValue()); // with default value
assertEquals(null, field2.getValue()); // no default value
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", "aaa" }, // group1.field1
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals("aaa", field1.getValue());
assertEquals("bbb", field2.getValue());
}
@Test
public void getValues() throws Exception {
group = form.getGroup("group3");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals("default1", field1.getValue()); // with default value
assertArrayEquals(new String[] { "default1", "default2", "default3" }, field1.getValues()); // with default value
assertEquals(null, field2.getValue()); // no default value
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", new String[] { "aaa", "bbb" } }, // group1.field1
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals("aaa", field1.getValue());
assertArrayEquals(new String[] { "aaa", "bbb" }, field1.getValues());
assertEquals("bbb", field2.getValue());
}
@Test
public void getStringValue() {
assertEquals(null, field2.getValue());
assertEquals("", field2.getStringValue());
field2.setValue("hello");
assertEquals("hello", field2.getValue());
assertEquals("hello", field2.getStringValue());
}
@Test
public void addValue_trimming() {
// trimming = true
field1.setValue(" hello ");
assertEquals("hello", field1.getValue());
field1.setValue(" ");
assertEquals(null, field1.getValue());
// trimming = false
group = form.getGroup("group3");
field1 = group.getField("field1");
field1.setValue(" hello ");
assertEquals(" hello ", field1.getValue());
field1.setValue(" ");
assertEquals(" ", field1.getValue());
}
@Test
public void getAttachment() throws Exception {
String code = "eNpb85aBtbiIwTg5P1cvMSczKTEpUS85s6SotFivOLWoLDM5VS8tvyh"
+ "Xzy0zNSclJLW4pFjFt9I%2FKSs1uSTiZmR4h%2Fan%2F0wMTJ4MjJk%2BDI"
+ "zFJQxCPlmJZYn6OYl56frBJUWZeenWFQUMDAzVJQwsJUDtAPRsJsw%3D";
MyObject obj = new MyObject();
obj.i = 123;
obj.s = "test";
// no attachment
assertEquals(false, field1.hasAttachment());
assertEquals(null, field1.getAttachment());
assertEquals(null, field1.getAttachmentEncoded());
// with attachment
field1.setAttachment(obj);
assertEquals(true, field1.hasAttachment());
assertSame(obj, field1.getAttachment());
assertEquals(code, field1.getAttachmentEncoded());
// clear attachment
field1.clearAttachment();
assertEquals(false, field1.hasAttachment());
assertEquals(null, field1.getAttachment());
assertEquals(null, field1.getAttachmentEncoded());
// 通过form携带attachment
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", new String[] { "aaa", "bbb" } }, // group1.field1
{ "_fm.g._0.f.attach", code }, // group1.field1.attach
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(true, field1.hasAttachment());
assertNotSame(obj, field1.getAttachment());
assertEquals(obj, field1.getAttachment());
assertEquals(code, field1.getAttachmentEncoded());
}
@Test
public void getAttachment_failureEncoding() throws Exception {
String code = "!Failure: java.io.NotSerializableException: java.lang.Object";
field1.setAttachment(new Object()); // not serializable
assertEquals(code, field1.getAttachmentEncoded());
assertNotNull(field1.getAttachment());
// 解码Failure
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", new String[] { "aaa", "bbb" } }, // group1.field1
{ "_fm.g._0.f.attach", code }, // group1.field1.attach
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(false, field1.hasAttachment());
assertEquals(null, field1.getAttachment());
assertEquals(null, field1.getAttachmentEncoded());
}
@Test
public void getAttachment_failureDecoding() throws Exception {
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", new String[] { "aaa", "bbb" } }, // group1.field1
{ "_fm.g._0.f.attach", "wrong format" }, // group1.field1.attach
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(false, field1.hasAttachment());
assertEquals(null, field1.getAttachment());
assertEquals(null, field1.getAttachmentEncoded());
}
@Test
public void isValid() throws Exception {
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", "aaa" }, // group1.field1
{ "_fm.g._0.fi", "" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(false, group.isValid());
assertEquals(true, field1.isValid());
assertEquals(false, field2.isValid());
}
@Test
public void getMessage_invalidField() throws Exception {
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", "" }, // group1.field1
{ "_fm.g._0.fi", "" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(false, group.isValid());
assertEquals(false, field1.isValid());
assertEquals("required 我的字段1", field1.getMessage());
assertEquals(false, field2.isValid());
assertEquals("required field2", field2.getMessage());
}
@Test
public void getMessage_validField() throws Exception {
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f", "aaa" }, // group1.field1
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(true, group.isValid());
assertEquals(true, field1.isValid());
assertEquals(null, field1.getMessage());
assertEquals(true, field2.isValid());
assertEquals(null, field2.getMessage());
}
@Test
public void setMessage() throws Exception {
initForSetMessage();
// id not found
try {
field2.setMessage("notExistErrorId");
fail();
} catch (CustomErrorNotFoundException e) {
assertThat(e, exception("Specified error ID \"notExistErrorId\" was not found "
+ "in Field[group: group3._0, name: field2, values: [bbb], valid: true]"));
}
// setMessage
field2.setMessage("err1");
assertEquals(false, field2.isValid());
assertEquals(false, group.isValid());
assertEquals("hello, world", field2.getMessage());
// setMessage twice
field2.setMessage("err2");
assertEquals(false, field2.isValid());
assertEquals(false, group.isValid());
assertEquals("hello, world", field2.getMessage()); // 错误信息不覆盖
// setMessage with params
initForSetMessage();
Map<String, String> params = createHashMap();
params.put("world", "世界");
field2.setMessage("err3", params);
assertEquals(false, field2.isValid());
assertEquals(false, group.isValid());
assertEquals("hello, 世界", field2.getMessage());
// param not found
initForSetMessage();
field2.setMessage("err3");
assertEquals(false, field2.isValid());
assertEquals(false, group.isValid());
assertEquals("hello, ", field2.getMessage());
// no message (requiresMessage=false)
initForSetMessage();
try {
field2.setMessage("err4");
fail();
} catch (CustomErrorNotFoundException e) {
assertThat(e, exception("No message specified for error ID \"err4\" "
+ "in Field[group: group3._0, name: field2, values: [bbb], valid: false]"));
}
}
private void initForSetMessage() throws Exception {
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.gro._0.f", "aaa" }, // group3.field1
{ "_fm.gro._0.fi", "bbb" }, // group3.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group3");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(true, group.isValid());
assertEquals(true, field1.isValid());
assertEquals(true, field2.isValid());
}
@Test
public void validate_withAbsentKey() throws Exception {
Object[][] args = new Object[][] { { "sumbit", "提交" }, //
{ "_fm.g._0.f.absent", "aaa" }, // group1.field1
{ "_fm.g._0.fi", "bbb" }, // group1.field2
};
invokePost(args);
form = formService.getForm();
group = form.getGroup("group1");
field1 = group.getField("field1");
field2 = group.getField("field2");
assertEquals(true, group.isValid());
assertEquals(true, field1.isValid());
assertEquals(true, field2.isValid());
assertEquals("aaa", field1.getValue());
}
@Test
public void toString_() {
assertEquals("Field[group: group1._0, name: field1, values: [default1], valid: true]", field1.toString());
}
public static class MyObject implements Serializable {
private static final long serialVersionUID = 6402246577765479167L;
private int i;
private String s;
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MyObject other = (MyObject) obj;
if (i != other.i) {
return false;
}
if (s == null) {
if (other.s != null) {
return false;
}
} else if (!s.equals(other.s)) {
return false;
}
return true;
}
}
}