package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs;
import com.jaspersoft.jasperserver.jaxrs.client.core.exceptions.ValidationException;
import com.jaspersoft.jasperserver.jaxrs.client.core.exceptions.handling.DefaultErrorHandler;
import com.jaspersoft.jasperserver.dto.common.ErrorDescriptor;
import com.jaspersoft.jasperserver.jaxrs.client.dto.common.ValidationError;
import com.jaspersoft.jasperserver.jaxrs.client.dto.common.ValidationErrorsListWrapper;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.MockitoAnnotations.initMocks;
/**
* Unit tests for {@link com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.JobValidationErrorHandler}
*/
@PrepareForTest({DefaultErrorHandler.class, JobValidationErrorHandler.class})
public class JobValidationErrorHandlerTest extends PowerMockTestCase {
@Mock
private Response responseMock;
@Mock
private ValidationErrorsListWrapper wrapperMock;
@BeforeMethod
public void before() {
initMocks(this);
}
@Test(expectedExceptions = ValidationException.class)
public void should_throw_an_exception_when_retrieved_validation_errors() throws Exception {
/* Given */
List<ValidationError> errors = new ArrayList<ValidationError>() {{
add(new ValidationError("code1", new Object[]{}, "msg_1"));
add(new ValidationError("code2", new Object[]{}, "msg_2"));
}};
Mockito.when(responseMock.getHeaderString("Content-Type")).thenReturn("application/xml");
Mockito.when(responseMock.readEntity(ValidationErrorsListWrapper.class)).thenReturn(wrapperMock);
Mockito.when(wrapperMock.getErrors()).thenReturn(errors);
/* When */
JobValidationErrorHandler handler = new JobValidationErrorHandler();
handler.handleBodyError(responseMock);
/* Then */
Mockito.verify(responseMock, times(1)).getHeaderString("Content-Type");
Mockito.verify(responseMock, times(1)).readEntity(ValidationErrorsListWrapper.class);
}
@Test
public void should_handle_body_error() {
/* Given */
final ValidationErrorsListWrapper expected = null;
final int wantedNumberOfInvocations = 2; // invoke getHeaderString length in child and parent class
Mockito.when(responseMock.getHeaderString("Content-Type")).thenReturn("application/xml");
Mockito.when(responseMock.readEntity(ValidationErrorsListWrapper.class)).thenReturn(expected);
/* When */
JobValidationErrorHandler handler = new JobValidationErrorHandler();
handler.handleBodyError(responseMock);
/* Then */
Mockito.verify(responseMock, times(wantedNumberOfInvocations)).getHeaderString("Content-Type");
}
@Test
public void should_handle_body_error_when_content_type_of_response_in_text_html() {
/* Given */
final ValidationErrorsListWrapper expected = null;
Mockito.when(responseMock.getHeaderString("Content-Type")).thenReturn("text/html");
Mockito.when(responseMock.readEntity(ValidationErrorsListWrapper.class)).thenReturn(expected);
/* When */
JobValidationErrorHandler handler = Mockito.spy(new JobValidationErrorHandler());
handler.handleBodyError(responseMock);
/* Then */
Mockito.verify(responseMock, times(3)).getHeaderString("Content-Type");
Mockito.verify(handler, times(1)).handleBodyError(responseMock);
}
@Test
public void should_convert_error_descriptor_to_list() {
List<ValidationError> errors = new ArrayList<ValidationError>() {{
add(new ValidationError("code1", new Object[]{}, "msg_1"));
add(new ValidationError("code2", new Object[]{}, "msg_2"));
}};
Mockito.doReturn(errors).when(wrapperMock).getErrors();
JobValidationErrorHandler handler = new JobValidationErrorHandler();
List<ErrorDescriptor> retrieved = handler.toErrorDescriptorList(wrapperMock);
Assert.assertTrue(retrieved.size() == 2);
Assert.assertSame(retrieved.get(0).getErrorCode(), "code1");
}
@AfterMethod
public void after() {
reset(responseMock, wrapperMock);
}
}