commit: 53e95c4efcc0bbf480e9c416bc0673558aa8e20e
parent: 08deec4c84f00d241d60a6962806d5abe4638edd
Author: abcang <abcang1015@gmail.com>
Date: Sun, 19 Nov 2017 23:32:48 +0900
Fix N+1 at notification (#5752)
Diffstat:
2 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/app/models/notification.rb b/app/models/notification.rb
@@ -24,7 +24,7 @@ class Notification < ApplicationRecord
favourite: 'Favourite',
}.freeze
- STATUS_INCLUDES = [:account, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :media_attachments, :tags, mentions: :account]].freeze
+ STATUS_INCLUDES = [:account, :application, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :application, :media_attachments, :tags, mentions: :account]].freeze
belongs_to :account
belongs_to :from_account, class_name: 'Account'
@@ -55,9 +55,11 @@ class Notification < ApplicationRecord
def target_status
case type
when :reblog
- activity&.reblog
- when :favourite, :mention
- activity&.status
+ status&.reblog
+ when :favourite
+ favourite&.status
+ when :mention
+ mention&.status
end
end
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
@@ -6,23 +6,18 @@ RSpec.describe Notification, type: :model do
end
describe '#target_status' do
- before do
- allow(notification).to receive(:type).and_return(type)
- allow(notification).to receive(:activity).and_return(activity)
- end
-
- let(:notification) { Fabricate(:notification) }
- let(:status) { instance_double('Status') }
- let(:favourite) { instance_double('Favourite') }
- let(:mention) { instance_double('Mention') }
+ let(:notification) { Fabricate(:notification, activity_type: type, activity: activity) }
+ let(:status) { Fabricate(:status) }
+ let(:reblog) { Fabricate(:status, reblog: status) }
+ let(:favourite) { Fabricate(:favourite, status: status) }
+ let(:mention) { Fabricate(:mention, status: status) }
context 'type is :reblog' do
let(:type) { :reblog }
- let(:activity) { status }
+ let(:activity) { reblog }
- it 'calls activity.reblog' do
- expect(activity).to receive(:reblog)
- notification.target_status
+ it 'returns status' do
+ expect(notification.target_status).to eq status
end
end
@@ -30,9 +25,8 @@ RSpec.describe Notification, type: :model do
let(:type) { :favourite }
let(:activity) { favourite }
- it 'calls activity.status' do
- expect(activity).to receive(:status)
- notification.target_status
+ it 'returns status' do
+ expect(notification.target_status).to eq status
end
end
@@ -40,9 +34,8 @@ RSpec.describe Notification, type: :model do
let(:type) { :mention }
let(:activity) { mention }
- it 'calls activity.status' do
- expect(activity).to receive(:status)
- notification.target_status
+ it 'returns status' do
+ expect(notification.target_status).to eq status
end
end
end