package org.atomhopper.mongodb.adapter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import static junit.framework.Assert.assertEquals;
import org.apache.abdera.model.Entry;
import org.apache.abdera.parser.stax.FOMEntry;
import org.atomhopper.adapter.PublicationException;
import org.atomhopper.adapter.request.adapter.DeleteEntryRequest;
import org.atomhopper.adapter.request.adapter.PostEntryRequest;
import org.atomhopper.adapter.request.adapter.PutEntryRequest;
import org.atomhopper.mongodb.domain.PersistedEntry;
import org.atomhopper.response.AdapterResponse;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus;
@RunWith(Enclosed.class)
public class MongodbFeedPublisherTest {
public static class WhenPostingEntries {
private PutEntryRequest putEntryRequest;
private DeleteEntryRequest deleteEntryRequest;
private MongodbFeedPublisher mongodbFeedPublisher;
private PostEntryRequest postEntryRequest;
private MongoTemplate mongoTemplate;
private PersistedEntry persistedEntry;
private final String MARKER_ID = UUID.randomUUID().toString();
private final String ENTRY_BODY = "<entry xmlns='http://www.w3.org/2005/Atom'></entry>";
private final String FEED_NAME = "namespace/feed";
private final String COLLECTION_NAME = "namespace.feed";
@Before
public void setUp() throws Exception {
persistedEntry = new PersistedEntry();
persistedEntry.setFeed(FEED_NAME);
persistedEntry.setEntryId(MARKER_ID);
persistedEntry.setEntryBody(ENTRY_BODY);
putEntryRequest = mock(PutEntryRequest.class);
deleteEntryRequest = mock(DeleteEntryRequest.class);
mongoTemplate = mock(MongoTemplate.class);
mongodbFeedPublisher = new MongodbFeedPublisher();
mongodbFeedPublisher.setMongoTemplate(mongoTemplate);
postEntryRequest = mock(PostEntryRequest.class);
when(postEntryRequest.getEntry()).thenReturn(entry());
when(postEntryRequest.getFeedName()).thenReturn("namespace/feed");
}
@Test
public void shouldReturnHTTPCreated() throws Exception {
AdapterResponse<Entry> adapterResponse = mongodbFeedPublisher.postEntry(postEntryRequest);
assertEquals("Should return HTTP 201 (Created)", HttpStatus.CREATED, adapterResponse.getResponseStatus());
}
@Test
public void shouldThrowErrorForEntryIdAlreadyExists() throws Exception {
mongodbFeedPublisher.setAllowOverrideId(true);
when(mongoTemplate.findOne(any(Query.class), any(Class.class), eq(COLLECTION_NAME))).thenReturn(persistedEntry);
AdapterResponse<Entry> adapterResponse = mongodbFeedPublisher.postEntry(postEntryRequest);
assertEquals("Should return HTTP 409 (Conflict)",HttpStatus.CONFLICT, adapterResponse.getResponseStatus() );
}
@Test(expected = UnsupportedOperationException.class)
public void shouldPutEntry() throws Exception {
mongodbFeedPublisher.putEntry(putEntryRequest);
}
@Test(expected = UnsupportedOperationException.class)
public void shouldDeleteEntry() throws Exception {
mongodbFeedPublisher.deleteEntry(deleteEntryRequest);
}
@Test(expected = UnsupportedOperationException.class)
public void shouldSetParameters() throws Exception {
Map<String, String> map = new HashMap<String, String>();
map.put("test1", "test2");
mongodbFeedPublisher.setParameters(map);
}
public Entry entry() {
final FOMEntry entry = new FOMEntry();
entry.setId(UUID.randomUUID().toString());
entry.setContent("testing");
entry.addCategory("category");
return entry;
}
}
}