package org.atomhopper.abdera.response; import org.apache.abdera.i18n.iri.IRI; import org.apache.abdera.model.Document; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; import org.apache.abdera.model.Link; import org.apache.abdera.parser.stax.FOMEntry; import org.apache.abdera.parser.stax.FOMFeed; import org.apache.abdera.protocol.server.RequestContext; import org.apache.abdera.protocol.server.ResponseContext; import org.apache.abdera.protocol.server.Target; import org.apache.abdera.util.EntityTag; import org.atomhopper.abdera.filter.FeedEntityTagProcessor; import org.atomhopper.abdera.filter.FeedPagingProcessor; import org.atomhopper.adapter.FeedSource; import org.atomhopper.response.AdapterResponse; import org.atomhopper.response.FeedSourceAdapterResponse; import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import java.io.IOException; import java.util.UUID; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(Enclosed.class) public class FeedResponseHandlerTest { public static class WhenHandlingAdapterResponse extends TestParent { @Test public void shouldReturnWith304Response() { FeedResponseHandler responseHandler = responseHandler(); RequestContext requestContext = requestContext(); AdapterResponse<Feed> adapterResponse = adapterResponseForFeed(2); String entityTagValue = adapterResponse.getBody().getEntries().get(0).getId().toString() + ":" + adapterResponse.getBody().getEntries().get(1).getId().toString(); EntityTag requestEntityTag = new EntityTag(entityTagValue, true); when(requestContext.getIfNoneMatch()).thenReturn(new EntityTag[] {requestEntityTag}); ResponseContext responseContext = responseHandler.handleResponse(requestContext, adapterResponse); assertEquals("Should respond with 304", 304, responseContext.getStatus()); assertEquals("Should have ETag", requestEntityTag, responseContext.getEntityTag()); } } public static class ResponseLinkHeaders extends TestParent { @Test public void shouldReturnLinkHeaders() { FeedResponseHandler responseHandler = responseHandler(); RequestContext requestContext = requestContext(); AdapterResponse<Feed> adapterResponse = adapterResponseForFeed(2); adapterResponse.getBody().addLink("http://localhost:8080/next", Link.REL_NEXT); adapterResponse.getBody().addLink("http://localhost:8080/previous", Link.REL_PREVIOUS); ResponseContext responseContext = responseHandler.handleResponse(requestContext, adapterResponse); Object[] headers = responseContext.getHeaders("Link"); assertNotNull("Headers array should not be null", headers); assertEquals("# of elements in Link headers array", 1, headers.length); assertTrue("Link header contains URL for next", ((String)headers[0]).contains("http://localhost:8080/next")); assertTrue("Link header contains URL for previous", ((String)headers[0]).contains("http://localhost:8080/previous")); } @Test public void shouldReturnArchiveLinkHeaders() { FeedResponseHandler responseHandler = responseHandler(); RequestContext requestContext = requestContext(); AdapterResponse<Feed> adapterResponse = adapterResponseForFeed(2); adapterResponse.getBody().addLink( "http://localhost:8080/next", FeedSource.REL_ARCHIVE_NEXT ); adapterResponse.getBody().addLink( "http://localhost:8080/previous", FeedSource.REL_ARCHIVE_PREV ); ResponseContext responseContext = responseHandler.handleResponse(requestContext, adapterResponse); Object[] headers = responseContext.getHeaders("Link"); assertNotNull("Headers array should not be null", headers); assertEquals("# of elements in Link headers array", 1, headers.length); assertTrue("Link header contains URL for next", ((String)headers[0]).contains("http://localhost:8080/next")); assertTrue("Link header contains URL for previous", ((String)headers[0]).contains("http://localhost:8080/previous")); } } @Ignore public static class TestParent { static final String BASE_URI = "http://localhost:8080/atom/"; static final String TARGET_PATH = "/foo/bar"; static final String SELF = "http://localhost:8080/atom/foo/bar"; public FeedResponseHandler responseHandler() { return new FeedResponseHandler(new String[] {"GET"}, new FeedEntityTagProcessor(), new FeedPagingProcessor()); } public AdapterResponse<Feed> adapterResponseForFeed(int entriesOnFeed) { return new FeedSourceAdapterResponse<Feed>(feed(entriesOnFeed)); } public Feed feed(int entriesOnFeed) { final FOMFeed feed = new FOMFeed(); for (int i = 0; i < entriesOnFeed; i++) { feed.addEntry(entry()); } return feed; } public Entry entry() { final FOMEntry entry = new FOMEntry(); entry.setId(UUID.randomUUID().toString()); entry.setContent("testing"); return entry; } public RequestContext requestContext() { final RequestContext context = mock(RequestContext.class); final Target targetMock = mock(Target.class); when(targetMock.getParameter(anyString())).thenReturn(""); when(context.getResolvedUri()).thenReturn(new IRI(SELF)); when(context.getBaseUri()).thenReturn(new IRI(BASE_URI)); when(context.getTarget()).thenReturn(targetMock); when(context.getTargetPath()).thenReturn(TARGET_PATH); when(context.getParameterNames()).thenReturn(new String[]{}); Document document = mock(Document.class); try { when(context.getDocument()).thenReturn(document); } catch (IOException e) { fail("Unexpected exception in test"); } when(document.getRoot()).thenReturn(entry()); return context; } } }