|
require 'spec_helper'
describe Agents::SchedulerAgent do
before do
@agent = Agents::SchedulerAgent.new(name: 'Example', options: { 'schedule' => '0 * * * *' })
@agent.user = users(:bob)
@agent.save
end
describe "validation" do
it "should validate action" do
['run', 'enable', 'disable', '', nil].each { |action|
@agent.options['action'] = action
expect(@agent).to be_valid
}
['delete', 1, true].each { |action|
@agent.options['action'] = action
expect(@agent).not_to be_valid
}
end
it "should validate schedule" do
expect(@agent).to be_valid
@agent.options.delete('schedule')
expect(@agent).not_to be_valid
@agent.options['schedule'] = nil
expect(@agent).not_to be_valid
@agent.options['schedule'] = ''
expect(@agent).not_to be_valid
@agent.options['schedule'] = '0'
expect(@agent).not_to be_valid
@agent.options['schedule'] = '*/15 * * * * * *'
expect(@agent).not_to be_valid
@agent.options['schedule'] = '*/1 * * * *'
expect(@agent).to be_valid
@agent.options['schedule'] = '*/1 * * *'
expect(@agent).not_to be_valid
stub(@agent).second_precision_enabled { true }
@agent.options['schedule'] = '*/15 * * * * *'
expect(@agent).to be_valid
stub(@agent).second_precision_enabled { false }
@agent.options['schedule'] = '*/10 * * * * *'
expect(@agent).not_to be_valid
@agent.options['schedule'] = '5/30 * * * * *'
expect(@agent).not_to be_valid
@agent.options['schedule'] = '*/15 * * * * *'
expect(@agent).to be_valid
@agent.options['schedule'] = '15,45 * * * * *'
expect(@agent).to be_valid
@agent.options['schedule'] = '0 * * * * *'
expect(@agent).to be_valid
end
end
describe 'control_action' do
it "should be one of the supported values" do
['run', '', nil].each { |action|
@agent.options['action'] = action
expect(@agent.control_action).to eq('run')
}
['enable', 'disable'].each { |action|
@agent.options['action'] = action
expect(@agent.control_action).to eq(action)
}
end
it "cannot be 'run' if any of the control targets cannot be scheduled" do
expect(@agent.control_action).to eq('run')
@agent.control_targets = [agents(:bob_rain_notifier_agent)]
expect(@agent).not_to be_valid
end
it "can be 'enable' or 'disable' no matter if control targets can be scheduled or not" do
['enable', 'disable'].each { |action|
@agent.options['action'] = action
@agent.control_targets = [agents(:bob_rain_notifier_agent)]
expect(@agent).to be_valid
}
end
end
describe "save" do
it "should delete memory['scheduled_at'] if and only if options is changed" do
time = Time.now.to_i
@agent.memory['scheduled_at'] = time
@agent.save
expect(@agent.memory['scheduled_at']).to eq(time)
@agent.memory['scheduled_at'] = time
# Currently @agent.options[]= is not detected
@agent.options = { 'schedule' => '*/5 * * * *' }
@agent.save
expect(@agent.memory['scheduled_at']).to be_nil
end
end
describe "check!" do
it "should control targets" do
control_targets = [agents(:bob_website_agent), agents(:bob_weather_agent)]
@agent.control_targets = control_targets
@agent.save!
control_target_ids = control_targets.map(&:id)
stub(Agent).async_check(anything) { |id|
control_target_ids.delete(id)
}
@agent.check!
expect(control_target_ids).to be_empty
@agent.options['action'] = 'disable'
@agent.save!
@agent.check!
control_targets.all? { |control_target| control_target.disabled? }
@agent.options['action'] = 'enable'
@agent.save!
@agent.check!
control_targets.all? { |control_target| !control_target.disabled? }
end
end
end
|