package org.atomhopper.abdera.filter;
import java.util.LinkedList;
import java.util.List;
import org.apache.abdera.Abdera;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.protocol.server.RequestContext;
import org.atomhopper.response.AdapterResponse;
import org.atomhopper.response.FeedSourceAdapterResponse;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.hamcrest.core.IsNull.nullValue;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.springframework.http.HttpStatus;
@RunWith(Enclosed.class)
public class FeedPagingProcessorTest {
public static class WhenProcessingFeedWithMoreThanOneEntry extends TestParent {
final int TOTAL_FEED_ENTRIES = 5;
@Test
public void shouldAddLinksAndElements() {
final FeedPagingProcessor target = feedPagingProcessor();
final AdapterResponse<Feed> feedResponse = adapterResponse(TOTAL_FEED_ENTRIES);
final RequestContext rc = requestContext();
target.process(rc, feedResponse);
Feed feed = feedResponse.getBody().getAsFeed();
assertThat("Should set updated element", feed.getUpdated(), notNullValue());
}
}
public static class WhenProcessingFeedWithOneEntry extends TestParent {
final int TOTAL_FEED_ENTRIES = 1;
@Test
public void shouldAddLinksAndElements() {
final FeedPagingProcessor target = feedPagingProcessor();
final AdapterResponse<Feed> feedResponse = adapterResponse(TOTAL_FEED_ENTRIES);
final RequestContext rc = requestContext();
target.process(rc, feedResponse);
Feed feed = feedResponse.getBody().getAsFeed();
assertThat("Should set updated element", feed.getUpdated(), notNullValue());
}
}
public static class WhenProcessingEmptyFeed extends TestParent {
final int TOTAL_FEED_ENTRIES = 0;
@Test
public void shouldNotAddMarkers() {
final FeedPagingProcessor target = feedPagingProcessor();
final AdapterResponse<Feed> feedResponse = adapterResponse(TOTAL_FEED_ENTRIES);
final RequestContext rc = requestContext();
target.process(rc, feedResponse);
Feed feed = feedResponse.getBody().getAsFeed();
assertThat("Should not set current link", feed.getLink(REL_CURRENT), nullValue());
assertThat("Should not set next link", feed.getLink(REL_NEXT), nullValue());
}
}
public static class WhenProcessingFeedWithPresetMarkers extends TestParent {
@Test
public void shouldNotOverrideWhenNextIsSet() {
final FeedPagingProcessor target = feedPagingProcessor();
final AdapterResponse<Feed> feedResponse = adapterResponse(1, true);
final RequestContext rc = requestContext();
target.process(rc, feedResponse);
Feed feed = feedResponse.getBody().getAsFeed();
assertThat("Should not override next link", feed.getLink(REL_NEXT).getHref().toString(), equalTo(REL_NEXT));
}
}
@Ignore
public static class TestParent {
static final String BASE_URI = "http://localhost:8080/";
static final String TARGET_PATH = "/foo/bar";
static final String TARGET_PARAMS = "?marker=1";
static final String SELF_URL = "http://localhost:8080/foo?marker=1";
static final String CURRENT_URL = "http://localhost:8080/foo";
static final String REL_CURRENT = "current";
static final String REL_NEXT = "next";
static final String REL_SELF = "self";
public FeedPagingProcessor feedPagingProcessor() {
return new FeedPagingProcessor();
}
public AdapterResponse<Feed> adapterResponse(int entriesOnFeed) {
return adapterResponse(entriesOnFeed, false);
}
public AdapterResponse<Feed> adapterResponse(int entriesOnFeed, boolean hasNextMarker) {
final Feed feed = Abdera.getInstance().newFeed();
for (int i = 1; i <= entriesOnFeed; i++) {
Entry entry = Abdera.getInstance().newEntry();
entry.setId(Integer.toString(i));
feed.addEntry(entry);
}
if (hasNextMarker) {
feed.addLink("next", REL_NEXT);
}
return new FeedSourceAdapterResponse<Feed>(feed, HttpStatus.OK, "");
}
public RequestContext requestContext() {
RequestContext target = mock(RequestContext.class);
when(target.getResolvedUri()).thenReturn(new IRI(SELF_URL));
when(target.getBaseUri()).thenReturn(new IRI(BASE_URI));
when(target.getTargetPath()).thenReturn(TARGET_PATH + TARGET_PARAMS);
when(target.getParameterNames()).thenReturn(new String[]{"marker"});
List<String> mockedValues = new LinkedList<String>();
mockedValues.add("1");
when(target.getParameters("marker")).thenReturn(mockedValues);
return target;
}
public RequestContext multiParamRequestContext() {
RequestContext target = mock(RequestContext.class);
when(target.getResolvedUri()).thenReturn(new IRI(SELF_URL));
when(target.getBaseUri()).thenReturn(new IRI(BASE_URI));
when(target.getTargetPath()).thenReturn(TARGET_PATH + TARGET_PARAMS);
when(target.getParameterNames()).thenReturn(new String[]{"marker"});
List<String> mockedValues = new LinkedList<String>();
mockedValues.add("1");
when(target.getParameters("marker")).thenReturn(mockedValues);
List<String> foobar = new LinkedList<String>();
foobar.add("foo");
foobar.add("bar");
when(target.getParameters("foobar")).thenReturn(foobar);
return target;
}
}
}