package com.softwaremill.common.faces.validator;
import org.testng.annotations.Test;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.fail;
public class DelegatingValidatorTest {
private static final String VALIDATOR_ID = "mockValidator";
private Application app;
private UIComponent component;
private FacesContext context;
@Test
public void shouldCreateValidatorAndNotThrowException() throws Exception {
// given
DelegatingValidator validator = new DelegatingValidator();
MockValidator mockValidator = prepareMocks(false);
Object value = "123 33 23";
// when
try {
validator.validate(context, component, value);
} catch (ValidatorException e) {
fail("Validation should pass!", e);
}
// then
verify(context).getApplication();
verify(app).createValidator(VALIDATOR_ID);
assertThat(value).isEqualTo(mockValidator.getValue());
}
@Test
public void shouldCreateValidatorAndThrowException() throws Exception {
// given
DelegatingValidator validator = new DelegatingValidator();
MockValidator mockValidator = prepareMocks(true);
Object value = "123 33 23";
// when
try {
validator.validate(context, component, value);
fail("Validation shouldn't pass!");
} catch (ValidatorException expected) {
}
// then
verify(context).getApplication();
verify(app).createValidator(VALIDATOR_ID);
assertThat(value).isEqualTo(mockValidator.getValue());
}
private MockValidator prepareMocks(boolean throwException) {
context = mock(FacesContext.class);
app = mock(Application.class);
MockValidator validator = new MockValidator(throwException);
when(app.createValidator(anyString())).thenReturn(validator);
when(context.getApplication()).thenReturn(app);
component = new UIInput();
component.getAttributes().put("validatorId", VALIDATOR_ID);
return validator;
}
}
class MockValidator implements Validator {
private boolean throwException;
private Object value;
public MockValidator(boolean throwException) {
this.throwException = throwException;
}
@Override
public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
this.value = value;
if (throwException) {
throw new ValidatorException(new FacesMessage("An error occurred!"));
}
}
public Object getValue() {
return value;
}
}