package org.eclipse.recommenders.news.impl.poll; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import org.eclipse.recommenders.news.api.NewsItem; import org.junit.Test; public class DefaultFeedItemStoreTest { private static final URI FEED_URI = URI.create("http://www.example.org/feed.xml"); private static final NewsItem FIRST_ITEM = new NewsItem("Item 1", new Date(0L), URI.create("http://www.example.org/items/1"), null); private static final NewsItem SECOND_ITEM = new NewsItem("Item 2", new Date(1000L), URI.create("http://www.example.org/items/2"), null); @Test public void testUpdateWithAddedItems() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM), null); List<NewsItem> newItems = sut.udpate(FEED_URI, asInputStream(FIRST_ITEM, SECOND_ITEM), null); assertThat(newItems, contains(SECOND_ITEM)); assertThat(newItems, hasSize(1)); } @Test public void testUpdateWithRemovedItems() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM, SECOND_ITEM), null); List<NewsItem> newItems = sut.udpate(FEED_URI, asInputStream(SECOND_ITEM), null); assertThat(newItems, hasSize(0)); } @Test public void testUpdateWithoutChanges() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM, SECOND_ITEM), null); List<NewsItem> newItems = sut.udpate(FEED_URI, asInputStream(FIRST_ITEM, SECOND_ITEM), null); assertThat(newItems, hasSize(0)); } @Test public void testGetFeedItemsWithoutUpdate() { DefaultFeedItemStore sut = new DefaultFeedItemStore(); List<NewsItem> items = sut.getNewsItems(FEED_URI); assertThat(items, hasSize(0)); } @Test public void testGetFeedItemsAfterEmptyUpdate() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(), null); List<NewsItem> items = sut.getNewsItems(FEED_URI); assertThat(items, hasSize(0)); } @Test public void testGetFeedItemsAfterSingleUpdate() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM), null); List<NewsItem> items = sut.getNewsItems(FEED_URI); assertThat(items, contains(FIRST_ITEM)); assertThat(items, hasSize(1)); } @Test public void testGetFeedItemsAfterTwoComplementaryUpdates() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM), null); sut.udpate(FEED_URI, asInputStream(SECOND_ITEM), null); List<NewsItem> items = sut.getNewsItems(FEED_URI); assertThat(items, contains(SECOND_ITEM)); assertThat(items, hasSize(1)); } @Test public void testGetFeedItemsAfterTwoIncrementalUpdates() throws Exception { DefaultFeedItemStore sut = new DefaultFeedItemStore(); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM), null); sut.udpate(FEED_URI, asInputStream(FIRST_ITEM, SECOND_ITEM), null); List<NewsItem> items = sut.getNewsItems(FEED_URI); assertThat(items, contains(FIRST_ITEM, SECOND_ITEM)); assertThat(items, hasSize(2)); } private static InputStream asInputStream(NewsItem... items) { DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); StringBuilder rss = new StringBuilder(); rss.append("<?xml version='1.0' encoding='UTF-8'?>"); rss.append("<rss version='2.0'>"); rss.append("<channel>"); rss.append("<title>Feed</title>"); for (NewsItem item : items) { rss.append("<item>"); rss.append("<title>").append(item.getTitle()).append("</title>"); rss.append("<pubDate>").append(formatter.format(item.getDate())).append("</pubDate>"); rss.append("<link>").append(item.getUri().toString()).append("</link>"); rss.append("</item>"); } rss.append("</channel>"); rss.append("</rss>"); return new ByteArrayInputStream(rss.toString().getBytes(StandardCharsets.UTF_8)); } }