<commit_before><commit_msg>add specs for Fourchette::Heroku<commit_after>require 'spec_helper'

describe Fourchette::Heroku do
  let(:heroku) { Fourchette::Heroku.new }
  let(:from_app_name) { 'awesome app' }
  let(:to_app_name) { 'awesomer app!' }

  before do
    client = double('client')
    client_app = double('client')
    app_list = [ { 'name' => 'fourchette-pr-7' }, { 'name' => 'fourchette-pr-8' } ]
    client_app.stub(:list).and_return(app_list)
    client.stub(:app).and_return(client_app)

    config_var = double('config_var')
    client.stub(:config_var).and_return(config_var)

    client.app.stub(:info).and_return( { 'git_url' => 'git@heroku.com/something.git' } )

    heroku.stub(:client).and_return(client)
  end

  describe '#app_exists?' do
    it { expect(heroku.app_exists?('fourchette-pr-7')).to eq true }
    it { expect(heroku.app_exists?('fourchette-pr-8')).to eq true }
    it { expect(heroku.app_exists?('fourchette-pr-333')).to eq false }
  end

  describe '#fork' do
    before do
      heroku.stub(:create_app)
      heroku.stub(:copy_config)
      heroku.stub(:copy_add_ons)
      heroku.stub(:copy_pg)
    end

    ['create_app', 'copy_config', 'copy_add_ons', 'copy_pg'].each do |method_name|
      it "calls `#{method_name}'" do
        heroku.should_receive(method_name)
        heroku.fork(from_app_name, to_app_name)
      end
    end
  end

  describe '#git_url' do
    it { expect(heroku.git_url(to_app_name)).to eq 'git@heroku.com/something.git' }
  end

  describe '#delete' do
    it 'calls delete on the Heroku client' do
      heroku.client.app.should_receive(:delete).with(to_app_name)
      heroku.delete(to_app_name)
    end
  end

  describe '#config_vars' do
    it 'calls config_var.info on the Heroku client' do
      heroku.client.config_var.should_receive(:info).with(from_app_name)
      heroku.config_vars(from_app_name)
    end
  end

  describe 'private functions' do
    describe '#create_app' do
      it 'calls app.create on the Heroku client' do
        heroku.client.app.should_receive(:create).with({ name: to_app_name })
        heroku.send(:create_app, to_app_name)
      end
    end

    describe '#copy_config' do
      let(:vars) { { 'WHATEVER' => 'ok', 'HEROKU_POSTGRESQL_SOMETHING_URL' => 'FAIL@POSTGRES/DB' } }
      let(:cleaned_vars) { { 'WHATEVER' => 'ok'} }

      it 'calls #config_vars' do
        heroku.client.config_var.stub(:update)
        heroku.should_receive(:config_vars).with(from_app_name).and_return(vars)
        heroku.send(:copy_config, from_app_name, to_app_name)
      end

      it 'updates config vars without postgres URLs' do
        heroku.client.config_var.should_receive(:update).with(to_app_name, cleaned_vars )
        heroku.stub(:config_vars).and_return(vars)
        heroku.send(:copy_config, 'from', to_app_name)
      end
    end

    describe '#copy_add_ons' do
      let(:addon_list) { [ { 'plan' => { 'name' => 'redistogo' } } ] }

      before do
        heroku.client.stub(:addon).and_return( double('addon') )
        heroku.client.addon.stub(:create)
        heroku.client.addon.stub(:list).and_return(addon_list)
      end

      it 'gets the addon list' do
        heroku.client.addon.should_receive(:list).with(from_app_name).and_return(addon_list)
        heroku.send(:copy_add_ons, from_app_name, to_app_name)
      end

      it 'creates addons' do
        heroku.client.addon.should_receive(:create).with(to_app_name, { plan: 'redistogo' })
        heroku.send(:copy_add_ons, from_app_name, to_app_name)
      end
    end

    describe '#copy_pg' do
      it 'calls Fourchette::Pgbackups#copy' do
        Fourchette::Pgbackups.any_instance.should_receive(:copy).with(from_app_name, to_app_name)
        heroku.send(:copy_pg, from_app_name, to_app_name)
      end
    end
  end
end
{'fraction_non_alphanumeric': 0.1313370107696349, 'fraction_numerical': 0.0018387181507748883, 'mean_word_length': 3.3870967741935485, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6065531', 'n_tokens_mistral': 1388, 'n_tokens_neox': 1376, 'n_words': 229}