require File.join(File.dirname(__FILE__), %w[.. spec_helper]) describe Feedzirra::FeedUtilities do before do @klass = Class.new do include Feedzirra::FeedUtilities end @feed = @klass.new end describe "instance methods" do it "should provide an updated? accessor" do @feed.should_not be_updated @feed.updated = true @feed.should be_updated end it "should provide an etag accessor" do @feed.etag = "foo" @feed.etag.should == "foo" end it "should provide a last_modified accessor" do @feed = @klass.new time = Time.now @feed.last_modified = time @feed.last_modified.should == time end it "should return new_entries? as true when entries are put into new_entries" do @feed = @klass.new feed_entry = Feedzirra::Parser::AtomEntry.new @feed.instance_variable_set(:@entries, [ feed_entry ]) @feed.should have_new_entries end it "should return a last_modified value from the entry with the most recent published date if the last_modified date hasn't been set" do feed = Feedzirra::Parser::Atom.new entry =Feedzirra::Parser::AtomEntry.new entry.published = Time.now.to_s feed.entries << entry feed.last_modified.should == entry.published end it "should not throw an error if one of the entries has published date of nil" do feed = Feedzirra::Parser::Atom.new entry = Feedzirra::Parser::AtomEntry.new entry.published = Time.now.to_s feed.entries << entry feed.entries << Feedzirra::Parser::AtomEntry.new feed.last_modified.should == entry.published end end describe "#mark_all_entries_old!" do before do @mock_entry = mock('entry') @feed.entries = [ @mock_entry ] end it "should call #mark_old! on all entries" do @mock_entry.expects(:mark_old!) @feed.mark_all_entries_old! end end describe "#mark_all_entries_new!" do before do @mock_entry = mock('entry') @feed.entries = [ @mock_entry ] end it "should call #mark_new! on all entries" do @mock_entry.expects(:mark_new!) @feed.mark_all_entries_new! end end describe "#update_from_feed" do describe "updating feed attributes" do before do # I'm using the Atom class when I know I should be using a different one. However, this update_from_feed # method would only be called against a feed item. @feed = Feedzirra::Parser::Atom.new @feed.title = "A title" @feed.url = "http://pauldix.net" @feed.feed_url = "http://feeds.feedburner.com/PaulDixExplainsNothing" @feed.updated = false @updated_feed = @feed.dup end it "should update the title if changed" do @updated_feed.title = "new title" @feed.update_from_feed(@updated_feed) @feed.title.should == @updated_feed.title @feed.should be_updated end it "should not update the title if the same" do @feed.update_from_feed(@updated_feed) @feed.should_not be_updated end it "should update the feed_url if changed" do @updated_feed.feed_url = "a new feed url" @feed.update_from_feed(@updated_feed) @feed.feed_url.should == @updated_feed.feed_url @feed.should be_updated end it "should not update the feed_url if the same" do @feed.update_from_feed(@updated_feed) @feed.should_not be_updated end it "should update the url if changed" do @updated_feed.url = "a new url" @feed.update_from_feed(@updated_feed) @feed.url.should == @updated_feed.url end it "should not update the url if not changed" do @feed.update_from_feed(@updated_feed) @feed.should_not be_updated end end describe "updating entries" do before do # I'm using the Atom class when I know I should be using a different one. However, this update_from_feed # method would only be called against a feed item. @feed = Feedzirra::Parser::Atom.new @feed.title = "A title" @feed.url = "http://pauldix.net" @feed.feed_url = "http://feeds.feedburner.com/PaulDixExplainsNothing" @feed.updated = false # Using a clone or dup would only copy references to instance variables in the # object, so we serialize and deserialize it here to avoid problems caused by # variable references being passed around. @updated_feed = Marshal.load(Marshal.dump(@feed)) @old_entry = Feedzirra::Parser::AtomEntry.new @old_entry.url = "http://pauldix.net/old.html" @old_entry.published = Time.now.to_s @new_entry = Feedzirra::Parser::AtomEntry.new @new_entry.url = "http://pauldix.net/new.html" @new_entry.published = (Time.now + 10).to_s @feed.entries << @old_entry @updated_feed.entries << @old_entry @updated_feed.entries << @new_entry end it "should update last-modified from the latest entry date" do @feed.update_from_feed(@updated_feed) @feed.last_modified.should == @new_entry.published end it "should put new entries into new_entries" do @feed.update_from_feed(@updated_feed) @feed.new_entries.should == [@new_entry] end it "should also put new entries into the entries collection" do @feed.update_from_feed(@updated_feed) @feed.entries.should include(@new_entry) @feed.entries.should include(@old_entry) end end end end