spec/feedjira/feed_spec.rb in feedjira-2.2.0 vs spec/feedjira/feed_spec.rb in feedjira-3.0.0.beta1
- old
+ new
@@ -1,263 +1,49 @@
-require 'spec_helper'
+require "spec_helper"
-# rubocop:disable Style/BlockDelimiters
-
class Hell < StandardError; end
class FailParser
def self.parse(_, &on_failure)
- on_failure.call 'this parser always fails.'
+ on_failure.call "this parser always fails."
end
end
describe Feedjira::Feed do
- describe '.fetch_and_parse' do
- it 'raises an error when the fetch fails' do
- VCR.use_cassette('fetch_failure') do
- url = 'http://www.example.com/feed.xml'
- expect {
- Feedjira::Feed.fetch_and_parse url
- }.to raise_error Feedjira::FetchFailure
- end
- end
-
- it 'raises an error when no parser can be found' do
- VCR.use_cassette('parse_error') do
- url = 'http://feedjira.com'
- expect {
- Feedjira::Feed.fetch_and_parse url
- }.to raise_error Feedjira::NoParserAvailable
- end
- end
-
- it 'fetches and parses the feed' do
- VCR.use_cassette('success') do
- url = 'http://feedjira.com/blog/feed.xml'
- expected_time = DateTime.parse('Fri, 07 Oct 2016 14:37:00 GMT').to_time
- feed = Feedjira::Feed.fetch_and_parse url
-
- expect(feed.class).to eq Feedjira::Parser::Atom
- expect(feed.entries.count).to eq 4
- expect(feed.feed_url).to eq url
- expect(feed.etag).to eq('393e-53e4757c9db00-gzip')
- expect(feed.last_modified).to eq(expected_time)
- end
- end
- end
-
- describe '#add_common_feed_element' do
+ describe "#add_common_feed_element" do
before(:all) do
- Feedjira::Feed.add_common_feed_element('generator')
+ Feedjira::Feed.add_common_feed_element("generator")
end
- it 'should parse the added element out of Atom feeds' do
- expect(Feedjira::Feed.parse(sample_wfw_feed).generator).to eq 'TypePad'
+ it "should parse the added element out of Atom feeds" do
+ expect(Feedjira.parse(sample_wfw_feed).generator).to eq "TypePad"
end
- it 'should parse the added element out of Atom Feedburner feeds' do
+ it "should parse the added element out of Atom Feedburner feeds" do
expect(Feedjira::Parser::Atom.new).to respond_to(:generator)
end
- it 'should parse the added element out of RSS feeds' do
+ it "should parse the added element out of RSS feeds" do
expect(Feedjira::Parser::RSS.new).to respond_to(:generator)
end
end
- describe '#add_common_feed_entry_element' do
+ describe "#add_common_feed_entry_element" do
before(:all) do
- tag = 'wfw:commentRss'
+ tag = "wfw:commentRss"
Feedjira::Feed.add_common_feed_entry_element tag, as: :comment_rss
end
- it 'should parse the added element out of Atom feeds entries' do
- entry = Feedjira::Feed.parse(sample_wfw_feed).entries.first
- expect(entry.comment_rss).to eq 'this is the new val'
+ it "should parse the added element out of Atom feeds entries" do
+ entry = Feedjira.parse(sample_wfw_feed).entries.first
+ expect(entry.comment_rss).to eq "this is the new val"
end
- it 'should parse the added element out of Atom Feedburner feeds entries' do
+ it "should parse the added element out of Atom Feedburner feeds entries" do
expect(Feedjira::Parser::AtomEntry.new).to respond_to(:comment_rss)
end
- it 'should parse the added element out of RSS feeds entries' do
+ it "should parse the added element out of RSS feeds entries" do
expect(Feedjira::Parser::RSSEntry.new).to respond_to(:comment_rss)
end
end
-
- describe '#parse_with' do
- let(:xml) { '<xml></xml>' }
-
- it 'invokes the parser and passes the xml' do
- parser = double 'Parser', parse: nil
- expect(parser).to receive(:parse).with xml
- Feedjira::Feed.parse_with parser, xml
- end
-
- context 'with a callback block' do
- it 'passes the callback to the parser' do
- callback = ->(*) { raise Hell }
-
- expect do
- Feedjira::Feed.parse_with FailParser, xml, &callback
- end.to raise_error Hell
- end
- end
- end
-
- describe '#parse' do
- context "when there's an available parser" do
- it 'should parse an rdf feed' do
- feed = Feedjira::Feed.parse(sample_rdf_feed)
- expect(feed.title).to eq 'HREF Considered Harmful'
- published = Time.parse_safely('Tue Sep 02 19:50:07 UTC 2008')
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 10
- end
-
- it 'should parse an rss feed' do
- feed = Feedjira::Feed.parse(sample_rss_feed)
- expect(feed.title).to eq 'Tender Lovemaking'
- published = Time.parse_safely 'Thu Dec 04 17:17:49 UTC 2008'
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 10
- end
-
- it 'should parse an atom feed' do
- feed = Feedjira::Feed.parse(sample_atom_feed)
- expect(feed.title).to eq 'Amazon Web Services Blog'
- published = Time.parse_safely 'Fri Jan 16 18:21:00 UTC 2009'
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 10
- end
-
- it 'should parse an feedburner atom feed' do
- feed = Feedjira::Feed.parse(sample_feedburner_atom_feed)
- expect(feed.title).to eq 'Paul Dix Explains Nothing'
- published = Time.parse_safely 'Thu Jan 22 15:50:22 UTC 2009'
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 5
- end
-
- it 'should parse an itunes feed' do
- feed = Feedjira::Feed.parse(sample_itunes_feed)
- expect(feed.title).to eq 'All About Everything'
- published = Time.parse_safely 'Wed, 15 Jun 2005 19:00:00 GMT'
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 3
- end
-
- # rubocop:disable Metrics/LineLength
- it 'does not fail if multiple published dates exist and some are unparseable' do
- expect(Feedjira.logger).to receive(:warn).once
-
- feed = Feedjira::Feed.parse(sample_invalid_date_format_feed)
- expect(feed.title).to eq 'Invalid date format feed'
- published = Time.parse_safely 'Mon, 16 Oct 2017 15:10:00 GMT'
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 2
- end
- # rubocop:enable Metrics/LineLength
- end
-
- context "when there's no available parser" do
- it 'raises Feedjira::NoParserAvailable' do
- expect {
- Feedjira::Feed.parse("I'm an invalid feed")
- }.to raise_error(Feedjira::NoParserAvailable)
- end
- end
-
- it 'should parse an feedburner rss feed' do
- feed = Feedjira::Feed.parse(sample_rss_feed_burner_feed)
- expect(feed.title).to eq 'TechCrunch'
- published = Time.parse_safely 'Wed Nov 02 17:25:27 UTC 2011'
- expect(feed.entries.first.published).to eq published
- expect(feed.entries.size).to eq 20
- end
- end
-
- describe '#determine_feed_parser_for_xml' do
- it 'with Google Docs atom feed it returns the GoogleDocsAtom parser' do
- xml = sample_google_docs_list_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::GoogleDocsAtom
- end
-
- it 'with an atom feed it returns the Atom parser' do
- xml = sample_atom_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::Atom
- end
-
- it 'with an atom feedburner feed it returns the AtomFeedBurner parser' do
- xml = sample_feedburner_atom_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::AtomFeedBurner
- end
-
- it 'with an rdf feed it returns the RSS parser' do
- xml = sample_rdf_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::RSS
- end
-
- it 'with an rss feedburner feed it returns the RSSFeedBurner parser' do
- xml = sample_rss_feed_burner_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::RSSFeedBurner
- end
-
- it 'with an rss 2.0 feed it returns the RSS parser' do
- xml = sample_rss_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::RSS
- end
-
- it 'with an itunes feed it returns the RSS parser' do
- xml = sample_itunes_feed
- actual_parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(actual_parser).to eq Feedjira::Parser::ITunesRSS
- end
- end
-
- describe 'when adding feed types' do
- it 'should prioritize added types over the built in ones' do
- xml = 'Atom asdf'
- allow(Feedjira::Parser::Atom).to receive(:able_to_parse?).and_return(true)
- new_parser = Class.new do
- def self.able_to_parse?(_)
- true
- end
- end
-
- expect(new_parser).to be_able_to_parse(xml)
-
- Feedjira::Feed.add_feed_class(new_parser)
-
- parser = Feedjira::Feed.determine_feed_parser_for_xml xml
- expect(parser).to eq new_parser
-
- Feedjira::Feed.reset_parsers!
- end
- end
-
- describe 'when parsers are configured' do
- it 'does not use default parsers' do
- xml = 'Atom asdf'
- new_parser = Class.new do
- def self.able_to_parse?(_)
- true
- end
- end
-
- Feedjira.configure { |config| config.parsers = [new_parser] }
-
- parser = Feedjira::Feed.determine_feed_parser_for_xml(xml)
- expect(parser).to eq(new_parser)
-
- Feedjira.reset_configuration!
- Feedjira::Feed.reset_parsers!
- end
- end
end
-
-# rubocop:enable Style/BlockDelimiters