package ch.alv.components.web.dto; import ch.alv.components.core.beans.ModelItem; import ch.alv.components.web.endpoint.DefaultEndpoint; import ch.alv.components.web.endpoint.Endpoint; import ch.alv.components.web.mock.MockDto; import ch.alv.components.web.mock.MockEntity; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import static org.junit.Assert.*; /** * Test cases for the {@link DtoImpl} class * * @since 1.0.0 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/dto-factory-impl-test.xml") public class DefaultDtoFactoryTest { @Resource private DtoFactory factory; @Resource private HttpServletRequest request; private Endpoint endpoint = new TestEndpoint(); @Rule public ExpectedException exception = ExpectedException.none(); @Test public void testDtoFromRequestBody() { String body = "{\"id\": \"testId\", \"version\": 66}"; Dto dto = factory.createDtoFromRequestBody(body, endpoint); assertTrue(dto instanceof MockDto); assertEquals("testId", dto.getId()); assertEquals((Integer) 66, dto.getVersion()); } @Test public void testDtoFromNullRequestBody() { exception.expect(DtoFactoryException.class); exception.expectMessage("requestBody param must not be empty."); assertNull(factory.createDtoFromRequestBody(null, endpoint)); } @Test public void testDtoFromEmptyRequestBody() { exception.expect(DtoFactoryException.class); exception.expectMessage("requestBody param must not be empty."); assertNull(factory.createDtoFromRequestBody("", endpoint)); } @Test public void testDtoFromRequestBodyWithEmptyCurlyBraces() { exception.expect(DtoFactoryException.class); exception.expectMessage("Illegal string source."); factory.createDtoFromRequestBody("{}", endpoint); } @Test public void testDtoFromRequestBodyWithoutCurlyBraces() { exception.expect(DtoFactoryException.class); exception.expectMessage("Error while creating Dto of type ch.alv.components.web.mock.MockDto from requestBody 'tesa da '."); factory.createDtoFromRequestBody("tesa da ", endpoint); } @Test public void testDtoFromInvalidRequestBody() { exception.expect(DtoFactoryException.class); exception.expectMessage("Error while creating Dto of type ch.alv.components.web.mock.MockDto from requestBody 'tesa{ d}a '"); factory.createDtoFromRequestBody("tesa{ d}a ", endpoint); } @Test public void testDtoFromRequestBodyWithNullEndpoint() { String body = "{\"id\": \"testId\", \"version\": 66}"; exception.expect(IllegalArgumentException.class); exception.expectMessage("Endpoint must not be null."); factory.createDtoFromRequestBody(body, null); } @Test public void testDtoFromEntity() { MockEntity entity = new MockEntity(); entity.setId("testId"); entity.setVersion(66); Dto dto = factory.createDtoFromEntity(entity, endpoint); assertTrue(dto instanceof MockDto); assertEquals("testId", dto.getId()); assertEquals((Integer) 66, dto.getVersion()); } @Test public void testDtoFromEntityWithLanguage() { ((MockHttpServletRequest) request).addParameter("language", "fr"); MockEntity entity = new MockEntity(); entity.setId("testId"); entity.setVersion(66); Dto dto = factory.createDtoFromEntity(entity, endpoint); assertTrue(dto instanceof MockDto); assertEquals("testId", dto.getId()); assertEquals((Integer) 66, dto.getVersion()); assertTrue(dto.getLinks().get(0).getHref().contains("?language=fr")); } @Test public void testDtoFromNullEntity() { assertNull(factory.createDtoFromEntity(null, endpoint)); } private class TestEndpoint extends DefaultEndpoint { @Override public String getModuleName() { return null; } @Override public String getStoreName() { return null; } @Override public Class<? extends Dto> getDtoClass() { return MockDto.class; } @Override public Class<? extends ModelItem> getEntityClass() { return MockEntity.class; } } }