diff --git a/app/models/dashboard/action.rb b/app/models/dashboard/action.rb index 3bff7fd9f..88f94704d 100644 --- a/app/models/dashboard/action.rb +++ b/app/models/dashboard/action.rb @@ -39,7 +39,8 @@ class Dashboard::Action < ActiveRecord::Base scope :inactive, -> { where(active: false) } scope :resources, -> { where(action_type: 1) } scope :proposed_actions, -> { where(action_type: 0) } - scope :active_for, ->(proposal) do + + def self.active_for(proposal) published_at = proposal.published_at&.to_date || Date.today active @@ -47,12 +48,12 @@ class Dashboard::Action < ActiveRecord::Base .where('day_offset <= ?', (Date.today - published_at).to_i) end - scope :course_for, lambda { |proposal| + def self.course_for(proposal) active .resources .where('required_supports > ?', proposal.cached_votes_up) .order(required_supports: :asc) - } + end def active_for?(proposal) published_at = proposal.published_at&.to_date || Date.today diff --git a/spec/models/dashboard/action_spec.rb b/spec/models/dashboard/action_spec.rb index 2c24601eb..675924308 100644 --- a/spec/models/dashboard/action_spec.rb +++ b/spec/models/dashboard/action_spec.rb @@ -68,7 +68,7 @@ describe Dashboard::Action do expect(action).not_to be_valid end - context 'active_for?' do + context '#active_for?' do it 'is active when required supports is 0 and day_offset is 0' do action = build(:dashboard_action, required_supports: 0, day_offset: 0) proposal = build(:proposal) @@ -105,7 +105,7 @@ describe Dashboard::Action do end end - context 'requested_for?' do + context '#requested_for?' do it 'is not requested when no administrator task' do proposal = create(:proposal) action = create(:dashboard_action, :active, :admin_request, :resource) @@ -123,7 +123,7 @@ describe Dashboard::Action do end end - context 'executed_for?' do + context '#executed_for?' do it 'is not executed when no administrator task' do proposal = create(:proposal) action = create(:dashboard_action, :active, :admin_request, :resource) @@ -149,4 +149,52 @@ describe Dashboard::Action do expect(action).to be_executed_for(proposal) end end + + context '#active_for' do + let!(:active_action) { create :dashboard_action, :active, day_offset: 0, required_supports: 0 } + let!(:not_enough_supports_action) { create :dashboard_action, :active, day_offset: 0, required_supports: 10_000 } + let!(:inactive_action) { create :dashboard_action, :inactive } + let!(:future_action) { create :dashboard_action, :active, day_offset: 300, required_supports: 0 } + let(:proposal) { create :proposal } + + it 'actions with enough supports or days are active' do + expect(described_class.active_for(proposal)).to include(active_action) + end + + it 'inactive actions are not included' do + expect(described_class.active_for(proposal)).not_to include(inactive_action) + end + + it 'actions without enough supports are not active' do + expect(described_class.active_for(proposal)).not_to include(not_enough_supports_action) + end + + it 'actions planned to be active in the future are not active' do + expect(described_class.active_for(proposal)).not_to include(future_action) + end + end + + context '#course_for' do + let!(:proposed_action) { create :dashboard_action, :active, required_supports: 0 } + let!(:inactive_resource) { create :dashboard_action, :inactive, :resource, required_supports: 0 } + let!(:resource) { create :dashboard_action, :active, :resource, required_supports: 10_000 } + let!(:achieved_resource) { create :dashboard_action, :active, :resource, required_supports: 0 } + let(:proposal) { create :proposal } + + it "proposed actions are not part of proposal's course" do + expect(described_class.course_for(proposal)).not_to include(proposed_action) + end + + it "inactive resources are not part of proposal's course" do + expect(described_class.course_for(proposal)).not_to include(inactive_resource) + end + + it "achievements are not part of the proposal's course" do + expect(described_class.course_for(proposal)).not_to include(achieved_resource) + end + + it "active resources are part of proposal's course" do + expect(described_class.course_for(proposal)).to include(resource) + end + end end