require File.join(File.dirname(__FILE__), 'test_helper')

describe HammerCLI::CommandExtensions do
  class CustomCmd < HammerCLI::Apipie::Command
    def execute
      HammerCLI::EX_OK
    end

    def request_headers
      {}
    end

    def request_options
      {}
    end

    def request_params
      {}
    end

    public :extended_request, :extended_data
  end

  class CmdExtensions < HammerCLI::CommandExtensions
    option '--ext', 'EXT', 'ext'
    before_print do |data|
      data['key'] = 'value'
    end
    output do |definition|
      definition.append(Fields::Field.new)
      definition.append(Fields::Field.new)
    end
    help do |h|
      h.section('Section')
      h.text('text')
    end
    request_headers do |headers|
      headers[:ssl] = true
    end
    request_options do |options|
      options[:with_authentication] = true
    end
    request_params do |params|
      params[:thin] = true
    end
  end

  let(:cmd) { Class.new(CustomCmd) }

  context 'only' do
    it 'should extend options only' do
      cmd.extend_with(CmdExtensions.new(only: :option))
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal true
      cmd.output_definition.empty?.must_equal true
    end

    it 'should extend output only' do
      cmd.extend_with(CmdExtensions.new(only: :output))
      cmd.output_definition.empty?.must_equal false
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal false
    end

    it 'should extend help only' do
      cmd.extend_with(CmdExtensions.new(only: :help))
      cmd.new({}).help.must_match(/.*Section.*/)
      cmd.new({}).help.must_match(/.*text.*/)
    end

    it 'should extend params only' do
      cmd.extend_with(CmdExtensions.new(only: :request_params))
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal({})
      cmd.new({}).extended_request[2].must_equal({})
    end

    it 'should extend headers only' do
      cmd.extend_with(CmdExtensions.new(only: :request_headers))
      cmd.new({}).extended_request[0].must_equal({})
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal({})
    end

    it 'should extend options only' do
      cmd.extend_with(CmdExtensions.new(only: :request_options))
      cmd.new({}).extended_request[0].must_equal({})
      cmd.new({}).extended_request[1].must_equal({})
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend params and options and headers' do
      cmd.extend_with(CmdExtensions.new(only: :request))
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend data only' do
      cmd.extend_with(CmdExtensions.new(only: :data))
      cmd.new({}).help.wont_match(/.*Section.*/)
      cmd.new({}).help.wont_match(/.*text.*/)
      cmd.output_definition.empty?.must_equal true
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal false
      cmd.new({}).extended_request[0].must_equal({})
      cmd.new({}).extended_request[1].must_equal({})
      cmd.new({}).extended_request[2].must_equal({})
      cmd.new({}).extended_data({}).must_equal('key' => 'value')
    end
  end

  context 'except' do
    it 'should extend all except options' do
      cmd.extend_with(CmdExtensions.new(except: :option))
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal false
      cmd.output_definition.empty?.must_equal false
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend all except output' do
      cmd.extend_with(CmdExtensions.new(except: :output))
      cmd.output_definition.empty?.must_equal true
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal true
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend all except help' do
      cmd.extend_with(CmdExtensions.new(except: :help))
      cmd.new({}).help.wont_match(/.*Section.*/)
      cmd.new({}).help.wont_match(/.*text.*/)
      cmd.output_definition.empty?.must_equal false
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal true
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend all except params' do
      cmd.extend_with(CmdExtensions.new(except: :request_params))
      cmd.new({}).extended_request[0].must_equal({})
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend all except headers' do
      cmd.extend_with(CmdExtensions.new(except: :request_headers))
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal({})
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
    end

    it 'should extend all except options' do
      cmd.extend_with(CmdExtensions.new(except: :request_options))
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal({})
    end

    it 'should extend all except params and options and headers' do
      cmd.extend_with(CmdExtensions.new(except: :request))
      cmd.new({}).extended_request[0].must_equal({})
      cmd.new({}).extended_request[1].must_equal({})
      cmd.new({}).extended_request[2].must_equal({})
    end

    it 'should extend all except data' do
      cmd.extend_with(CmdExtensions.new(except: :data))
      cmd.new({}).help.must_match(/.*Section.*/)
      cmd.new({}).help.must_match(/.*text.*/)
      cmd.output_definition.empty?.must_equal false
      opt = cmd.find_option('--ext')
      opt.is_a?(HammerCLI::Options::OptionDefinition).must_equal true
      cmd.new({}).extended_request[0].must_equal(thin: true)
      cmd.new({}).extended_request[1].must_equal(ssl: true)
      cmd.new({}).extended_request[2].must_equal(with_authentication: true)
      cmd.new({}).extended_data({}).must_equal({})
    end
  end


end