diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index a36f80150..674665592 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -15,10 +15,13 @@ class FanOutOnWriteService < BaseService private def deliver_to_self(status) + Rails.logger.debug "Delivering status #{status.id} to author" FeedManager.instance.push(:home, status.account, status) end def deliver_to_followers(status) + Rails.logger.debug "Delivering status #{status.id} to followers" + status.account.followers.find_each do |follower| next if !follower.local? || FeedManager.instance.filter?(:home, status, follower) FeedManager.instance.push(:home, follower, status) @@ -26,7 +29,9 @@ class FanOutOnWriteService < BaseService end def deliver_to_mentioned(status) - status.mentions.find_each do |mention| + Rails.logger.debug "Delivering status #{status.id} to mentioned accounts" + + status.mentions.includes(:account).each do |mention| mentioned_account = mention.account next if !mentioned_account.local? || mentioned_account.id == status.account_id || FeedManager.instance.filter?(:mentions, status, mentioned_account) FeedManager.instance.push(:mentions, mentioned_account, status) @@ -34,12 +39,15 @@ class FanOutOnWriteService < BaseService end def deliver_to_hashtags(status) + Rails.logger.debug "Delivering status #{status.id} to hashtags" + status.tags.find_each do |tag| FeedManager.instance.broadcast("hashtag:#{tag.name}", id: status.id) end end def deliver_to_public(status) + Rails.logger.debug "Delivering status #{status.id} to public timeline" FeedManager.instance.broadcast(:public, id: status.id) end end diff --git a/app/services/fetch_remote_status_service.rb b/app/services/fetch_remote_status_service.rb index fbf7e3bd6..54ac3006e 100644 --- a/app/services/fetch_remote_status_service.rb +++ b/app/services/fetch_remote_status_service.rb @@ -9,7 +9,7 @@ class FetchRemoteStatusService < BaseService private def process_atom(url, body) - Rails.logger.debug 'Processing Atom for remote status' + Rails.logger.debug "Processing Atom for remote status at #{url}" xml = Nokogiri::XML(body) account = extract_author(url, xml) diff --git a/spec/services/fan_out_on_write_service_spec.rb b/spec/services/fan_out_on_write_service_spec.rb index 2b087edd9..36bfcda16 100644 --- a/spec/services/fan_out_on_write_service_spec.rb +++ b/spec/services/fan_out_on_write_service_spec.rb @@ -1,5 +1,40 @@ require 'rails_helper' RSpec.describe FanOutOnWriteService do + let(:author) { Fabricate(:account, username: 'tom') } + let(:status) { Fabricate(:status, text: 'Hello @alice #test', account: author) } + let(:alice) { Fabricate(:user, account: Fabricate(:account, username: 'alice')).account } + let(:follower) { Fabricate(:account, username: 'bob') } + subject { FanOutOnWriteService.new } + + before do + alice + follower.follow!(author) + + ProcessMentionsService.new.call(status) + ProcessHashtagsService.new.call(status) + + subject.call(status) + end + + it 'delivers status to home timeline' do + expect(Feed.new(:home, author).get(1).map(&:id)).to include status.id + end + + it 'delivers status to local followers' do + expect(Feed.new(:home, follower).get(1).map(&:id)).to include status.id + end + + it 'delivers status to mentioned users' do + expect(Feed.new(:mentions, alice).get(1).map(&:id)).to include status.id + end + + it 'delivers status to hashtag' do + expect(Tag.find_by!(name: 'test').statuses.pluck(:id)).to include status.id + end + + it 'delivers status to public timeline' do + expect(Status.as_public_timeline(alice).map(&:id)).to include status.id + end end