blob: 366849778662f9e6cfa745c4cd7ea45ddf39b753 [file] [log] [blame]
require File.expand_path('../../spec_helper', __FILE__)
module Pod
describe HooksManager do
before do
@hooks_manager = Pod::HooksManager
@hooks_manager.instance_variable_set(:@registrations, nil)
end
describe 'register' do
it 'allows to register a block for a notification with a given name' do
@hooks_manager.register('plugin', :post_install) {}
@hooks_manager.registrations[:post_install].count.should == 1
hook = @hooks_manager.registrations[:post_install].first
hook.class.should == HooksManager::Hook
hook.name.should == :post_install
hook.plugin_name.should == 'plugin'
end
it 'raises if no name is given' do
should.raise ArgumentError do
@hooks_manager.register('name', nil) {}
end
end
it 'raises if no block is given' do
should.raise ArgumentError do
@hooks_manager.register('name', :post_install)
end
end
it 'raises if no plugin name is given' do
should.raise ArgumentError do
@hooks_manager.register(nil, :post_install) {}
end
end
end
describe 'run' do
it 'invokes the hooks' do
@hooks_manager.register('plugin', :post_install) do |_options|
true.should.be.true
end
@hooks_manager.run(:post_install, Object.new)
end
it 'handles the case that no listeners have registered' do
should.not.raise do
@hooks_manager.run(:post_install, Object.new)
end
end
it 'handles the case that no listeners have registered for a name' do
@hooks_manager.register('plugin', :post_install) do |_options|
true.should.be.true
end
should.not.raise do
@hooks_manager.run(:pre_install, Object.new)
end
end
it 'only runs hooks from the allowed plugins' do
@hooks_manager.register('plugin', :post_install) do |_options|
raise 'Should not be called'
end
should.not.raise do
@hooks_manager.run(:post_install, Object.new, 'plugin2' => {})
end
end
it 'passed along user-specified options when the hook block has arity 2' do
@hooks_manager.register('plugin', :post_install) do |_options, user_options|
user_options['key'].should == 'value'
end
should.not.raise do
@hooks_manager.run(:post_install, Object.new, 'plugin' => { 'key' => 'value' })
end
end
it 'passes along user-specified options as hashes with indifferent access' do
run_count = 0
@hooks_manager.register('plugin', :post_install) do |_options, user_options|
user_options['key'].should == 'value'
user_options[:key].should == 'value'
run_count += 1
end
@hooks_manager.run(:post_install, Object.new, 'plugin' => { 'key' => 'value' })
@hooks_manager.run(:post_install, Object.new, 'plugin' => { :key => 'value' })
run_count.should == 2
end
it 'raises if no name is given' do
should.raise ArgumentError do
@hooks_manager.run(nil, Object.new) {}
end
end
it 'raises if no context object is given' do
should.raise ArgumentError do
@hooks_manager.run(:post_install, nil)
end
end
it 'prints a message in verbose mode when any hooks are run' do
config.verbose = true
@hooks_manager.register('plugin', :post_install) {}
@hooks_manager.run(:post_install, Object.new)
UI.output.should.match /- Running post install hooks/
end
it 'prints a message in verbose mode for each hook run' do
config.verbose = true
@hooks_manager.register('plugin', :post_install) {}
@hooks_manager.run(:post_install, Object.new)
UI.output.should.match %r{- plugin from `spec/unit/hooks_manager_spec.rb`}
end
end
end
end