docbrown/spec/services/rss_reader_spec.rb
Vaidehi Joshi c7a1bd9449
Fix logging for dev and test environments (#5922)
* Fix logging for dev and test environments

We had some unused code for Timber in our config files for development and test.
However, this was completely clobbering Rails' default behavior of logging out to log/development.log and log/test.log. We should allow for logging in these environments in particular, and since we're not using Timber there, we can just revert to using the Rails default debugging log levels.

* Add Timber logger to specs that explicitly require it

* Restore default Rails.logger in specs using Timber logger

* Explicitly use Rails.logger in OmniauthCallbacksController

We seem to have different logger classes leaking into this controller in tests.
I'm not entirely sure why this is/haven't been able to investigate yet, but I do think we should be using the Rails.logger explicitly until we can figure that out.
2020-02-07 10:15:08 -05:00

142 lines
4.8 KiB
Ruby

require "rails_helper"
require "rss"
vcr_option = {
cassette_name: "rss_feeds",
allow_playback_repeats: "true"
}
default_logger = Rails.logger
RSpec.describe RssReader, type: :service, vcr: vcr_option do
let(:link) { "https://medium.com/feed/@vaidehijoshi" }
let(:nonmedium_link) { "https://circleci.com/blog/feed.xml" }
let(:nonpermanent_link) { "https://medium.com/feed/@macsiri/" }
let(:rss_data) { RSS::Parser.parse(HTTParty.get(link).body, false) }
# Override the default Rails logger as these tests require the Timber logger.
before do
timber_logger = Timber::Logger.new(nil)
Rails.logger = ActiveSupport::TaggedLogging.new(timber_logger)
end
after { Rails.logger = default_logger }
describe "#get_all_articles" do
before do
[link, nonmedium_link, nonpermanent_link].each do |feed_url|
create(:user, feed_url: feed_url)
end
end
it "fetch only articles from an feed_url" do
described_class.get_all_articles
# the result within the approval file depends on the feed
# not fetching comments is baked into this
verify(format: :txt) { Article.count }
end
it "does not re-create article if it already exist" do
described_class.new.get_all_articles
expect { described_class.new.get_all_articles }.not_to change(Article, :count)
end
it "parses correctly" do
described_class.new.get_all_articles
verify format: :txt do
User.find_by(feed_url: nonpermanent_link).articles.first.body_markdown
end
end
it "sets time current" do
described_class.new.get_all_articles
expect(User.find_by(feed_url: nonpermanent_link).feed_fetched_at).to be > 2.minutes.ago
end
it "does refetch same user over and over by default" do
user = User.find_by(feed_url: nonpermanent_link)
Timecop.freeze(Time.current) do
user.update_column(:feed_fetched_at, Time.current)
fetched_at_time = user.reload.feed_fetched_at
# travel a few seconds in the future to simulate a new time
3.times do |i|
Timecop.travel((i + 5).seconds.from_now) { described_class.new.get_all_articles }
end
expect(user.reload.feed_fetched_at > fetched_at_time).to be(true)
end
end
it "logs an article creation error" do
reader = described_class.new
allow(reader).to receive(:make_from_rss_item).and_raise(StandardError)
allow(Rails.logger).to receive(:error)
reader.get_all_articles
expect(Rails.logger).to have_received(:error).at_least(:once)
end
it "logs a fetching error" do
reader = described_class.new
allow(reader).to receive(:fetch_rss).and_raise(StandardError)
allow(Rails.logger).to receive(:error)
reader.get_all_articles
expect(Rails.logger).to have_received(:error).at_least(:once)
end
end
context "when feed_referential_link is false" do
it "does not self-reference links for user" do
# Article.find_by is used by find_and_replace_possible_links!
# checking it's invocation s a shortcut to testing the functionality.
allow(Article).to receive(:find_by).and_call_original
create(:user, feed_url: nonpermanent_link, feed_referential_link: false)
described_class.get_all_articles
expect(Article).not_to have_received(:find_by)
end
end
describe "#fetch_user" do
before do
[link, nonmedium_link, nonpermanent_link].each do |feed_url|
create(:user, feed_url: feed_url)
end
end
it "gets articles for user" do
# the result within the approval file depends on the feed
described_class.new.fetch_user(User.first)
verify(format: :txt) { Article.count }
end
it "does not set featured_number" do
described_class.new.fetch_user(User.first)
expect(Article.all.map(&:featured_number).uniq).to eq([nil])
end
it "logs an article creation error on the standard logger" do
reader = described_class.new
allow(reader).to receive(:make_from_rss_item).and_raise(StandardError)
allow(Rails.logger).to receive(:error)
reader.fetch_user(User.first)
expect(Rails.logger).to have_received(:error).at_least(:once)
end
it "logs a fetching error on the standard logger" do
reader = described_class.new
allow(reader).to receive(:fetch_rss).and_raise(StandardError)
allow(Rails.logger).to receive(:error)
reader.fetch_user(User.first)
expect(Rails.logger).to have_received(:error).at_least(:once)
end
end
describe "#valid_feed_url?" do
it "returns true on valid feed url" do
expect(described_class.new.valid_feed_url?(link)).to be true
end
it "returns false on invalid feed url" do
bad_link = "www.google.com"
expect(described_class.new.valid_feed_url?(bad_link)).to be false
end
end
end