# encoding: utf-8

require 'spec_helper'

require "amqp/settings"

describe AMQP::Settings do

  #
  # Examples
  #


  describe ".parse_connection_uri(connection_string)" do
    context "when schema is not one of [amqp, amqps]" do
      it "raises ArgumentError" do
        expect {
          described_class.parse_connection_uri("http://dev.rabbitmq.com")
        }.to raise_error(ArgumentError, /amqp or amqps schema/)
      end
    end


    it "handles amqp:// URIs w/o path part" do
      val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com")

      val[:vhost].should be_nil # in this case, default / will be used
      val[:host].should == "dev.rabbitmq.com"
      val[:port].should == 5672
      val[:scheme].should == "amqp"
      val[:ssl].should be_false
    end

    it "handles amqps:// URIs w/o path part" do
      val = described_class.parse_connection_uri("amqps://dev.rabbitmq.com")

      val[:vhost].should be_nil
      val[:host].should == "dev.rabbitmq.com"
      val[:port].should == 5671
      val[:scheme].should == "amqps"
      val[:ssl].should be_true
    end


    context "when URI ends in a slash" do
      it "parses vhost as an empty string" do
        val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/")

        val[:host].should == "dev.rabbitmq.com"
        val[:port].should == 5672
        val[:scheme].should == "amqp"
        val[:ssl].should be_false
        val[:vhost].should == ""
      end
    end


    context "when URI ends in /%2Fvault" do
      it "parses vhost as /vault" do
        val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/%2Fvault")

        val[:host].should == "dev.rabbitmq.com"
        val[:port].should == 5672
        val[:scheme].should == "amqp"
        val[:ssl].should be_false
        val[:vhost].should == "/vault"
      end
    end


    context "when URI is amqp://dev.rabbitmq.com/a.path.without.slashes" do
      it "parses vhost as a.path.without.slashes" do
        val = described_class.parse_connection_uri("amqp://dev.rabbitmq.com/a.path.without.slashes")

        val[:host].should == "dev.rabbitmq.com"
        val[:port].should == 5672
        val[:scheme].should == "amqp"
        val[:ssl].should be_false
        val[:vhost].should == "a.path.without.slashes"
      end
    end

    context "when URI is amqp://dev.rabbitmq.com/a/path/with/slashes" do
      it "raises an ArgumentError" do
        lambda { described_class.parse_connection_uri("amqp://dev.rabbitmq.com/a/path/with/slashes") }.should raise_error(ArgumentError)
      end
    end


    context "when URI has username:password, for instance, amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal" do
      it "parses them out" do
        val = described_class.parse_connection_uri("amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal")

        val[:host].should == "hub.megacorp.internal"
        val[:port].should == 5672
        val[:scheme].should == "amqp"
        val[:ssl].should be_false
        val[:user].should == "hedgehog"
        val[:pass].should == "t0ps3kr3t"
        val[:vhost].should be_nil # in this case, default / will be used
      end
    end
  end
end