package org.atomhopper.jdbc.adapter; import java.util.*; import static junit.framework.Assert.assertEquals; import org.apache.abdera.model.Entry; import org.apache.abdera.parser.stax.FOMEntry; import org.atomhopper.adapter.request.adapter.DeleteEntryRequest; import org.atomhopper.adapter.request.adapter.PostEntryRequest; import org.atomhopper.adapter.request.adapter.PutEntryRequest; import org.atomhopper.jdbc.model.PersistedEntry; import org.atomhopper.jdbc.query.PostgreSQLTextArray; 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 junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.springframework.dao.DuplicateKeyException; import org.springframework.http.HttpStatus; import org.springframework.jdbc.core.JdbcTemplate; @RunWith(Enclosed.class) public class JdbcFeedPublisherTest { public static class WhenPostingEntries { private PutEntryRequest putEntryRequest; private DeleteEntryRequest deleteEntryRequest; private JdbcFeedPublisher jdbcFeedPublisher; private PostEntryRequest postEntryRequest; private JdbcTemplate jdbcTemplate; 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 PersistedEntry persistedEntry; private List<PersistedEntry> entryList; @Before public void setUp() throws Exception { putEntryRequest = mock(PutEntryRequest.class); deleteEntryRequest = mock(DeleteEntryRequest.class); jdbcTemplate = mock(JdbcTemplate.class); jdbcFeedPublisher = new JdbcFeedPublisher(); jdbcFeedPublisher.setJdbcTemplate(jdbcTemplate); postEntryRequest = mock(PostEntryRequest.class); when(postEntryRequest.getEntry()).thenReturn(entry()); when(postEntryRequest.getFeedName()).thenReturn("namespace/feed"); persistedEntry = new PersistedEntry(); persistedEntry.setFeed(FEED_NAME); persistedEntry.setEntryId(MARKER_ID); persistedEntry.setEntryBody(ENTRY_BODY); entryList = new ArrayList<PersistedEntry>(); entryList.add(persistedEntry); } @Test( expected = IllegalArgumentException.class ) public void shouldThrowExceptionForPrefixColumnMap() throws Exception { jdbcFeedPublisher.setDelimiter( ":" ); jdbcFeedPublisher.afterPropertiesSet(); } @Test( expected = IllegalArgumentException.class ) public void shouldThrowExceptionForDelimiter() throws Exception { Map<String, String> map = new HashMap<String, String>(); map.put( "test1", "testA" ); jdbcFeedPublisher.setPrefixColumnMap( map ); jdbcFeedPublisher.afterPropertiesSet(); } @Test public void shouldReturnHTTPCreated() throws Exception { AdapterResponse<Entry> adapterResponse = jdbcFeedPublisher.postEntry(postEntryRequest); assertEquals("Should return HTTP 201 (Created)", HttpStatus.CREATED, adapterResponse.getResponseStatus()); } @Test public void shouldThrowErrorForEntryIdAlreadyExists() throws Exception { jdbcFeedPublisher.setAllowOverrideId(true); // there are now 2 flavors of jdbcTemplate.update() when(jdbcTemplate.update(anyString(), new Object[]{ anyString(), anyString(), anyString(), any(PostgreSQLTextArray.class) })).thenThrow(new DuplicateKeyException("duplicate entry")); when(jdbcTemplate.update(anyString(), new Object[]{ anyString(), any(java.util.Date.class), any(java.util.Date.class), anyString(), anyString(), any(PostgreSQLTextArray.class) })).thenThrow(new DuplicateKeyException("duplicate entry")); AdapterResponse<Entry> adapterResponse = jdbcFeedPublisher.postEntry(postEntryRequest); assertEquals("Should return HTTP 409 (Conflict)", HttpStatus.CONFLICT, adapterResponse.getResponseStatus()); } @Test public void shouldNotLowerCaseCategoryInPrefixMap() throws Exception { Map<String, String> prefixMap = new HashMap<String, String>(); prefixMap.put("foo", "bar"); prefixMap.put("gee", "wish"); jdbcFeedPublisher.setPrefixColumnMap(prefixMap); List<org.apache.abdera.model.Category> categories = new ArrayList<org.apache.abdera.model.Category>(); org.apache.abdera.model.Category cat1 = mock(org.apache.abdera.parser.stax.FOMCategory.class); org.apache.abdera.model.Category cat2 = mock(org.apache.abdera.parser.stax.FOMCategory.class); when(cat1.getTerm()).thenReturn("foo:myCamelCaseFoo"); when(cat2.getTerm()).thenReturn("gee:myCamelCaseGee"); categories.add(cat1); categories.add(cat2); String[] results = jdbcFeedPublisher.processCategories(categories); assertNotNull("processCategories() should return non null results", results); assertEquals("processCategories() should return array of length 2", results.length, 2); List<String> resultsArray = Arrays.asList(results); for (org.apache.abdera.model.Category cat: categories) { assertTrue("category '" + cat.getTerm() + "' should be in the original categories", resultsArray.contains(cat.getTerm())); } } @Test public void shouldLowerCaseCategory() throws Exception { Map<String, String> prefixMap = new HashMap<String, String>(); prefixMap.put("foo", "bar"); prefixMap.put("gee", "wish"); jdbcFeedPublisher.setPrefixColumnMap(prefixMap); String camelCase = "myCamelCaseFood"; String toBeLowerCase = "toBeLowerCase"; List<org.apache.abdera.model.Category> categories = new ArrayList<org.apache.abdera.model.Category>(); org.apache.abdera.model.Category cat1 = mock(org.apache.abdera.parser.stax.FOMCategory.class); org.apache.abdera.model.Category cat2 = mock(org.apache.abdera.parser.stax.FOMCategory.class); when(cat1.getTerm()).thenReturn("foo:" + camelCase); when(cat2.getTerm()).thenReturn("cat2:" + toBeLowerCase); categories.add(cat1); categories.add(cat2); String[] results = jdbcFeedPublisher.processCategories(categories); assertNotNull("processCategories() should return non null results", results); assertEquals("processCategories() should return array of length 2", results.length, 2); for (int idx=0; idx<results.length; idx++) { if ( results[idx].startsWith("cat2:")) { assertEquals("result '" + results[idx] + "' should be in lower case", results[idx], "cat2:" + toBeLowerCase.toLowerCase()); } } } @Test(expected = UnsupportedOperationException.class) public void shouldPutEntry() throws Exception { jdbcFeedPublisher.putEntry(putEntryRequest); } @Test(expected = UnsupportedOperationException.class) public void shouldDeleteEntry() throws Exception { jdbcFeedPublisher.deleteEntry(deleteEntryRequest); } @Test(expected = UnsupportedOperationException.class) public void shouldSetParameters() throws Exception { Map<String, String> map = new HashMap<String, String>(); map.put("test1", "test2"); jdbcFeedPublisher.setParameters(map); } public Entry entry() { final FOMEntry entry = new FOMEntry(); entry.setId(UUID.randomUUID().toString()); entry.setContent("testing"); entry.addCategory("category"); return entry; } } }