Skip to content

Commit

Permalink
Use heroku API for addons
Browse files Browse the repository at this point in the history
  • Loading branch information
kmayer committed Apr 24, 2012
1 parent 2bf5bcc commit 43b2eaf
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 34 deletions.
11 changes: 3 additions & 8 deletions lib/heroku_san/stage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,19 +103,14 @@ def push_config(options = nil)
heroku.put_config_vars(app, params).body
end

def get_installed_addons
def installed_addons
heroku.get_addons(app).body
end

def install_addons
return if addons.empty?
installed_addons = get_installed_addons
addons_to_install = addons - installed_addons.map{|a|a['name']}
if addons_to_install.any?
(addons - installed_addons.map{|a|a['name']}).each do |addon|
sh_heroku "addons:add #{addon}" rescue nil
end
installed_addons = get_installed_addons
addons_to_install.each do |addon|
heroku.post_addon(app, addon)
end
installed_addons
end
Expand Down
46 changes: 20 additions & 26 deletions spec/heroku_san/stage_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

describe HerokuSan::Stage do
include Git
subject { HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7", "addons" => ["one", "two"]})}
subject { HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7"})}
STOCK_CONFIG = {"BUNDLE_WITHOUT"=>"development:test", "LANG"=>"en_US.UTF-8", "RACK_ENV"=>"production"}
before do
Heroku::Auth.stub(:api_key) { 'API_KEY' }
Expand Down Expand Up @@ -40,7 +40,7 @@
describe "#stack" do
it "returns the name of the stack from Heroku" do
subject = HerokuSan::Stage.new('production', {"app" => "awesomeapp"})
with_app(subject, 'name' => 'awesomeapp') do |app_data|
with_app(subject, 'name' => subject.app) do |app_data|
subject.stack.should == 'bamboo-mri-1.9.2'
end
end
Expand Down Expand Up @@ -245,35 +245,29 @@
subject.revision.should == ''
end
end

describe "#installed_addons" do
it "returns the list of installed addons" do
with_app(subject, 'name' => subject.app) do |app_data|
subject.installed_addons.map{|a|a['name']}.should =~ %w[logging:basic shared-database:5mb]
end
end
end

describe '#install_addons' do
subject { HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7", "addons" => ["custom_domains:basic", "ssl:piggyback"]})}

it "installs the addons" do
subject.stub(:get_installed_addons => [])
subject.should_receive(:sh_heroku).with("addons:add one")
subject.should_receive(:sh_heroku).with("addons:add two")
subject.install_addons
end
it "tries to install all addons" do
subject.stub(:get_installed_addons => [])
subject.should_receive(:sh_heroku).with("addons:add one").and_raise('boom 1')
subject.should_receive(:sh_heroku).with("addons:add two").and_raise('boom 2')
subject.install_addons
with_app(subject, 'name' => subject.app) do |app_data|
subject.install_addons.map{|a| a['name']}.should =~ %w[logging:basic shared-database:5mb custom_domains:basic ssl:piggyback]
subject.installed_addons.map{|a|a['name']}.should =~ subject.install_addons.map{|a| a['name']}
end
end
it "only installs missing addons" do
subject.stub(:get_installed_addons => [{'name' => 'one'}])
subject.should_receive(:sh_heroku).with("addons:add two")
subject.install_addons
end
it "returns a list of installed addons" do
addons = [{'name' => 'one'}, {'name' => 'two'}]
subject.stub(:get_installed_addons => addons)
subject.install_addons.should == addons
end
it "re-queries addons after installing them" do
subject.should_receive(:get_installed_addons).and_return([])
subject.stub(:sh_heroku => nil)
subject.should_receive(:get_installed_addons).and_return("FINAL RESULT")
subject.install_addons.should == "FINAL RESULT"
subject = HerokuSan::Stage.new('production', {"app" => "awesomeapp", "stack" => "bamboo-ree-1.8.7", "addons" => ["logging:basic","custom_domains:basic", "ssl:piggyback"]})
with_app(subject, 'name' => subject.app) do |app_data|
subject.install_addons.map{|a| a['name']}.should =~ %w[logging:basic shared-database:5mb custom_domains:basic ssl:piggyback]
end
end
end
end

0 comments on commit 43b2eaf

Please sign in to comment.