Skip to content

Commit

Permalink
Fixes Issue hotsh#698, the [email protected] case. Check for exis…
Browse files Browse the repository at this point in the history
…ting users when domain entered is the current one.
  • Loading branch information
carols10cents committed Nov 17, 2012
1 parent 62d0780 commit c4eba18
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 14 deletions.
2 changes: 1 addition & 1 deletion app/controllers/subscriptions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def post_update
def create
require_login! :return => request.referrer

target = FeedService.new(params[:subscribe_to]).find_or_create!
target = FeedService.new(params[:subscribe_to], root_url).find_or_create!

if current_user.following_feed? target
# Stop and return a nice message if already following this feed
Expand Down
19 changes: 16 additions & 3 deletions app/services/feed_service.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
require 'uri'

class FeedService
def initialize(target_feed)
def initialize(target_feed, current_node_domain = nil)
@target_feed = target_feed
@current_node_domain = current_node_domain
end

def find_or_create!
find_feed_by_id ||
find_feed_by_remote_url ||
find_feed_by_id ||
find_feed_by_username ||
find_feed_by_remote_url ||
create_feed_from_feed_data
end

Expand All @@ -15,6 +19,15 @@ def find_feed_by_id
Feed.first(:id => @target_feed)
end

def find_feed_by_username
username, domain = @target_feed.split /@/

if @current_node_domain && domain == URI(@current_node_domain).host
u = User.find_by_case_insensitive_username(username)
u && u.author.feed
end
end

def find_feed_by_remote_url
feed_data = get_feed_data_for_target
Feed.first(:remote_url => feed_data.url)
Expand Down
4 changes: 3 additions & 1 deletion test/acceptance/acceptance_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ module AcceptanceHelper
ActionController::Base.allow_forgery_protection = true

if ENV["ENABLE_HTTPS"] == "yes"
Capybara.app_host = 'https://www.example.com'
Capybara.app_host = 'https://example.com'
else
Capybara.app_host = 'http://example.com'
end

def app
Expand Down
11 changes: 11 additions & 0 deletions test/acceptance/following_remote_users_test.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require 'require_relative' if RUBY_VERSION[0,3] == '1.8'
require_relative 'acceptance_helper'
require 'uri'

describe "following remote users" do
include AcceptanceHelper
Expand Down Expand Up @@ -56,6 +57,16 @@ def follow_remote_user!(webfinger_id = "[email protected]")
assert has_content? "You're already following steveklabnik."
end
end

it "follows users on the current node even if you try to follow them like remote users" do
local_user = Fabricate(:user)

follow_remote_user!("#{local_user.username}@example.com")

within flash do
assert has_content? "Now following #{local_user.username}."
end
end
end

describe "failure" do
Expand Down
45 changes: 36 additions & 9 deletions test/services/feed_service_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
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" }
Expand All @@ -20,9 +18,39 @@
service.stubs(:find_feed_by_id).returns(existing_feed)
end

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

describe "when the feed has a local URL" do
let(:target_feed) { "[email protected]" }
let(:service) { FeedService.new(target_feed, "http://example.com/") }
let(:user) { mock }
let(:author) { mock }
let(:feed) { mock }

describe "when the feed exists" do
before do
User.stubs(:find_by_case_insensitive_username).returns(user)
user.stubs(:author).returns(author)
author.stubs(:feed).returns(feed)
end

it "returns the feed" do
service.find_or_create!.must_equal feed
end
end

describe "when the feed does not exist" do
before do
User.stubs(:find_by_case_insensitive_username).returns(nil)
service.stubs(:find_feed_by_remote_url).returns(existing_feed)
end

it "moves on to trying to find by remote url" do
service.find_or_create!.must_equal existing_feed
end
end
end

Expand All @@ -32,12 +60,12 @@

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

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

Expand All @@ -46,15 +74,14 @@

before do
service.stubs(:find_feed_by_id).returns nil
service.stubs(:find_feed_by_username).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
it "creates the feed" do
service.find_or_create!.must_equal new_feed
subject
end
end

end
end

0 comments on commit c4eba18

Please sign in to comment.