require "spec_helper"
require "embedly/command_line"

module Embedly
  describe CommandLine do
    after do
      ENV['EMBEDLY_KEY'] = nil
      ENV['EMBEDLY_SECRET'] = nil
    end

    describe "::run!" do
      let(:arguments) { ['-k', 'MY_KEY', '--no-secret', 'http://yfrog.com/h7qqespj', '-o', 'maxwidth=10'] }
      let(:api) { double(API) }

      it "calls api with options" do
        API.should_receive(:new).with(:key => 'MY_KEY', :headers => {}) { api }
        api.should_receive(:oembed).with(:urls => ['http://yfrog.com/h7qqespj'], :maxwidth => '10')
        CommandLine.run!(:oembed, arguments)
      end

      it "raises an error if the arguments are empty" do
        $stdout = StringIO.new
        expect {
          CommandLine.run!(:oembed, [])
        }.to raise_error(SystemExit)
      end
    end

    describe "#run" do
      before do
        API.any_instance.stub(:oembed)
      end

      describe "with option --hostname" do
        %w[-H --hostname].each do |option|
          it "sets the hostname using #{option}" do
            command([option, "sth.embed.ly"])[:hostname].should == 'sth.embed.ly'
          end
        end
      end

      describe "with --header" do
        it "sets the header" do
          command(%w[--header Header=value])[:headers].should == { 'Header' => 'value' }
        end
      end

      describe "with --key" do
        %w[-k --key].each do |option|
          it "sets the key using #{option}" do
            command([option, "SOME_KEY"])[:key].should == 'SOME_KEY'
          end
        end

        it "gets the key from environment variables if no key was set" do
          ENV['EMBEDLY_KEY'] = 'ENVIRONMENT_KEY'

          command([])[:key].should == 'ENVIRONMENT_KEY'
        end
      end

      describe "with --secret" do
        %w[-s --secret].each do |option|
          it "sets the secret using #{option}" do
            command([option, "SECRET"])[:secret].should == 'SECRET'
          end
        end

        it "gets the secret from environment variables if no secret was set" do
          ENV['EMBEDLY_SECRET'] = 'ENVIRONMENT_SECRET'

          command([])[:secret].should == 'ENVIRONMENT_SECRET'
        end
      end

      describe "with --no-key" do
        %w[-N --no-key].each do |option|
          it "unsets the key using #{option}" do
            command([option])[:key].should be_nil
          end
        end
      end

      describe "with --no-secret" do
        it "unsets the secret" do
          command(['--no-secret'])[:secret].should be_nil
        end
      end

      describe "with --no-typhoeus" do
        it "sets the request with net/http" do
          command(['--no-typhoeus'])
          Embedly.configuration.requester.should == :net_http
        end
      end

      describe "with --option" do
        %w[-o --option].each do |option|
          it "sets custom option with #{option}" do
            command([option, "maxwidth=100"])[:query][:maxwidth].should == '100'
          end
        end
      end

      describe "with --verbose" do
        it "enables logging" do
          command(["--verbose"])
          Embedly.configuration.should be_debug
        end

        it "disables logging" do
          command(["--no-verbose"])
          Embedly.configuration.should_not be_debug
        end
      end
    end

    def command(arguments)
      arguments << 'testurl.com'
      command = CommandLine.new(arguments)
      command.run
      command.options
    end
  end
end