pogo 2.31.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +73 -0
- data/bin/pogo +22 -0
- data/data/cacert.pem +3988 -0
- data/lib/heroku.rb +22 -0
- data/lib/heroku/auth.rb +320 -0
- data/lib/heroku/cli.rb +38 -0
- data/lib/heroku/client.rb +764 -0
- data/lib/heroku/client/heroku_postgresql.rb +111 -0
- data/lib/heroku/client/pgbackups.rb +113 -0
- data/lib/heroku/client/rendezvous.rb +105 -0
- data/lib/heroku/client/ssl_endpoint.rb +25 -0
- data/lib/heroku/command.rb +273 -0
- data/lib/heroku/command/account.rb +23 -0
- data/lib/heroku/command/accounts.rb +34 -0
- data/lib/heroku/command/addons.rb +305 -0
- data/lib/heroku/command/apps.rb +311 -0
- data/lib/heroku/command/auth.rb +86 -0
- data/lib/heroku/command/base.rb +230 -0
- data/lib/heroku/command/certs.rb +148 -0
- data/lib/heroku/command/config.rb +137 -0
- data/lib/heroku/command/db.rb +218 -0
- data/lib/heroku/command/domains.rb +85 -0
- data/lib/heroku/command/drains.rb +46 -0
- data/lib/heroku/command/git.rb +65 -0
- data/lib/heroku/command/help.rb +163 -0
- data/lib/heroku/command/keys.rb +115 -0
- data/lib/heroku/command/labs.rb +161 -0
- data/lib/heroku/command/logs.rb +98 -0
- data/lib/heroku/command/maintenance.rb +61 -0
- data/lib/heroku/command/pg.rb +277 -0
- data/lib/heroku/command/pgbackups.rb +289 -0
- data/lib/heroku/command/plugins.rb +110 -0
- data/lib/heroku/command/ps.rb +232 -0
- data/lib/heroku/command/releases.rb +124 -0
- data/lib/heroku/command/run.rb +179 -0
- data/lib/heroku/command/sharing.rb +89 -0
- data/lib/heroku/command/ssl.rb +61 -0
- data/lib/heroku/command/stack.rb +62 -0
- data/lib/heroku/command/status.rb +51 -0
- data/lib/heroku/command/update.rb +47 -0
- data/lib/heroku/command/version.rb +23 -0
- data/lib/heroku/deprecated.rb +5 -0
- data/lib/heroku/deprecated/help.rb +38 -0
- data/lib/heroku/distribution.rb +9 -0
- data/lib/heroku/helpers.rb +517 -0
- data/lib/heroku/helpers/heroku_postgresql.rb +104 -0
- data/lib/heroku/plugin.rb +161 -0
- data/lib/heroku/updater.rb +158 -0
- data/lib/heroku/version.rb +3 -0
- data/lib/vendor/heroku/okjson.rb +598 -0
- data/spec/helper/legacy_help.rb +16 -0
- data/spec/heroku/auth_spec.rb +246 -0
- data/spec/heroku/client/heroku_postgresql_spec.rb +34 -0
- data/spec/heroku/client/pgbackups_spec.rb +43 -0
- data/spec/heroku/client/rendezvous_spec.rb +62 -0
- data/spec/heroku/client/ssl_endpoint_spec.rb +48 -0
- data/spec/heroku/client_spec.rb +564 -0
- data/spec/heroku/command/addons_spec.rb +585 -0
- data/spec/heroku/command/apps_spec.rb +351 -0
- data/spec/heroku/command/auth_spec.rb +38 -0
- data/spec/heroku/command/base_spec.rb +109 -0
- data/spec/heroku/command/certs_spec.rb +178 -0
- data/spec/heroku/command/config_spec.rb +144 -0
- data/spec/heroku/command/db_spec.rb +110 -0
- data/spec/heroku/command/domains_spec.rb +87 -0
- data/spec/heroku/command/drains_spec.rb +34 -0
- data/spec/heroku/command/git_spec.rb +116 -0
- data/spec/heroku/command/help_spec.rb +93 -0
- data/spec/heroku/command/keys_spec.rb +120 -0
- data/spec/heroku/command/labs_spec.rb +99 -0
- data/spec/heroku/command/logs_spec.rb +60 -0
- data/spec/heroku/command/maintenance_spec.rb +51 -0
- data/spec/heroku/command/pg_spec.rb +223 -0
- data/spec/heroku/command/pgbackups_spec.rb +280 -0
- data/spec/heroku/command/plugins_spec.rb +104 -0
- data/spec/heroku/command/ps_spec.rb +195 -0
- data/spec/heroku/command/releases_spec.rb +130 -0
- data/spec/heroku/command/run_spec.rb +86 -0
- data/spec/heroku/command/sharing_spec.rb +59 -0
- data/spec/heroku/command/ssl_spec.rb +32 -0
- data/spec/heroku/command/stack_spec.rb +46 -0
- data/spec/heroku/command/status_spec.rb +48 -0
- data/spec/heroku/command/version_spec.rb +16 -0
- data/spec/heroku/command_spec.rb +211 -0
- data/spec/heroku/helpers/heroku_postgresql_spec.rb +109 -0
- data/spec/heroku/helpers_spec.rb +48 -0
- data/spec/heroku/plugin_spec.rb +172 -0
- data/spec/heroku/updater_spec.rb +44 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +209 -0
- data/spec/support/display_message_matcher.rb +49 -0
- data/spec/support/openssl_mock_helper.rb +8 -0
- metadata +220 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
require "heroku/command/help"
|
2
|
+
|
3
|
+
Heroku::Command::Help.group("Foo Group") do |foo|
|
4
|
+
foo.command "foo:bar", "do a bar to foo"
|
5
|
+
foo.space
|
6
|
+
foo.command "foo:baz", "do a baz to foo"
|
7
|
+
end
|
8
|
+
|
9
|
+
class Heroku::Command::Foo < Heroku::Command::Base
|
10
|
+
def bar
|
11
|
+
end
|
12
|
+
|
13
|
+
def baz
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,246 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "heroku/auth"
|
3
|
+
require "heroku/helpers"
|
4
|
+
|
5
|
+
module Heroku
|
6
|
+
describe Auth do
|
7
|
+
include Heroku::Helpers
|
8
|
+
|
9
|
+
before do
|
10
|
+
ENV['HEROKU_API_KEY'] = nil
|
11
|
+
|
12
|
+
@cli = Heroku::Auth
|
13
|
+
@cli.stub!(:check)
|
14
|
+
@cli.stub!(:display)
|
15
|
+
@cli.stub!(:running_on_a_mac?).and_return(false)
|
16
|
+
@cli.credentials = nil
|
17
|
+
|
18
|
+
FakeFS.activate!
|
19
|
+
|
20
|
+
FakeFS::File.stub!(:stat).and_return(double('stat', :mode => "0600".to_i(8)))
|
21
|
+
FakeFS::FileUtils.stub!(:chmod)
|
22
|
+
FakeFS::File.stub!(:readlines) do |path|
|
23
|
+
File.read(path).split("\n").map {|line| "#{line}\n"}
|
24
|
+
end
|
25
|
+
|
26
|
+
FileUtils.mkdir_p(@cli.netrc_path.split("/")[0..-2].join("/"))
|
27
|
+
|
28
|
+
File.open(@cli.netrc_path, "w") do |file|
|
29
|
+
file.puts("machine api.heroku.com\n login user\n password pass\n")
|
30
|
+
file.puts("machine code.heroku.com\n login user\n password pass\n")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
after do
|
35
|
+
FileUtils.rm_rf(@cli.netrc_path)
|
36
|
+
FakeFS.deactivate!
|
37
|
+
end
|
38
|
+
|
39
|
+
context "legacy credentials" do
|
40
|
+
|
41
|
+
before do
|
42
|
+
FileUtils.rm_rf(@cli.netrc_path)
|
43
|
+
FileUtils.mkdir_p(File.dirname(@cli.legacy_credentials_path))
|
44
|
+
File.open(@cli.legacy_credentials_path, "w") do |file|
|
45
|
+
file.puts "legacy_user\nlegacy_pass"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should translate to netrc and cleanup" do
|
50
|
+
# preconditions
|
51
|
+
File.exist?(@cli.legacy_credentials_path).should == true
|
52
|
+
File.exist?(@cli.netrc_path).should == false
|
53
|
+
|
54
|
+
# transition
|
55
|
+
@cli.get_credentials.should == ['legacy_user', 'legacy_pass']
|
56
|
+
|
57
|
+
# postconditions
|
58
|
+
File.exist?(@cli.legacy_credentials_path).should == false
|
59
|
+
File.exist?(@cli.netrc_path).should == true
|
60
|
+
Netrc.read(@cli.netrc_path)["api.#{@cli.host}"].should == ['legacy_user', 'legacy_pass']
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "API key is set via environment variable" do
|
65
|
+
before do
|
66
|
+
ENV['HEROKU_API_KEY'] = "secret"
|
67
|
+
end
|
68
|
+
|
69
|
+
it "gets credentials from environment variables in preference to credentials file" do
|
70
|
+
@cli.read_credentials.should == ['', ENV['HEROKU_API_KEY']]
|
71
|
+
end
|
72
|
+
|
73
|
+
it "returns a blank username" do
|
74
|
+
@cli.user.should be_empty
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns the api key as the password" do
|
78
|
+
@cli.password.should == ENV['HEROKU_API_KEY']
|
79
|
+
end
|
80
|
+
|
81
|
+
it "does not overwrite credentials file with environment variable credentials" do
|
82
|
+
@cli.should_not_receive(:write_credentials)
|
83
|
+
@cli.read_credentials
|
84
|
+
end
|
85
|
+
|
86
|
+
context "reauthenticating" do
|
87
|
+
before do
|
88
|
+
@cli.stub!(:ask_for_credentials).and_return(['new_user', 'new_password'])
|
89
|
+
@cli.stub!(:check)
|
90
|
+
@cli.should_receive(:check_for_associated_ssh_key)
|
91
|
+
@cli.reauthorize
|
92
|
+
end
|
93
|
+
it "updates saved credentials" do
|
94
|
+
Netrc.read(@cli.netrc_path)["api.#{@cli.host}"].should == ['new_user', 'new_password']
|
95
|
+
end
|
96
|
+
it "returns environment variable credentials" do
|
97
|
+
@cli.read_credentials.should == ['', ENV['HEROKU_API_KEY']]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "logout" do
|
102
|
+
before do
|
103
|
+
@cli.logout
|
104
|
+
end
|
105
|
+
it "should delete saved credentials" do
|
106
|
+
File.exists?(@cli.legacy_credentials_path).should be_false
|
107
|
+
Netrc.read(@cli.netrc_path)["api.#{@cli.host}"].should be_nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it "asks for credentials when the file doesn't exist" do
|
113
|
+
@cli.delete_credentials
|
114
|
+
@cli.should_receive(:ask_for_credentials).and_return(["u", "p"])
|
115
|
+
@cli.should_receive(:check_for_associated_ssh_key)
|
116
|
+
@cli.user.should == 'u'
|
117
|
+
@cli.password.should == 'p'
|
118
|
+
end
|
119
|
+
|
120
|
+
it "writes credentials and uploads authkey when credentials are saved" do
|
121
|
+
@cli.stub!(:credentials)
|
122
|
+
@cli.stub!(:check)
|
123
|
+
@cli.stub!(:ask_for_credentials).and_return("username", "apikey")
|
124
|
+
@cli.should_receive(:write_credentials)
|
125
|
+
@cli.should_receive(:check_for_associated_ssh_key)
|
126
|
+
@cli.ask_for_and_save_credentials
|
127
|
+
end
|
128
|
+
|
129
|
+
it "save_credentials deletes the credentials when the upload authkey is unauthorized" do
|
130
|
+
@cli.stub!(:write_credentials)
|
131
|
+
@cli.stub!(:retry_login?).and_return(false)
|
132
|
+
@cli.stub!(:ask_for_credentials).and_return("username", "apikey")
|
133
|
+
@cli.stub!(:check) { raise Heroku::API::Errors::Unauthorized.new("Login Failed", Excon::Response.new) }
|
134
|
+
@cli.should_receive(:delete_credentials)
|
135
|
+
lambda { @cli.ask_for_and_save_credentials }.should raise_error(SystemExit)
|
136
|
+
end
|
137
|
+
|
138
|
+
it "asks for login again when not authorized, for three times" do
|
139
|
+
@cli.stub!(:read_credentials)
|
140
|
+
@cli.stub!(:write_credentials)
|
141
|
+
@cli.stub!(:delete_credentials)
|
142
|
+
@cli.stub!(:ask_for_credentials).and_return("username", "apikey")
|
143
|
+
@cli.stub!(:check) { raise Heroku::API::Errors::Unauthorized.new("Login Failed", Excon::Response.new) }
|
144
|
+
@cli.should_receive(:ask_for_credentials).exactly(3).times
|
145
|
+
lambda { @cli.ask_for_and_save_credentials }.should raise_error(SystemExit)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "deletes the credentials file" do
|
149
|
+
FileUtils.mkdir_p(File.dirname(@cli.legacy_credentials_path))
|
150
|
+
File.open(@cli.legacy_credentials_path, "w") do |file|
|
151
|
+
file.puts "legacy_user\nlegacy_pass"
|
152
|
+
end
|
153
|
+
FileUtils.should_receive(:rm_f).with(@cli.legacy_credentials_path)
|
154
|
+
@cli.delete_credentials
|
155
|
+
end
|
156
|
+
|
157
|
+
it "writes the login information to the credentials file for the 'heroku login' command" do
|
158
|
+
@cli.stub!(:ask_for_credentials).and_return(['one', 'two'])
|
159
|
+
@cli.stub!(:check)
|
160
|
+
@cli.should_receive(:check_for_associated_ssh_key)
|
161
|
+
@cli.reauthorize
|
162
|
+
Netrc.read(@cli.netrc_path)["api.#{@cli.host}"].should == (['one', 'two'])
|
163
|
+
end
|
164
|
+
|
165
|
+
it "migrates long api keys to short api keys" do
|
166
|
+
@cli.delete_credentials
|
167
|
+
api_key = "7e262de8cac430d8a250793ce8d5b334ae56b4ff15767385121145198a2b4d2e195905ef8bf7cfc5"
|
168
|
+
@cli.netrc["api.#{@cli.host}"] = ["user", api_key]
|
169
|
+
|
170
|
+
@cli.get_credentials.should == ["user", api_key[0,40]]
|
171
|
+
%w{api code}.each do |section|
|
172
|
+
Netrc.read(@cli.netrc_path)["#{section}.#{@cli.host}"].should == ["user", api_key[0,40]]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "automatic key uploading" do
|
177
|
+
before(:each) do
|
178
|
+
FileUtils.mkdir_p("#{@cli.home_directory}/.ssh")
|
179
|
+
@cli.stub!(:ask_for_credentials).and_return("username", "apikey")
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "an account with existing keys" do
|
183
|
+
before :each do
|
184
|
+
@api = mock(Object)
|
185
|
+
@response = mock(Object)
|
186
|
+
@response.should_receive(:body).and_return(['existingkeys'])
|
187
|
+
@api.should_receive(:get_keys).and_return(@response)
|
188
|
+
@cli.should_receive(:api).and_return(@api)
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should not do anything if the account already has keys" do
|
192
|
+
@cli.should_not_receive(:associate_key)
|
193
|
+
@cli.check_for_associated_ssh_key
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
describe "an account with no keys" do
|
198
|
+
before :each do
|
199
|
+
@api = mock(Object)
|
200
|
+
@response = mock(Object)
|
201
|
+
@response.should_receive(:body).and_return([])
|
202
|
+
@api.should_receive(:get_keys).and_return(@response)
|
203
|
+
@cli.should_receive(:api).and_return(@api)
|
204
|
+
end
|
205
|
+
|
206
|
+
describe "with zero public keys" do
|
207
|
+
it "should ask to generate a key" do
|
208
|
+
@cli.should_receive(:ask).and_return("y")
|
209
|
+
@cli.should_receive(:generate_ssh_key).with("id_rsa")
|
210
|
+
@cli.should_receive(:associate_key).with("#{@cli.home_directory}/.ssh/id_rsa.pub")
|
211
|
+
@cli.check_for_associated_ssh_key
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
describe "with one public key" do
|
216
|
+
before(:each) { FileUtils.touch("#{@cli.home_directory}/.ssh/id_rsa.pub") }
|
217
|
+
after(:each) { FileUtils.rm("#{@cli.home_directory}/.ssh/id_rsa.pub") }
|
218
|
+
|
219
|
+
it "should upload the key" do
|
220
|
+
@cli.should_receive(:associate_key).with("#{@cli.home_directory}/.ssh/id_rsa.pub")
|
221
|
+
@cli.check_for_associated_ssh_key
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
describe "with many public keys" do
|
226
|
+
before(:each) do
|
227
|
+
FileUtils.touch("#{@cli.home_directory}/.ssh/id_rsa.pub")
|
228
|
+
FileUtils.touch("#{@cli.home_directory}/.ssh/id_rsa2.pub")
|
229
|
+
end
|
230
|
+
|
231
|
+
after(:each) do
|
232
|
+
FileUtils.rm("#{@cli.home_directory}/.ssh/id_rsa.pub")
|
233
|
+
FileUtils.rm("#{@cli.home_directory}/.ssh/id_rsa2.pub")
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should ask which key to upload" do
|
237
|
+
File.open("#{@cli.home_directory}/.ssh/id_rsa.pub", "w") { |f| f.puts }
|
238
|
+
@cli.should_receive(:associate_key).with("#{@cli.home_directory}/.ssh/id_rsa2.pub")
|
239
|
+
@cli.should_receive(:ask).and_return("2")
|
240
|
+
@cli.check_for_associated_ssh_key
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "heroku/client/heroku_postgresql"
|
3
|
+
require "digest"
|
4
|
+
|
5
|
+
describe Heroku::Client::HerokuPostgresql do
|
6
|
+
|
7
|
+
include Heroku::Helpers
|
8
|
+
|
9
|
+
let(:url) { 'postgres://somewhere/somedb' }
|
10
|
+
let(:url_sha) { Digest::SHA2.hexdigest url }
|
11
|
+
let(:client) { Heroku::Client::HerokuPostgresql.new(url) }
|
12
|
+
|
13
|
+
it "sends an ingress request to the client" do
|
14
|
+
url = "https://shogun.heroku.com/client/v10/databases/#{url_sha}/ingress"
|
15
|
+
|
16
|
+
stub_request(:put, url).to_return(
|
17
|
+
:body => json_encode({"message" => "ok"}),
|
18
|
+
:status => 200
|
19
|
+
)
|
20
|
+
|
21
|
+
client.ingress
|
22
|
+
|
23
|
+
a_request(:put, url).should have_been_made.once
|
24
|
+
end
|
25
|
+
|
26
|
+
it "retries on error, then raises" do
|
27
|
+
url = "https://shogun.heroku.com/client/v10/databases/#{url_sha}"
|
28
|
+
stub_request(:get, url).to_return(:body => "error", :status => 500)
|
29
|
+
client.stub(:sleep)
|
30
|
+
lambda { client.get_database }.should raise_error RestClient::InternalServerError
|
31
|
+
a_request(:get, url).should have_been_made.times(4)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "heroku/client/pgbackups"
|
3
|
+
require "heroku/helpers"
|
4
|
+
|
5
|
+
describe Heroku::Client::Pgbackups do
|
6
|
+
|
7
|
+
include Heroku::Helpers
|
8
|
+
|
9
|
+
let(:path) { "http://id:password@pgbackups.heroku.com" }
|
10
|
+
let(:client) { Heroku::Client::Pgbackups.new path+'/api' }
|
11
|
+
let(:transfer_path) { path + '/client/transfers' }
|
12
|
+
|
13
|
+
describe "api" do
|
14
|
+
let(:version) { Heroku::Client.version }
|
15
|
+
|
16
|
+
it 'still has a heroku gem version' do
|
17
|
+
version.should be
|
18
|
+
version.split(/\./).first.to_i.should >= 2
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'includes the heroku gem version' do
|
22
|
+
stub_request(:get, transfer_path)
|
23
|
+
client.get_transfers
|
24
|
+
a_request(:get, transfer_path).with(
|
25
|
+
:headers => {'X-Heroku-Gem-Version' => version}
|
26
|
+
).should have_been_made.once
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "create transfers" do
|
31
|
+
it "sends a request to the client" do
|
32
|
+
stub_request(:post, transfer_path).to_return(
|
33
|
+
:body => json_encode({"message" => "success"}),
|
34
|
+
:status => 200
|
35
|
+
)
|
36
|
+
|
37
|
+
client.create_transfer("postgres://from", "postgres://to", "FROMNAME", "TO_NAME")
|
38
|
+
|
39
|
+
a_request(:post, transfer_path).should have_been_made.once
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "spec_helper"
|
3
|
+
require "heroku/client/rendezvous"
|
4
|
+
require "support/openssl_mock_helper"
|
5
|
+
|
6
|
+
describe Heroku::Client, "rendezvous" do
|
7
|
+
before do
|
8
|
+
@rendezvous = Heroku::Client::Rendezvous.new({
|
9
|
+
:rendezvous_url => "https://heroku.local:1234/secret",
|
10
|
+
:output => $stdout
|
11
|
+
})
|
12
|
+
end
|
13
|
+
context "fixup" do
|
14
|
+
it "null" do
|
15
|
+
@rendezvous.send(:fixup, nil).should be_nil
|
16
|
+
end
|
17
|
+
it "an empty string" do
|
18
|
+
@rendezvous.send(:fixup, "").should eq ""
|
19
|
+
end
|
20
|
+
it "hash" do
|
21
|
+
@rendezvous.send(:fixup, { :x => :y }).should eq({ :x => :y })
|
22
|
+
end
|
23
|
+
it "default English UTF-8 data" do
|
24
|
+
@rendezvous.send(:fixup, "heroku").should eq "heroku"
|
25
|
+
end
|
26
|
+
it "default Japanese UTF-8 encoded data" do
|
27
|
+
@rendezvous.send(:fixup, "愛しています").should eq "愛しています"
|
28
|
+
end
|
29
|
+
if RUBY_VERSION >= "1.9"
|
30
|
+
it "ISO-8859-1 force-encoded data" do
|
31
|
+
@rendezvous.send(:fixup, "Хероку".force_encoding("ISO-8859-1")).should eq "Хероку".force_encoding("UTF-8")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
context "with mock ssl" do
|
36
|
+
before :each do
|
37
|
+
mock_openssl
|
38
|
+
@ssl_socket_mock.should_receive(:puts).with("secret")
|
39
|
+
@ssl_socket_mock.should_receive(:readline).and_return(nil)
|
40
|
+
end
|
41
|
+
it "should connect to host:post" do
|
42
|
+
TCPSocket.should_receive(:open).with("heroku.local", 1234).and_return(@tcp_socket_mock)
|
43
|
+
IO.stub(:select).and_return(nil)
|
44
|
+
@ssl_socket_mock.stub(:write)
|
45
|
+
@ssl_socket_mock.stub(:flush) { raise Timeout::Error }
|
46
|
+
lambda { @rendezvous.start }.should raise_error(Timeout::Error)
|
47
|
+
end
|
48
|
+
it "should callback on_connect" do
|
49
|
+
@rendezvous.on_connect do
|
50
|
+
raise "on_connect"
|
51
|
+
end
|
52
|
+
TCPSocket.should_receive(:open).and_return(@tcp_socket_mock)
|
53
|
+
lambda { @rendezvous.start }.should raise_error("on_connect")
|
54
|
+
end
|
55
|
+
it "should fixup received data" do
|
56
|
+
TCPSocket.should_receive(:open).and_return(@tcp_socket_mock)
|
57
|
+
@ssl_socket_mock.should_receive(:readpartial).and_return("The quick brown fox jumps over the lazy dog")
|
58
|
+
@rendezvous.stub(:fixup) { |data| raise "received: #{data}" }
|
59
|
+
lambda { @rendezvous.start }.should raise_error("received: The quick brown fox jumps over the lazy dog")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "heroku/client/ssl_endpoint"
|
3
|
+
|
4
|
+
describe Heroku::Client, "ssl endpoints" do
|
5
|
+
before do
|
6
|
+
@client = Heroku::Client.new(nil, nil)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "adds an ssl endpoint" do
|
10
|
+
stub_request(:post, "https://api.heroku.com/apps/myapp/ssl-endpoints").
|
11
|
+
with(:body => { :accept => "json", :pem => "pem content", :key => "key content" }).
|
12
|
+
to_return(:body => %{ {"cname": "tokyo-1050" } })
|
13
|
+
@client.ssl_endpoint_add("myapp", "pem content", "key content").should == { "cname" => "tokyo-1050" }
|
14
|
+
end
|
15
|
+
|
16
|
+
it "gets info on an ssl endpoint" do
|
17
|
+
stub_request(:get, "https://api.heroku.com/apps/myapp/ssl-endpoints/tokyo-1050").
|
18
|
+
to_return(:body => %{ {"cname": "tokyo-1050" } })
|
19
|
+
@client.ssl_endpoint_info("myapp", "tokyo-1050").should == { "cname" => "tokyo-1050" }
|
20
|
+
end
|
21
|
+
|
22
|
+
it "lists ssl endpoints for an app" do
|
23
|
+
stub_request(:get, "https://api.heroku.com/apps/myapp/ssl-endpoints").
|
24
|
+
to_return(:body => %{ [{"cname": "tokyo-1050" }, {"cname": "tokyo-1051" }] })
|
25
|
+
@client.ssl_endpoint_list("myapp").should == [
|
26
|
+
{ "cname" => "tokyo-1050" },
|
27
|
+
{ "cname" => "tokyo-1051" },
|
28
|
+
]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "removes an ssl endpoint" do
|
32
|
+
stub_request(:delete, "https://api.heroku.com/apps/myapp/ssl-endpoints/tokyo-1050")
|
33
|
+
@client.ssl_endpoint_remove("myapp", "tokyo-1050")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "rolls back an ssl endpoint" do
|
37
|
+
stub_request(:post, "https://api.heroku.com/apps/myapp/ssl-endpoints/tokyo-1050/rollback").
|
38
|
+
to_return(:body => %{ {"cname": "tokyo-1050" } })
|
39
|
+
@client.ssl_endpoint_rollback("myapp", "tokyo-1050").should == { "cname" => "tokyo-1050" }
|
40
|
+
end
|
41
|
+
|
42
|
+
it "updates an ssl endpoint" do
|
43
|
+
stub_request(:put, "https://api.heroku.com/apps/myapp/ssl-endpoints/tokyo-1050").
|
44
|
+
with(:body => { :accept => "json", :pem => "pem content", :key => "key content" }).
|
45
|
+
to_return(:body => %{ {"cname": "tokyo-1050" } })
|
46
|
+
@client.ssl_endpoint_update("myapp", "tokyo-1050", "pem content", "key content").should == { "cname" => "tokyo-1050" }
|
47
|
+
end
|
48
|
+
end
|