factored out alert from message; made binding responsible for alert generation

This commit is contained in:
Keith Donald
2009-06-18 18:09:01 +00:00
parent f749eacbc2
commit 4ea373b7dd
25 changed files with 525 additions and 555 deletions

View File

@@ -0,0 +1,43 @@
package org.springframework.ui.alert;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.springframework.ui.alert.Alert;
import org.springframework.ui.alert.Severity;
import org.springframework.ui.alert.support.DefaultAlertContext;
public class DefaultMessageContextTests {
private DefaultAlertContext context;
@Before
public void setUp() {
context = new DefaultAlertContext();
}
@Test
public void addAlert() {
Alert alert = new Alert() {
public String getElement() {
return "form.property";
}
public String getCode() {
return "invalidFormat";
}
public String getMessage() {
return "Please enter a value in format yyy-dd-mm";
}
public Severity getSeverity() {
return Severity.ERROR;
}
};
context.add(alert);
assertEquals(1, context.getAlerts().size());
assertEquals("invalidFormat", context.getAlerts("form.property").get(0).getCode());
}
}

View File

@@ -19,7 +19,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.expression.EvaluationException;
import org.springframework.ui.binding.Binder;
import org.springframework.ui.binding.Binding;
import org.springframework.ui.binding.BindingConfiguration;
@@ -61,18 +60,15 @@ public class GenericBinderTests {
assertEquals(3, results.size());
assertEquals("string", results.get(0).getProperty());
assertFalse(results.get(0).isError());
assertNull(results.get(0).getErrorCause());
assertFalse(results.get(0).isFailure());
assertEquals("test", results.get(0).getUserValue());
assertEquals("integer", results.get(1).getProperty());
assertFalse(results.get(1).isError());
assertNull(results.get(1).getErrorCause());
assertFalse(results.get(1).isFailure());
assertEquals("3", results.get(1).getUserValue());
assertEquals("foo", results.get(2).getProperty());
assertFalse(results.get(2).isError());
assertNull(results.get(2).getErrorCause());
assertFalse(results.get(2).isFailure());
assertEquals("BAR", results.get(2).getUserValue());
assertEquals("test", bean.getString());
@@ -89,8 +85,8 @@ public class GenericBinderTests {
values.add("foo", "BAR");
BindingResults results = binder.bind(values);
assertEquals(3, results.size());
assertTrue(results.get(1).isError());
assertEquals("typeConversionFailure", results.get(1).getErrorCode());
assertTrue(results.get(1).isFailure());
assertEquals("typeConversionFailure", results.get(1).getAlert().getCode());
}
@Test
@@ -131,8 +127,8 @@ public class GenericBinderTests {
public void bindSingleValuePropertyNotFound() throws ParseException {
BindingResults results = binder.bind(UserValues.single("bogus", "2009-06-01"));
assertEquals(1, results.size());
assertTrue(results.get(0).isError());
assertEquals("propertyNotFound", results.get(0).getErrorCode());
assertTrue(results.get(0).isFailure());
assertEquals("propertyNotFound", results.get(0).getAlert().getCode());
}
@Test
@@ -156,7 +152,7 @@ public class GenericBinderTests {
assertEquals("0", b.getValue());
BindingResult result = b.setValue("5");
assertEquals("5", b.getValue());
assertFalse(result.isError());
assertFalse(result.isFailure());
}
@Test
@@ -170,7 +166,7 @@ public class GenericBinderTests {
assertEquals("0", b.getValue());
BindingResult result = b.setValue("5");
assertEquals("5", b.getValue());
assertFalse(result.isError());
assertFalse(result.isFailure());
}
@Test
@@ -214,9 +210,8 @@ public class GenericBinderTests {
assertTrue(b.isCollection());
assertEquals(0, b.getCollectionValues().length);
BindingResult result = b.setValue(new String[] { "BAR", "BOGUS", "BOOP" });
assertTrue(result.isError());
assertTrue(result.getErrorCause() instanceof EvaluationException);
assertEquals("typeConversionFailure", result.getErrorCode());
assertTrue(result.isFailure());
assertEquals("typeConversionFailure", result.getAlert().getCode());
}
@Test

View File

@@ -6,38 +6,29 @@ import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.ui.alert.Severity;
import org.springframework.ui.alert.support.DefaultAlertContext;
import org.springframework.ui.binding.support.GenericFormatterRegistry;
import org.springframework.ui.format.number.CurrencyFormat;
import org.springframework.ui.message.MockMessageSource;
import org.springframework.ui.message.Severity;
import org.springframework.ui.message.support.DefaultMessageContext;
import org.springframework.ui.format.number.IntegerFormatter;
public class WebBindAndLifecycleTests {
private WebBindAndValidateLifecycle lifecycle;
private DefaultMessageContext messages;
private TestBean model;
private DefaultAlertContext alertContext;
@Before
public void setUp() {
MockMessageSource messageSource = new MockMessageSource();
messageSource
.addMessage(
"invalidFormat",
Locale.US,
"#{label} must be a ${objectType} in format #{format}; parsing of your value '#{value}' failed at the #{errorPosition} character");
messageSource.addMessage("typeConversionFailure", Locale.US,
"The value '#{value}' entered into the #{label} field could not be converted");
messageSource.addMessage("org.springframework.ui.lifecycle.WebBindAndLifecycleTests$TestBean.integer",
Locale.US, "Integer");
messages = new DefaultMessageContext(messageSource);
TestBean model = new TestBean();
lifecycle = new WebBindAndValidateLifecycle(model, messages);
model = new TestBean();
alertContext = new DefaultAlertContext();
lifecycle = new WebBindAndValidateLifecycle(model, alertContext);
}
@Test
@@ -47,10 +38,9 @@ public class WebBindAndLifecycleTests {
userMap.put("integer", "3");
userMap.put("foo", "BAR");
lifecycle.execute(userMap);
assertEquals(0, messages.getMessages().size());
assertEquals(0, alertContext.getAlerts().size());
}
@Ignore("Disabled test until it passes consistently in the Ant build on Mac OS X")
@Test
public void testExecuteLifecycleBindingErrors() {
Map<String, Object> userMap = new HashMap<String, Object>();
@@ -58,10 +48,24 @@ public class WebBindAndLifecycleTests {
userMap.put("integer", "bogus");
userMap.put("foo", "BAR");
lifecycle.execute(userMap);
assertEquals(1, messages.getMessages().size());
assertEquals(Severity.ERROR, messages.getMessages("integer").get(0).getSeverity());
assertEquals("The value 'bogus' entered into the Integer field could not be converted", messages.getMessages(
"integer").get(0).getText());
assertEquals(1, alertContext.getAlerts().size());
assertEquals(Severity.FATAL, alertContext.getAlerts("integer").get(0).getSeverity());
assertEquals("Failed to bind to property 'integer'; user value 'bogus' could not be converted to property type [java.lang.Integer]", alertContext.getAlerts("integer").get(0).getMessage());
}
@Test
public void testExecuteLifecycleInvalidFormatBindingErrors() {
Map<String, Object> userMap = new HashMap<String, Object>();
GenericFormatterRegistry registry = new GenericFormatterRegistry();
registry.add(new IntegerFormatter(), Integer.class);
lifecycle.setFormatterRegistry(registry);
userMap.put("string", "test");
userMap.put("integer", "bogus");
userMap.put("foo", "BAR");
lifecycle.execute(userMap);
assertEquals(1, alertContext.getAlerts().size());
assertEquals(Severity.ERROR, alertContext.getAlerts("integer").get(0).getSeverity());
assertEquals("Failed to bind to property 'integer'; the user value 'bogus' has an invalid format and could no be parsed", alertContext.getAlerts("integer").get(0).getMessage());
}
public static enum FooEnum {

View File

@@ -6,19 +6,18 @@ import java.util.Locale;
import org.junit.Test;
public class MessageBuilderTests {
public class MessageResolverBuilderTests {
private MessageBuilder builder = new MessageBuilder();
private MessageResolverBuilder builder = new MessageResolverBuilder();
@Test
public void buildMessage() {
MessageResolver resolver = builder.severity(Severity.ERROR).code("invalidFormat").arg("label", new ResolvableArgument("mathForm.decimalField"))
.arg("format", "#,###.##").defaultText("Field must be in format #,###.##").build();
MessageResolver resolver = builder.code("invalidFormat").arg("label", new ResolvableArgument("mathForm.decimalField"))
.arg("format", "#,###.##").defaultMessage("Field must be in format #,###.##").build();
MockMessageSource messageSource = new MockMessageSource();
messageSource.addMessage("invalidFormat", Locale.US, "#{label} must be in format #{format}");
messageSource.addMessage("mathForm.decimalField", Locale.US, "Decimal Field");
Message message = resolver.resolveMessage(messageSource, Locale.US);
assertEquals(Severity.ERROR, message.getSeverity());
assertEquals("Decimal Field must be in format #,###.##", message.getText());
String message = resolver.resolveMessage(messageSource, Locale.US);
assertEquals("Decimal Field must be in format #,###.##", message);
}
}

View File

@@ -8,7 +8,7 @@ import java.util.Map;
import org.springframework.context.support.AbstractMessageSource;
import org.springframework.util.Assert;
public class MockMessageSource extends AbstractMessageSource {
class MockMessageSource extends AbstractMessageSource {
/** Map from 'code + locale' keys to message Strings */
private final Map<String, String> messages = new HashMap<String, String>();

View File

@@ -1,49 +0,0 @@
package org.springframework.ui.message.support;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.ui.message.ResolvableArgument;
import org.springframework.ui.message.Message;
import org.springframework.ui.message.MessageBuilder;
import org.springframework.ui.message.MessageResolver;
import org.springframework.ui.message.MockMessageSource;
import org.springframework.ui.message.Severity;
public class DefaultMessageContextTests {
private DefaultMessageContext context;
@Before
public void setUp() {
MockMessageSource messageSource = new MockMessageSource();
messageSource.addMessage("invalidFormat", Locale.US, "#{label} must be in format #{format}");
messageSource.addMessage("mathForm.decimalField", Locale.US, "Decimal Field");
context = new DefaultMessageContext(messageSource);
LocaleContextHolder.setLocale(Locale.US);
}
@After
public void tearDown() {
LocaleContextHolder.setLocale(null);
}
@Test
public void addMessage() {
MessageBuilder builder = new MessageBuilder();
MessageResolver message = builder.severity(Severity.ERROR).code("invalidFormat").arg("label", new ResolvableArgument("mathForm.decimalField")).
arg("format", "#,###.##").defaultText("Field must be in format #,###.##").build();
context.add(message, "mathForm.decimalField");
Map<String, List<Message>> messages = context.getMessages();
assertEquals(1, messages.size());
assertEquals("Decimal Field must be in format #,###.##", messages.get("mathForm.decimalField").get(0).getText());
assertEquals("Decimal Field must be in format #,###.##", context.getMessages("mathForm.decimalField").get(0).getText());
}
}