From 74261f32bfbbef6b18d945fda42e714204001881 Mon Sep 17 00:00:00 2001 From: Robert Fletcher Date: Sat, 13 Mar 2021 11:51:58 -0800 Subject: [PATCH] Specs: add test coverage for FeedRepository * Add tests for `.fetch_by_ids`, `.delete`, `.list`, and `.in_group` * Rearrange test file to mirror ordering of class * Fix deprecation warning for `lower(name)` * Refactor `in_group` query to use AR syntax --- app/repositories/feed_repository.rb | 4 +- spec/repositories/feed_repository_spec.rb | 91 +++++++++++++++++++---- 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/app/repositories/feed_repository.rb b/app/repositories/feed_repository.rb index dcce4fcdd..5deee8e22 100644 --- a/app/repositories/feed_repository.rb +++ b/app/repositories/feed_repository.rb @@ -35,11 +35,11 @@ def self.set_status(status, feed) end def self.list - Feed.order("lower(name)") + Feed.order(Feed.arel_table[:name].lower) end def self.in_group - Feed.where("group_id IS NOT NULL") + Feed.where.not(group_id: nil) end def self.valid_timestamp?(new_timestamp, current_timestamp) diff --git a/spec/repositories/feed_repository_spec.rb b/spec/repositories/feed_repository_spec.rb index 1951019f5..5f9b32138 100644 --- a/spec/repositories/feed_repository_spec.rb +++ b/spec/repositories/feed_repository_spec.rb @@ -4,6 +4,49 @@ app_require "repositories/feed_repository" describe FeedRepository do + describe ".fetch" do + let(:feed) { Feed.new(id: 1) } + + it "finds by id" do + expect(Feed).to receive(:find).with(feed.id).and_return(feed) + FeedRepository.fetch(feed.id) + end + + it "returns found feed" do + allow(Feed).to receive(:find).with(feed.id).and_return(feed) + + result = FeedRepository.fetch(feed.id) + + expect(result).to eq feed + end + end + + describe ".fetch_by_ids" do + it "finds all feeds by id" do + feeds = [create_feed, create_feed] + + expect(FeedRepository.fetch_by_ids(feeds.map(&:id))).to match_array(feeds) + end + + it "does not find other feeds" do + feed_1 = create_feed + create_feed + + expect(FeedRepository.fetch_by_ids(feed_1.id)).to eq([feed_1]) + end + end + + describe ".update_feed" do + it "saves the name and url" do + feed = Feed.new + + FeedRepository.update_feed(feed, "Test Feed", "example.com/feed") + + expect(feed.name).to eq "Test Feed" + expect(feed.url).to eq "example.com/feed" + end + end + describe ".update_last_fetched" do let(:timestamp) { Time.now } @@ -43,31 +86,49 @@ end end - describe ".update_feed" do - it "saves the name and url" do - feed = Feed.new + describe ".delete" do + it "deletes the feed by id" do + feed = create_feed - FeedRepository.update_feed(feed, "Test Feed", "example.com/feed") + FeedRepository.delete(feed.id) - expect(feed.name).to eq "Test Feed" - expect(feed.url).to eq "example.com/feed" + expect(Feed.unscoped.find_by(id: feed.id)).to be_nil + end + + it "does not delete other feeds" do + feed_1 = create_feed + feed_2 = create_feed + + FeedRepository.delete(feed_1.id) + + expect(Feed.unscoped.find_by(id: feed_2.id)).to eq(feed_2) end end - describe "fetch" do - let(:feed) { Feed.new(id: 1) } + describe ".list" do + it "returns all feeds ordered by name, case insensitive" do + feed_1 = create_feed(name: "foo") + feed_2 = create_feed(name: "Fabulous") + feed_3 = create_feed(name: "Zooby") + feed_4 = create_feed(name: "zabby") - it "finds by id" do - expect(Feed).to receive(:find).with(feed.id).and_return(feed) - FeedRepository.fetch(feed.id) + expect(FeedRepository.list).to eq([feed_2, feed_1, feed_4, feed_3]) end + end - it "returns found feed" do - allow(Feed).to receive(:find).with(feed.id).and_return(feed) + describe ".in_group" do + it "returns feeds that are in a group" do + feed_1 = create_feed(group_id: 5) + feed_2 = create_feed(group_id: 6) - result = FeedRepository.fetch(feed.id) + expect(FeedRepository.in_group).to match_array([feed_1, feed_2]) + end - expect(result).to eq feed + it "does not return feeds that are not in a group" do + create_feed + create_feed + + expect(FeedRepository.in_group).to be_empty end end end