# encoding: utf-8

require "spec_helper"
require "amq/uri"

describe AMQ::URI, ".parse" do
  context "when schema is not one of [amqp, amqps]" do
    it "raises ArgumentError" do
      expect {
        described_class.parse_amqp_url("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_amqp_url("amqp://dev.rabbitmq.com")

    expect(val[:vhost]).to be_nil # in this case, default / will be used
    expect(val[:host]).to eq("dev.rabbitmq.com")
    expect(val[:port]).to eq(5672)
    expect(val[:scheme]).to eq("amqp")
    expect(val[:ssl]).to be_falsey
  end

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

    expect(val[:vhost]).to be_nil
    expect(val[:host]).to eq("dev.rabbitmq.com")
    expect(val[:port]).to eq(5671)
    expect(val[:scheme]).to eq("amqps")
    expect(val[:ssl]).to be_truthy
  end


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

      expect(val[:host]).to eq("dev.rabbitmq.com")
      expect(val[:port]).to eq(5672)
      expect(val[:scheme]).to eq("amqp")
      expect(val[:ssl]).to be_falsey
      expect(val[:vhost]).to eq("")
    end
  end


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

      expect(val[:host]).to eq("dev.rabbitmq.com")
      expect(val[:port]).to eq(5672)
      expect(val[:scheme]).to eq("amqp")
      expect(val[:ssl]).to be_falsey
      expect(val[:vhost]).to eq("/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_amqp_url("amqp://dev.rabbitmq.com/a.path.without.slashes")

      expect(val[:host]).to eq("dev.rabbitmq.com")
      expect(val[:port]).to eq(5672)
      expect(val[:scheme]).to eq("amqp")
      expect(val[:ssl]).to be_falsey
      expect(val[:vhost]).to eq("a.path.without.slashes")
    end
  end

  context "when URI is amqp://dev.rabbitmq.com/a/path/with/slashes" do
    it "raises an ArgumentError" do
      expect { described_class.parse_amqp_url("amqp://dev.rabbitmq.com/a/path/with/slashes") }.to 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_amqp_url("amqp://hedgehog:t0ps3kr3t@hub.megacorp.internal")

      expect(val[:host]).to eq("hub.megacorp.internal")
      expect(val[:port]).to eq(5672)
      expect(val[:scheme]).to eq("amqp")
      expect(val[:ssl]).to be_falsey
      expect(val[:user]).to eq("hedgehog")
      expect(val[:pass]).to eq("t0ps3kr3t")
      expect(val[:vhost]).to be_nil # in this case, default / will be used
    end
  end
end