package org.jvnet.hudson.plugins.jira.issueversioning.plugin.jira.rest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.io.StringWriter; import java.net.URISyntaxException; import java.util.Set; import com.google.common.collect.Sets; import org.jboss.resteasy.core.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.jboss.resteasy.plugins.server.resourcefactory.SingletonResource; import org.jboss.resteasy.spi.ResourceFactory; import org.jboss.resteasy.test.EmbeddedContainer; import org.jboss.resteasy.test.TestPortProvider; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.jvnet.hudson.plugins.jira.issueversioning.domain.api.model.rest.Build; import org.jvnet.hudson.plugins.jira.issueversioning.domain.api.model.rest.Project; import org.mockito.Mockito; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; /** * Unit test for {@link DefaultVersionResource} * * @author Stig Kleppe-Jorgensen, 2009.12.29 */ public class DefaultVersionResourceTest { private DefaultVersionAssociationCreator versionAssociationCreator; @Before public void startContainer() throws Exception { versionAssociationCreator = mock(DefaultVersionAssociationCreator.class); Dispatcher dispatcher = EmbeddedContainer.start().getDispatcher(); dispatcher.getRegistry().addSingletonResource(new DefaultVersionResource(versionAssociationCreator)); } @After public void stopContainer() throws Exception { EmbeddedContainer.stop(); } @Test public void should_return_ok_with_correct_url() throws Exception { Project project = createProject(); final DefaultVersionResource versionResource = TestPortProvider.createProxy(DefaultVersionResource.class); Response response = versionResource.associateWithIssues(project); Mockito.verify(versionAssociationCreator).associateFor(project); assertEquals(HttpServletResponse.SC_OK, response.getStatus()); } @Test public void should_return_404_with_url_pointing_to_nonexisting_resource() throws Exception { Project project = createProject(); final DefaultVersionResource versionResource = TestPortProvider.createProxy(DefaultVersionResource.class, "/should_get_404"); Response response = versionResource.associateWithIssues(project); assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus()); } @Test @Ignore public void should_post_project_with_builds() throws URISyntaxException, JAXBException { final Project project = createProject(); final byte[] projectBytes = bytesForProjectInstance(project); MockHttpRequest request = createRequest(projectBytes); MockHttpResponse response = new MockHttpResponse(); final DefaultVersionAssociationCreator associationCreator = versionAssociationCreator; final DefaultVersionResource resource = new DefaultVersionResource(associationCreator); createDispatcher(resource).invoke(request, response); Mockito.verify(associationCreator).associateFor(project); assertEquals(HttpServletResponse.SC_OK, response.getStatus()); assertEquals("basic", response.getContentAsString()); } private byte[] bytesForProjectInstance(final Project project) throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(Project.class); final Marshaller marshaller = jaxbContext.createMarshaller(); final StringWriter writer = new StringWriter(); marshaller.marshal(project, writer); return writer.toString().getBytes(); } private MockHttpRequest createRequest(byte[] projectBytes) throws URISyntaxException { MockHttpRequest request = MockHttpRequest.post("/version/associate"); request.contentType(MediaType.APPLICATION_XML_TYPE); request.content(projectBytes); return request; } private Dispatcher createDispatcher(final DefaultVersionResource versionResource) { Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); ResourceFactory noDefaults = new SingletonResource(versionResource); dispatcher.getRegistry().addResourceFactory(noDefaults); return dispatcher; } private Project createProject() { return new Project("name", "1.2.5", createBuild()); } private Build createBuild() { return new Build(12, createIssues()); } private Set<String> createIssues() { return Sets.newHashSet("DEV-1234", "DEV-231", "DEV-1432"); } }