describe Ridgepole::Config do
  subject { Ridgepole::Config.load(config, env) }

  context 'when passed toplevel yaml' do
    let(:config) do
      <<-YAML.strip_heredoc
        adapter: mysql2
        encoding: utf8
        database: blog
        username: root
      YAML
    end
    let(:env) { 'development' }
    specify do
      expect(subject['adapter']).to eq 'mysql2'
      expect(subject['encoding']).to eq 'utf8'
      expect(subject['database']).to eq 'blog'
      expect(subject['username']).to eq 'root'
    end
  end

  context 'when passed dynamic yaml' do
    let(:config) do
      <<-YAML.strip_heredoc
        adapter: mysql2
        encoding: utf8
        database: blog_<%= 1 + 2 %>
        username: user_<%= 3 * 4 %>
      YAML
    end
    let(:env) { 'development' }
    specify do
      expect(subject['adapter']).to eq 'mysql2'
      expect(subject['encoding']).to eq 'utf8'
      expect(subject['database']).to eq 'blog_3'
      expect(subject['username']).to eq 'user_12'
    end
  end

  context 'when passed rails database.yml style yaml' do
    let(:config) do
      <<-YAML.strip_heredoc
        development:
          adapter: sqlspecifye
          database: db/sample.db
        production:
          adapter: mysql2
          encoding: utf8
          database: blog
          username: root
      YAML
    end

    context 'in development env' do
      let(:env) { 'development' }
      specify do
        expect(subject['adapter']).to eq 'sqlspecifye'
        expect(subject['database']).to eq 'db/sample.db'
        expect(subject['username']).to be_nil
      end
    end

    context 'in production env' do
      let(:env) { 'production' }
      specify do
        expect(subject['adapter']).to eq 'mysql2'
        expect(subject['encoding']).to eq 'utf8'
        expect(subject['database']).to eq 'blog'
        expect(subject['username']).to eq 'root'
      end
    end
  end

  context 'when passed yaml file' do
    let(:config) do
      <<-YAML.strip_heredoc
        adapter: mysql2
        encoding: utf8
        database: blog
        username: root
      YAML
    end
    let(:env) { 'development' }
    it {
      Tempfile.create('database.yml') do |f|
        f.puts config
        f.flush

        expect(subject['adapter']).to eq 'mysql2'
        expect(subject['encoding']).to eq 'utf8'
        expect(subject['database']).to eq 'blog'
        expect(subject['username']).to eq 'root'
      end
    }
  end

  context 'when passed unexisting yaml' do
    let(:config) do
      'database.yml'
    end

    let(:env) { 'development' }

    specify do
      expect do
        subject
      end.to raise_error %(Invalid config: 'scheme' is empty: "database.yml")
    end
  end

  context 'when passed DATABASE_URL' do
    let(:config) { 'mysql2://root:pass@127.0.0.1:3307/blog' }
    let(:env) { 'development' }

    it {
      expect(subject['adapter']).to eq 'mysql2'
      expect(subject['database']).to eq 'blog'
      expect(subject['username']).to eq 'root'
      expect(subject['password']).to eq 'pass'
      expect(subject['port']).to eq 3307
    }
  end

  context 'when passed DATABASE_URL from ENV' do
    let(:config) { 'env:DATABASE_URL' }
    let(:env) { 'development' }

    before do
      allow(ENV).to receive(:fetch).with('DATABASE_URL').and_return('mysql2://root:pass@127.0.0.1:3307/blog')
    end

    it {
      expect(subject['adapter']).to eq 'mysql2'
      expect(subject['database']).to eq 'blog'
      expect(subject['username']).to eq 'root'
      expect(subject['password']).to eq 'pass'
      expect(subject['port']).to eq 3307
    }
  end
end