diff --git a/CHANGELOG.md b/CHANGELOG.md index c5070e3..0294766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # [develop](https://github.com/adhearsion/electric_slide) +# [0.5.0](https://github.com/adhearsion/electric_slide/compare/v0.4.2...v0.5.0) - [2016-02-12](https://rubygems.org/gems/adhearsion/versions/0.5.0) + * API Breakage: Fixed priority strategy now ensures that the same agent cannot be in multiple priorities + # [0.4.2](https://github.com/adhearsion/electric_slide/compare/v0.4.1...v0.4.2) - [2016-02-04](https://rubygems.org/gems/adhearsion/versions/0.4.2) * Bugfix: FixedPriority now correctly checks out agents in priority order. diff --git a/lib/electric_slide/agent_strategy/fixed_priority.rb b/lib/electric_slide/agent_strategy/fixed_priority.rb index 865bb53..b4a4d31 100644 --- a/lib/electric_slide/agent_strategy/fixed_priority.rb +++ b/lib/electric_slide/agent_strategy/fixed_priority.rb @@ -37,11 +37,15 @@ def checkout_agent end def <<(agent) - # TODO: How aggressively do we check for agents duplicated in multiple priorities? raise ArgumentError, "Agents must have a specified priority" unless agent.respond_to?(:priority) + priority = agent.priority || 999999 @priorities[priority] ||= [] - @priorities[priority] << agent unless @priorities[priority].include? agent + + unless @priorities[priority].include?(agent) + delete(agent) + @priorities[priority] << agent + end end def delete(agent) diff --git a/lib/electric_slide/version.rb b/lib/electric_slide/version.rb index dabeca1..d536b97 100644 --- a/lib/electric_slide/version.rb +++ b/lib/electric_slide/version.rb @@ -1,4 +1,4 @@ # encoding: utf-8 class ElectricSlide - VERSION = '0.4.2' + VERSION = '0.5.0' end diff --git a/spec/electric_slide/agent_strategy/fixed_priority_spec.rb b/spec/electric_slide/agent_strategy/fixed_priority_spec.rb index 90f93ff..8464fc8 100644 --- a/spec/electric_slide/agent_strategy/fixed_priority_spec.rb +++ b/spec/electric_slide/agent_strategy/fixed_priority_spec.rb @@ -39,4 +39,25 @@ subject.checkout_agent expect(subject.agent_available?).to be true end + + context 'when agents at different priorities are available' do + let(:agent1) { agent1 = OpenStruct.new(id: 101, priority: 1) } + let(:agent2) { agent1 = OpenStruct.new(id: 102, priority: 2) } + + before do + subject << agent1 + subject << agent2 + end + + describe 'and the higher priority agent is added again, but at the lowest priority' do + before do + agent1.priority = 3 + subject << agent1 + end + + it 'moves the agent to the new, lower priority' do + expect(subject.checkout_agent).to eq(agent2) + end + end + end end