package org.transgalactica.fwk.validation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
import org.junit.Test;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.validation.DefaultMessageCodesResolver;
import org.springframework.validation.MessageCodesResolver;
import org.transgalactica.fwk.validation.exception.AbstractException;
import org.transgalactica.fwk.validation.exception.ExceptionUtils;
import org.transgalactica.fwk.validation.exception.MultipleErrorsException;
@ContextConfiguration(locations = { "classpath:org/transgalactica/fwk/validation/MultipleErrorsTest.spring.xml" })
public class MultipleErrorsTest extends AbstractJUnit4SpringContextTests {
private static final String ERROR_CODE = "error.code";
private static final String OBJECT_NAME = "object.name";
private static final MessageCodesResolver RESOLVER = new DefaultMessageCodesResolver();
private class MockException extends AbstractException {
private static final long serialVersionUID = 1L;
public MockException(String message, Object... args) {
super(message);
for (int i = 0; i < args.length; i++) {
addArgument(args[i]);
}
}
}
@Test
public void testEmptyError() {
MultipleErrors errors = new MultipleErrors();
assertFalse(errors.hasErrors());
assertNotNull(errors.getAllErrorMessages());
assertEquals(0, errors.getAllErrorMessages().size());
}
@Test
public void testSingleError() {
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m = createMessage(1);
errors.add(m);
checkMessages(errors, new MessageSourceResolvable[] { m });
}
@Test
public void testTwoErrors() {
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m1 = createMessage(1);
MessageSourceResolvable m2 = createMessage(2);
errors.add(m1);
errors.add(m2);
checkMessages(errors, new MessageSourceResolvable[] { m1, m2 });
}
@Test
public void testTwoStringErrors() {
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m1 = new DefaultMessageSourceResolvable(new String[] { "message1" }, "message1");
MessageSourceResolvable m2 = new DefaultMessageSourceResolvable(new String[] { "message2" }, "message2");
errors.add("message1");
errors.add("message2");
checkMessages(errors, new MessageSourceResolvable[] { m1, m2 });
}
@Test
public void testAddMulitpleErrorsToEmptyList() {
MultipleErrors errors1 = new MultipleErrors();
MultipleErrors errors2 = new MultipleErrors();
MessageSourceResolvable m2 = createMessage(2);
errors2.add(m2);
errors1.add(errors2);
checkMessages(errors1, new MessageSourceResolvable[] { m2 });
}
@Test
public void testAddMulitpleErrorsToExistingList() {
MultipleErrors errors1 = new MultipleErrors();
MessageSourceResolvable m1 = createMessage(1);
errors1.add(m1);
MultipleErrors errors2 = new MultipleErrors();
MessageSourceResolvable m2 = createMessage(2);
errors2.add(m2);
errors1.add(errors2);
checkMessages(errors1, new MessageSourceResolvable[] { m1, m2 });
}
@Test
public void testAddBasicExceptionWithNoMessage() {
Exception e = new Exception();
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m = new DefaultMessageSourceResolvable(new String[] { "java.lang.Exception" },
new Object[] {});
errors.add(e);
checkMessages(errors, new MessageSourceResolvable[] { m });
}
@Test
public void testAddExceptionWithOneArgument() {
Exception e = new MockException("some.message{0}", "some.args");
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m = new DefaultMessageSourceResolvable(new String[] {//
MockException.class.getName(), //
AbstractException.class.getName(), //
RuntimeException.class.getName(), //
Exception.class.getName() //
}, new Object[] {
new DefaultMessageSourceResolvable(new String[] { ExceptionUtils.getCauseMessage(e) },
ExceptionUtils.getCauseMessage(e)), "some.args" });
errors.add(e);
checkMessages(errors, new MessageSourceResolvable[] { m });
}
@Test
public void testAddExceptionWithTwoArguments() {
Exception e = new MockException("some.message{0}{1}", "arg1", "arg2");
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m = new DefaultMessageSourceResolvable(new String[] {//
MockException.class.getName(), //
AbstractException.class.getName(), //
RuntimeException.class.getName(), //
Exception.class.getName() //
}, new Object[] {
new DefaultMessageSourceResolvable(new String[] { ExceptionUtils.getCauseMessage(e) },
ExceptionUtils.getCauseMessage(e)), "arg1", "arg2" });
errors.add(e);
checkMessages(errors, new MessageSourceResolvable[] { m });
}
@Test
public void testAddBasicExceptionWithMessage() {
Exception e = new Exception("some.message");
MultipleErrors errors = new MultipleErrors();
MessageSourceResolvable m = new DefaultMessageSourceResolvable(new String[] { "java.lang.Exception" },
new Object[] { new DefaultMessageSourceResolvable(new String[] { "some.message" }, "some.message") });
errors.add(e);
checkMessages(errors, new MessageSourceResolvable[] { m });
}
@Test
public void testAddEmptyMultipleErrorsException() {
MultipleErrors errors = new MultipleErrors();
MultipleErrors errors1 = new MultipleErrors();
MultipleErrorsException e = new MultipleErrorsException(errors1.getAllErrorMessages());
errors.add(e);
assertEquals(0, errors.getAllErrorMessages().size());
}
@Test
public void testAddMultipleErrorsException() {
MultipleErrors errors = new MultipleErrors();
Exception npe = new NullPointerException();
errors.add(npe);
errors.add(new IllegalAccessException());
MultipleErrors errors1 = new MultipleErrors();
errors1.add(new NoSuchElementException());
MultipleErrorsException e = new MultipleErrorsException(errors1.getAllErrorMessages());
errors.add(e);
MessageSourceResolvable m1 = new DefaultMessageSourceResolvable(new String[] {
NullPointerException.class.getName(), RuntimeException.class.getName(), Exception.class.getName() },
ExceptionUtils.getArguments(npe));
MessageSourceResolvable m2 = new DefaultMessageSourceResolvable(new String[] {
IllegalAccessException.class.getName(), ReflectiveOperationException.class.getName(),
Exception.class.getName() }, new Object[] {});
MessageSourceResolvable m3 = new DefaultMessageSourceResolvable(new String[] {
NoSuchElementException.class.getName(), RuntimeException.class.getName(), Exception.class.getName() },
new Object[] {});
checkMessages(errors, new MessageSourceResolvable[] { m1, m2, m3 });
}
@Test
public void testCheckErrorsWithoutError() {
MultipleErrors errors = new MultipleErrors();
errors.checkErrors();
}
@Test
public void testCheckErrorsWithError() {
MultipleErrors errors = new MultipleErrors();
errors.add(new NullPointerException());
try {
errors.checkErrors();
fail();
}
catch (MultipleErrorsException mex) {
assertEquals(errors.getAllErrorMessages(), mex.getErrors());
}
}
private MessageSourceResolvable createMessage(int index) {
String[] codes = RESOLVER.resolveMessageCodes(ERROR_CODE, OBJECT_NAME);
MessageSourceResolvable message = new DefaultMessageSourceResolvable(codes,
new Integer[] { new Integer(index) });
return message;
}
private void checkMessages(MultipleErrors errors, MessageSourceResolvable[] expectedMessages) {
if (expectedMessages == null || expectedMessages.length == 0) {
assertFalse(errors.hasErrors());
}
else {
assertTrue(errors.hasErrors());
List<MessageSourceResolvable> errs = errors.getAllErrorMessages();
assertNotNull(errs);
assertEquals(expectedMessages.length, errs.size());
for (int i = 0; i < expectedMessages.length; i++) {
assertEqualsMessage(expectedMessages[i], errs.get(i));
}
}
}
private void assertEqualsMessage(MessageSourceResolvable expectedMessage, MessageSourceResolvable message) {
assertEquals(expectedMessage != null, message != null);
if (expectedMessage != null && !expectedMessage.equals(message)) {
// check codes
String[] expectedCodes = expectedMessage.getCodes();
String[] codes = message.getCodes();
assertEquals(expectedCodes != null, codes != null);
if (expectedCodes != null) {
assertEquals(Arrays.asList(expectedCodes), Arrays.asList(codes));
}
// check args
Object[] expectedArgs = expectedMessage.getArguments();
Object[] args = message.getArguments();
assertEquals(expectedArgs != null, args != null);
if (expectedArgs != null) {
assertEquals(Arrays.asList(expectedArgs), Arrays.asList(args));
}
// check defaultMessage
assertEquals(expectedMessage.getDefaultMessage(), message.getDefaultMessage());
}
}
}