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
