Skip to content

Commit

Permalink
Change FindsOrCreatesFeeds to a FeedService object
Browse files Browse the repository at this point in the history
  • Loading branch information
gavinlaking authored and carols10cents committed Nov 16, 2012
1 parent ffbb21d commit ff0d242
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 99 deletions.
8 changes: 4 additions & 4 deletions app/controllers/subscriptions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,17 @@ def post_update
def create
require_login! :return => request.referrer

subscribe_to_feed = FindsOrCreatesFeeds.find_or_create(params[:subscribe_to])
target = FeedService.new(params[:subscribe_to]).find_or_create!

# Stop and return a nice message if already following this feed
if current_user.following_feed? subscribe_to_feed
flash[:notice] = "You're already following #{subscribe_to_feed.author.username}."
if current_user.following_feed? target
flash[:notice] = "You're already following #{target.author.username}."
redirect_to request.referrer
return
end

# Actually follow!
f = current_user.follow! subscribe_to_feed
f = current_user.follow! target

unless f
flash[:error] = "There was a problem following #{params[:subscribe_to]}."
Expand Down
2 changes: 0 additions & 2 deletions app/models/feed.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require_relative '../../lib/finds_or_creates_feeds'

# Feeds are pretty central to everything. They're a representation of a PuSH
# enabled Atom feed. Every user has a feed of their updates, we keep feeds
# for remote users that our users are subscribed to, and maybe even other
Expand Down
33 changes: 33 additions & 0 deletions app/services/feed_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
require_relative '../../lib/converts_subscriber_to_feed_data'

class FeedService
def initialize(target_feed)
@target_feed = target_feed
end

def find_or_create!
find_feed_by_id ||
find_feed_by_remote_url ||
create_feed_from_feed_data
end

private

def find_feed_by_id
Feed.first(:id => @target_feed)
end

def find_feed_by_remote_url
feed_data = get_feed_data_for_target
Feed.first(:remote_url => feed_data.url)
end

def create_feed_from_feed_data
feed_data = get_feed_data_for_target
Feed.create_and_populate!(feed_data)
end

def get_feed_data_for_target
ConvertsSubscriberToFeedData.new(@target_feed).get_feed_data!
end
end
27 changes: 0 additions & 27 deletions lib/finds_or_creates_feeds.rb

This file was deleted.

3 changes: 1 addition & 2 deletions test/lib/converts_subscriber_to_feed_data_test.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
require 'minitest/autorun'
require 'mocha'
require 'socket'

require_relative '../../lib/finds_or_creates_feeds'
require_relative '../../lib/converts_subscriber_to_feed_data'

FakeFingerData = Struct.new(:url)

Expand Down
64 changes: 0 additions & 64 deletions test/lib/finds_or_creates_feeds_test.rb

This file was deleted.

60 changes: 60 additions & 0 deletions test/services/feed_service_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
require_relative '../test_helper'

require 'mocha'

describe FeedService do
include TestHelper

describe "#find_or_create!" do
let(:service) { FeedService.new(target_feed) }
let(:existing_feed) { mock }
let(:new_feed) { mock }

subject { service.find_or_create! }

describe "when the feed can be found by ID" do
# the BSON ID of user '[email protected]' (follow me!)
let(:target_feed) { "505cc1beb4f2cd000200022c" }

before do
service.stubs(:find_feed_by_id).returns(existing_feed)
end

it "the feed is returned" do
service.find_or_create!.must_equal existing_feed
subject
end
end

describe "when the feed can by found by remote URL" do
# the remote URL of user '[email protected]' (follow me!)
let(:target_feed) { "https://rstat.us/feeds/505cc1beb4f2cd000200022c.atom" }

before do
service.stubs(:find_feed_by_id).returns nil
service.stubs(:find_feed_by_remote_url).returns(existing_feed)
end

it "the feed is returned" do
service.find_or_create!.must_equal existing_feed
subject
end
end

describe "when the feed doesn't exist" do
let(:target_feed) { "[email protected]" } # (follow me!)

before do
service.stubs(:find_feed_by_id).returns nil
service.stubs(:find_feed_by_remote_url).returns nil
service.stubs(:create_feed_from_feed_data).returns(new_feed)
end

it "must be created instead" do
service.find_or_create!.must_equal new_feed
subject
end
end

end
end

0 comments on commit ff0d242

Please sign in to comment.