diff --git a/app/models/campaign.rb b/app/models/campaign.rb index 1429ec340..7f7b4e677 100644 --- a/app/models/campaign.rb +++ b/app/models/campaign.rb @@ -16,4 +16,8 @@ class Campaign < ActiveRecord::Base validates :name, presence: true, uniqueness: true scope :active, -> { where(active: true) } + + def action_count + pages.sum(:action_count) + end end diff --git a/app/models/page.rb b/app/models/page.rb index a7de40f93..311736cb8 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -120,8 +120,8 @@ def slug_candidates end def campaign_action_count - @campaign_action_count ||= if campaign_id.present? - Page.where(campaign_id: campaign_id).sum(:action_count) + @campaign_action_count ||= if campaign + campaign.action_count else action_count end diff --git a/spec/models/campaign_spec.rb b/spec/models/campaign_spec.rb index 0b3ff8560..fc9ee14b0 100644 --- a/spec/models/campaign_spec.rb +++ b/spec/models/campaign_spec.rb @@ -9,7 +9,19 @@ # updated_at :datetime # +require 'rails_helper' + describe Campaign do describe 'validations' do end + + describe '#action_count' do + let(:campaign) { create(:campaign) } + let!(:page_a) { create(:page, campaign: campaign, action_count: 5) } + let!(:page_b) { create(:page, campaign: campaign, action_count: 5) } + + it 'returns sum of counts from associated pages' do + expect(campaign.action_count).to eq(10) + end + end end diff --git a/spec/models/page_spec.rb b/spec/models/page_spec.rb index 69837e7b5..4f57125a6 100644 --- a/spec/models/page_spec.rb +++ b/spec/models/page_spec.rb @@ -332,20 +332,23 @@ end end - describe 'campaign_action_count' do - it 'gives action count of just page if no associated campaigns' do - allow(page).to receive(:campaign_id).and_return(nil) - allow(page).to receive(:action_count).and_return(1234) - expect(page.campaign_action_count).to equal 1234 - expect(page).to have_received(:campaign_id) - end - - it 'gives action count of campaign if one is associated' do - campaign = create :campaign - page1 = create :page, action_count: 2000, campaign: campaign - page2 = create :page, action_count: 2500, campaign: campaign - expect(page1.campaign_action_count).to eq 4500 - expect(page2.campaign_action_count).to eq 4500 + describe '#campaign_action_count' do + context 'without campaign' do + subject { create(:page, action_count: 5) } + + it 'returns action count for page' do + expect(subject.campaign_action_count).to eq(5) + end + end + + context 'with campaign' do + let(:campaign) { create(:campaign) } + subject { create(:page, campaign: campaign) } + + it 'returns count for all campaign pages' do + expect(campaign).to receive(:action_count) + subject.campaign_action_count + end end end