/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.shindig.gadgets; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import org.json.JSONArray; import org.json.JSONObject; import org.junit.Test; /** * Tests for FeedProcessor */ public class FeedProcessorTest { private final static String FEED_TITLE = "Example Feed"; private final static String FEED_AUTHOR = "John Doe"; private final static String FEED_AUTHOR_EMAIL = "john.doe@example.com"; private final static String FEED_ENTRY_TITLE = "Atom-Powered Robots Run Amok"; private final static String FEED_ENTRY_LINK = "http://example.org/2003/12/13/entry03"; private final static String FEED_ENTRY_SUMMARY = "Some text."; private final static String URL_RSS = "http://www.example.com/rss.xml"; private final static long TIMESTAMP = 1212790800000L; private final static String DATE_RSS = "Fri, 06 Jun 2008 22:20:00 GMT"; private final static String DATA_RSS = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<rss version=\"2.0\"><channel>" + "<title>" + FEED_TITLE + "</title>" + "<link>http://example.org/</link>" + "<description>Example RSS Feed</description>" + "<pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate>" + "<item>" + "<title>" + FEED_ENTRY_TITLE + "</title>" + "<link>" + FEED_ENTRY_LINK + "</link>" + "<guid>" + FEED_ENTRY_LINK + "#item1" + "</guid>" + "<pubDate>" + DATE_RSS + "</pubDate>" + "<description>" + FEED_ENTRY_SUMMARY + "</description>" + "<author>" + FEED_AUTHOR_EMAIL + "</author>" + "</item>" + "<item>" + "<title>" + FEED_ENTRY_TITLE + "</title>" + "<link>" + FEED_ENTRY_LINK + "</link>" + "<guid>" + FEED_ENTRY_LINK + "#item1" + "</guid>" + "<description>" + FEED_ENTRY_SUMMARY + "</description>" + "</item>" + "</channel></rss>"; private final static String URL_ATOM = "http://www.example.com/feed.atom"; private final static String DATE_ATOM = "2008-06-06T22:20:00Z"; private final static String DATA_ATOM = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<feed xmlns=\"http://www.w3.org/2005/Atom\">" + "<title>" + FEED_TITLE + "</title>" + "<link href=\"http://example.org/\"/>" + "<updated>2003-12-13T18:30:02Z</updated>" + "<id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>" + "<author><name>" + FEED_AUTHOR + "</name></author>" + "<entry>" + "<title>" + FEED_ENTRY_TITLE + "</title>" + "<link href=\"" + FEED_ENTRY_LINK + "\"/>" + "<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>" + "<updated>" + DATE_ATOM + "</updated>" + "<summary>" + FEED_ENTRY_SUMMARY + "</summary>" + "</entry>" + "<entry>" + "<title>" + FEED_ENTRY_TITLE + "</title>" + "<link href=\"" + FEED_ENTRY_LINK + "\"/>" + "<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da3443fa6a</id>" + "<summary>" + FEED_ENTRY_SUMMARY + "</summary>" + "</entry>" + "</feed>"; private final static String BAD_XML = "broken xml !!!! & ><"; private final static String INVALID_XML = "<data><foo/></data>"; private final FeedProcessor processor; public FeedProcessorTest() { processor = new FeedProcessor(); } @Test public void parseRss() throws Exception { JSONObject feed = processor.process(URL_RSS, DATA_RSS, true, 1); assertEquals(URL_RSS, feed.getString("URL")); assertEquals(FEED_TITLE, feed.getString("Title")); assertEquals(FEED_AUTHOR_EMAIL, feed.getString("Author")); JSONArray entryArray = feed.getJSONArray("Entry"); JSONObject entry = entryArray.getJSONObject(0); assertEquals(1, entryArray.length()); assertEquals(FEED_ENTRY_TITLE, entry.getString("Title")); assertEquals(FEED_ENTRY_LINK, entry.getString("Link")); assertEquals(FEED_ENTRY_SUMMARY, entry.getString("Summary")); } @Test public void parseRssMultiple() throws Exception { JSONObject feed = processor.process(URL_RSS, DATA_RSS, true, 2); JSONArray entryArray = feed.getJSONArray("Entry"); assertEquals(2, entryArray.length()); } @Test public void parseRssDate() throws Exception { JSONObject feed = processor.process(URL_RSS, DATA_RSS, true, 2); JSONArray entryArray = feed.getJSONArray("Entry"); assertEquals(TIMESTAMP, entryArray.getJSONObject(0).getLong("Date")); assertEquals(0, entryArray.getJSONObject(1).getLong("Date")); } @Test public void parseRssNoSummaries() throws Exception { JSONObject feed = processor.process(URL_RSS, DATA_RSS, false, 1); feed.getJSONArray("Entry"); JSONObject entry = feed.getJSONArray("Entry").getJSONObject(0); assertNull("Summary should not be returned when getSummaries is false", entry.optString("Summary", null)); } @Test public void parseAtom() throws Exception { JSONObject feed = processor.process(URL_ATOM, DATA_ATOM, true, 1); assertEquals(URL_ATOM, feed.getString("URL")); assertEquals(FEED_TITLE, feed.getString("Title")); assertEquals(FEED_AUTHOR, feed.getString("Author")); JSONArray entryArray = feed.getJSONArray("Entry"); JSONObject entry = entryArray.getJSONObject(0); assertEquals(1, entryArray.length()); assertEquals(FEED_ENTRY_TITLE, entry.getString("Title")); assertEquals(FEED_ENTRY_LINK, entry.getString("Link")); assertEquals(FEED_ENTRY_SUMMARY, entry.getString("Summary")); } @Test public void parseAtomMultiple() throws Exception { JSONObject feed = processor.process(URL_ATOM, DATA_ATOM, true, 2); JSONArray entryArray = feed.getJSONArray("Entry"); assertEquals(2, entryArray.length()); } @Test public void parseAtomDate() throws Exception { JSONObject feed = processor.process(URL_ATOM, DATA_ATOM, true, 2); JSONArray entryArray = feed.getJSONArray("Entry"); assertEquals(TIMESTAMP, entryArray.getJSONObject(0).getLong("Date")); assertEquals(0, entryArray.getJSONObject(1).getLong("Date")); } @Test public void parseAtomNoSummaries() throws Exception { JSONObject feed = processor.process(URL_ATOM, DATA_ATOM, false, 1); feed.getJSONArray("Entry"); JSONObject entry = feed.getJSONArray("Entry").getJSONObject(0); assertNull("Summary should not be returned when getSummaries is false", entry.optString("Summary", null)); } @Test(expected=GadgetException.class) public void parseBadXml() throws GadgetException { processor.process(URL_RSS, BAD_XML, false, 1); } @Test(expected=GadgetException.class) public void parseInvalidXml() throws GadgetException { processor.process(URL_RSS, INVALID_XML, false, 1); } }