shelly 0.0.37 → 0.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,7 @@ require "shelly/download_progress_bar"
5
5
  describe Shelly::CLI::Backup do
6
6
  before do
7
7
  @backup = Shelly::CLI::Backup.new
8
+ Shelly::CLI::Backup.stub(:new).and_return(@backup)
8
9
  @client = mock
9
10
  @client.stub(:token).and_return("abc")
10
11
  Shelly::Client.stub(:new).and_return(@client)
@@ -24,7 +25,7 @@ describe Shelly::CLI::Backup do
24
25
  File.delete("Cloudfile")
25
26
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
26
27
  lambda {
27
- @backup.list
28
+ invoke(@backup, :list)
28
29
  }.should raise_error(SystemExit)
29
30
  end
30
31
 
@@ -33,7 +34,7 @@ describe Shelly::CLI::Backup do
33
34
  exception = Shelly::Client::APIError.new(response.to_json, 401)
34
35
  @client.stub(:database_backups).and_raise(exception)
35
36
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
36
- lambda { @backup.list }.should raise_error(SystemExit)
37
+ lambda { invoke(@backup, :list) }.should raise_error(SystemExit)
37
38
  end
38
39
 
39
40
  context "multiple clouds" do
@@ -47,7 +48,7 @@ describe Shelly::CLI::Backup do
47
48
  $stdout.should_receive(:puts).with("Available clouds:")
48
49
  $stdout.should_receive(:puts).with(" * foo-production")
49
50
  $stdout.should_receive(:puts).with(" * foo-staging")
50
- lambda { @backup.list }.should raise_error(SystemExit)
51
+ lambda { invoke(@backup, :list) }.should raise_error(SystemExit)
51
52
  end
52
53
 
53
54
  it "should take cloud from command line for which to show backups" do
@@ -57,8 +58,8 @@ describe Shelly::CLI::Backup do
57
58
  $stdout.should_receive(:puts).with(" Filename | Size")
58
59
  $stdout.should_receive(:puts).with(" backup.postgre.tar.gz | 10kb")
59
60
  $stdout.should_receive(:puts).with(" backup.mongo.tar.gz | 22kb")
60
- @backup.options = {:cloud => 'foo-staging'}
61
- @backup.list
61
+ @backup.options = {:cloud => "foo-staging"}
62
+ invoke(@backup, :list)
62
63
  end
63
64
  end
64
65
 
@@ -73,30 +74,32 @@ describe Shelly::CLI::Backup do
73
74
 
74
75
  it "should make sure that cloud is choosen" do
75
76
  @client.should_receive(:database_backup).with("foo-staging", "last")
76
- @backup.get
77
+ invoke(@backup, :get)
78
+ end
77
79
 
78
- @backup.options = {:cloud => "other"}
80
+ it "should make sure that cloud is choosen" do
79
81
  @client.should_receive(:database_backup).with("other", "last")
80
- @backup.get
82
+ @backup.options = {:cloud => "other"}
83
+ invoke(@backup, :get)
81
84
  end
82
85
 
83
86
  it "should fetch backup size and initialize download progress bar" do
84
87
  @client.stub(:database_backup).and_return({"filename" => "backup.postgres.tar.gz", "size" => 333})
85
88
  Shelly::DownloadProgressBar.should_receive(:new).with(333).and_return(@bar)
86
89
 
87
- @backup.get
90
+ invoke(@backup, :get)
88
91
  end
89
92
 
90
93
  it "should fetch given backup file itself" do
91
94
  @client.should_receive(:download_backup).with("foo-staging", "better.tar.gz", @bar.progress_callback)
92
- @backup.get("better.tar.gz")
95
+ invoke(@backup, :get, "better.tar.gz")
93
96
  end
94
97
 
95
98
  it "should show info where file has been saved" do
96
99
  $stdout.should_receive(:puts)
97
100
  $stdout.should_receive(:puts).with(green "Backup file saved to better.tar.gz")
98
101
  @client.should_receive(:download_backup).with("foo-staging", "better.tar.gz", @bar.progress_callback)
99
- @backup.get("last")
102
+ invoke(@backup, :get, "last")
100
103
  end
101
104
 
102
105
  context "on backup not found" do
@@ -105,7 +108,7 @@ describe Shelly::CLI::Backup do
105
108
  @client.stub(:database_backup).and_raise(exception)
106
109
  $stdout.should_receive(:puts).with(red "Backup not found")
107
110
  $stdout.should_receive(:puts).with("You can list available backups with 'shelly backup list' command")
108
- @backup.get("better.tar.gz")
111
+ invoke(@backup, :get, "better.tar.gz")
109
112
  end
110
113
  end
111
114
 
@@ -116,7 +119,7 @@ describe Shelly::CLI::Backup do
116
119
  $stdout.should_not_receive(:puts).with(red "Backup not found")
117
120
  $stdout.should_not_receive(:puts).with("You can list available backups with 'shelly backup list' command")
118
121
  lambda {
119
- @backup.get("better.tar.gz")
122
+ invoke(@backup, :get, "better.tar.gz")
120
123
  }.should raise_error(Shelly::Client::APIError)
121
124
  end
122
125
  end
@@ -135,22 +138,22 @@ describe Shelly::CLI::Backup do
135
138
  exception = Shelly::Client::APIError.new(response.to_json, 404)
136
139
  @client.stub(:request_backup).and_raise(exception)
137
140
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
138
- lambda { @backup.create }.should raise_error(SystemExit)
141
+ lambda { invoke(@backup, :create) }.should raise_error(SystemExit)
139
142
  end
140
143
 
141
144
  it "should display errors and exit 1 when kind is not valid" do
142
145
  response = {"message" => "Wrong KIND argument. User one of following: postgresql, mongodb, redis"}
143
- exception = Shelly::Client::APIError.new(response.to_json, 404)
146
+ exception = Shelly::Client::APIError.new(response.to_json, 422)
144
147
  @client.should_receive(:request_backup).and_raise(exception)
145
148
  $stdout.should_receive(:puts).with(red response["message"])
146
- lambda { @backup.create }.should raise_error(SystemExit)
149
+ lambda { invoke(@backup, :create) }.should raise_error(SystemExit)
147
150
  end
148
151
 
149
152
  it "should display information about request backup" do
150
153
  @client.stub(:request_backup)
151
154
  $stdout.should_receive(:puts).with(green "Backup requested. It can take up to several minutes for" +
152
155
  "the backup process to finish and the backup to show up in backups list.")
153
- @backup.create
156
+ invoke(@backup, :create)
154
157
  end
155
158
  end
156
159
  end
@@ -6,6 +6,7 @@ describe Shelly::CLI::Config do
6
6
  before do
7
7
  FileUtils.stub(:chmod)
8
8
  @config = Shelly::CLI::Config.new
9
+ Shelly::CLI::Config.stub(:new).and_return(@config)
9
10
  @client = mock
10
11
  Shelly::Client.stub(:new).and_return(@client)
11
12
  $stdout.stub(:puts)
@@ -28,7 +29,7 @@ describe Shelly::CLI::Config do
28
29
  File.delete("Cloudfile")
29
30
  $stdout.should_receive(:puts).with(red "No Cloudfile found")
30
31
  lambda {
31
- @config.list
32
+ invoke(@config, :list)
32
33
  }.should raise_error(SystemExit)
33
34
  end
34
35
 
@@ -37,7 +38,7 @@ describe Shelly::CLI::Config do
37
38
  exception = Shelly::Client::APIError.new(response.to_json, 404)
38
39
  @client.stub(:app_configs).and_raise(exception)
39
40
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-production' cloud defined in Cloudfile")
40
- lambda { @config.list }.should raise_error(SystemExit)
41
+ lambda { invoke(@config, :list) }.should raise_error(SystemExit)
41
42
  end
42
43
 
43
44
  it "should list available configuration files for clouds" do
@@ -51,7 +52,7 @@ describe Shelly::CLI::Config do
51
52
  $stdout.should_receive(:puts).with("Custom configuration files:")
52
53
  $stdout.should_receive(:puts).with(/ * \s+config\/settings.yml/)
53
54
 
54
- @config.list
55
+ invoke(@config, :list)
55
56
  end
56
57
 
57
58
  end
@@ -60,19 +61,19 @@ describe Shelly::CLI::Config do
60
61
  it "should exit with message if there is no Cloudfile" do
61
62
  File.delete("Cloudfile")
62
63
  $stdout.should_receive(:puts).with(red "No Cloudfile found")
63
- lambda { @config.show(1) }.should raise_error(SystemExit)
64
+ lambda { invoke(@config, :show) }.should raise_error(SystemExit)
64
65
  end
65
66
 
66
- it "should exit if no id was specified" do
67
+ it "should exit if no path was specified" do
67
68
  $stdout.should_receive(:puts).with(red "No configuration file specified")
68
- lambda { @config.show }.should raise_error(SystemExit)
69
+ lambda { invoke(@config, :show) }.should raise_error(SystemExit)
69
70
  end
70
71
 
71
72
  it "should show config" do
72
- @client.should_receive(:app_config).with("foo-staging", 1).and_return({"path" => "test.rb", "content" => "example content"})
73
+ @client.should_receive(:app_config).with("foo-staging", "path").and_return({"path" => "test.rb", "content" => "example content"})
73
74
  $stdout.should_receive(:puts).with(green "Content of test.rb:")
74
75
  $stdout.should_receive(:puts).with("example content")
75
- @config.show(1)
76
+ invoke(@config, :show, "path")
76
77
  end
77
78
 
78
79
  context "multiple clouds" do
@@ -82,13 +83,13 @@ describe Shelly::CLI::Config do
82
83
 
83
84
  it "should show info to select cloud and exit" do
84
85
  $stdout.should_receive(:puts).with("You have multiple clouds in Cloudfile. Specify cloud using:")
85
- lambda { @config.show(1) }.should raise_error(SystemExit)
86
+ lambda { invoke(@config, :show, "path") }.should raise_error(SystemExit)
86
87
  end
87
88
 
88
89
  it "should use cloud specified by parameter" do
89
- @client.should_receive(:app_config).with("foo-production", 1).and_return({"path" => "test.rb", "content" => "example content"})
90
+ @client.should_receive(:app_config).with("foo-production", "path").and_return({"path" => "test.rb", "content" => "example content"})
90
91
  @config.options = {:cloud => "foo-production"}
91
- @config.show(1)
92
+ invoke(@config, :show, "path")
92
93
  end
93
94
  end
94
95
  end
@@ -97,25 +98,25 @@ describe Shelly::CLI::Config do
97
98
  it "should exit with message if there is no Cloudfile" do
98
99
  File.delete("Cloudfile")
99
100
  $stdout.should_receive(:puts).with(red "No Cloudfile found")
100
- lambda { @config.create("path") }.should raise_error(SystemExit)
101
+ lambda { invoke(@config, :create, "path") }.should raise_error(SystemExit)
101
102
  end
102
103
 
103
- it "should exit if no id was specified" do
104
+ it "should exit if no path was specified" do
104
105
  $stdout.should_receive(:puts).with(red "No path specified")
105
- lambda { @config.create }.should raise_error(SystemExit)
106
+ lambda { invoke(@config, :create) }.should raise_error(SystemExit)
106
107
  end
107
108
 
108
109
  it "should ask to set EDITOR environment variable if not set" do
109
110
  @config.stub(:system) {false}
110
111
  $stdout.should_receive(:puts).with(red "Please set EDITOR environment variable")
111
- lambda { @config.create("path") }.should raise_error(SystemExit)
112
+ lambda { invoke(@config, :create, "path") }.should raise_error(SystemExit)
112
113
  end
113
114
 
114
115
  it "should create file" do
115
116
  @config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
116
117
  @client.should_receive(:app_create_config).with("foo-staging", "path", "\n").and_return({})
117
118
  $stdout.should_receive(:puts).with(green "File 'path' created, it will be used after next code deploy")
118
- @config.create("path")
119
+ invoke(@config, :create, "path")
119
120
  end
120
121
 
121
122
  context "multiple clouds" do
@@ -133,7 +134,7 @@ describe Shelly::CLI::Config do
133
134
  @config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
134
135
  @client.should_receive(:app_create_config).with("foo-production", "path", "\n").and_return({})
135
136
  @config.options = {:cloud => "foo-production"}
136
- @config.create("path")
137
+ invoke(@config, :create, "path")
137
138
  end
138
139
  end
139
140
  end
@@ -143,27 +144,27 @@ describe Shelly::CLI::Config do
143
144
  it "should exit with message if there is no Cloudfile" do
144
145
  File.delete("Cloudfile")
145
146
  $stdout.should_receive(:puts).with(red "No Cloudfile found")
146
- lambda { @config.edit(1) }.should raise_error(SystemExit)
147
+ lambda { invoke(@config, :edit, "path") }.should raise_error(SystemExit)
147
148
  end
148
149
 
149
150
  it "should exit if no path was specified" do
150
151
  $stdout.should_receive(:puts).with(red "No configuration file specified")
151
- lambda { @config.edit }.should raise_error(SystemExit)
152
+ lambda { invoke(@config, :edit) }.should raise_error(SystemExit)
152
153
  end
153
154
 
154
155
  it "should ask to set EDITOR environment variable if not set" do
155
- @client.should_receive(:app_config).with("foo-staging", 1).and_return({"path" => "test.rb", "content" => "example content"})
156
+ @client.should_receive(:app_config).with("foo-staging", "path").and_return({"path" => "test.rb", "content" => "example content"})
156
157
  @config.stub(:system) {false}
157
158
  $stdout.should_receive(:puts).with(red "Please set EDITOR environment variable")
158
- lambda { @config.edit(1) }.should raise_error(SystemExit)
159
+ lambda { invoke(@config, :edit, "path") }.should raise_error(SystemExit)
159
160
  end
160
161
 
161
162
  it "should create file" do
162
- @client.should_receive(:app_config).with("foo-staging", 1).and_return({"path" => "test.rb", "content" => "example content"})
163
+ @client.should_receive(:app_config).with("foo-staging", "path").and_return({"path" => "test.rb", "content" => "example content"})
163
164
  @config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
164
- @client.should_receive(:app_update_config).with("foo-staging", 1, "example content\n").and_return({"path" => "test.rb", "content" => "example content"})
165
+ @client.should_receive(:app_update_config).with("foo-staging", "path", "example content\n").and_return({"path" => "test.rb", "content" => "example content"})
165
166
  $stdout.should_receive(:puts).with(green "File 'test.rb' updated, it will be used after next code deploy")
166
- @config.edit(1)
167
+ invoke(@config, :edit, "path")
167
168
  end
168
169
 
169
170
  context "multiple clouds" do
@@ -174,15 +175,15 @@ describe Shelly::CLI::Config do
174
175
  it "should show info to select cloud and exit" do
175
176
  @config.stub(:system) {true}
176
177
  $stdout.should_receive(:puts).with("You have multiple clouds in Cloudfile. Specify cloud using:")
177
- lambda { @config.edit(1) }.should raise_error(SystemExit)
178
+ lambda { invoke(@config, :edit, "path") }.should raise_error(SystemExit)
178
179
  end
179
180
 
180
181
  it "should use cloud specified by parameter" do
181
- @client.should_receive(:app_config).with("foo-production", 1).and_return({"path" => "test.rb", "content" => "example content"})
182
+ @client.should_receive(:app_config).with("foo-production", "path").and_return({"path" => "test.rb", "content" => "example content"})
182
183
  @config.should_receive(:system).with(/vim \/tmp\/shelly-edit/).and_return(true)
183
- @client.should_receive(:app_update_config).with("foo-production", 1, "example content\n").and_return({"path" => "test.rb", "content" => "example content"})
184
+ @client.should_receive(:app_update_config).with("foo-production", "path", "example content\n").and_return({"path" => "test.rb", "content" => "example content"})
184
185
  @config.options = {:cloud => "foo-production"}
185
- @config.edit(1)
186
+ invoke(@config, :edit, "path")
186
187
  end
187
188
  end
188
189
  end
@@ -191,19 +192,19 @@ describe Shelly::CLI::Config do
191
192
  it "should exit with message if there is no Cloudfile" do
192
193
  File.delete("Cloudfile")
193
194
  $stdout.should_receive(:puts).with(red "No Cloudfile found")
194
- lambda { @config.delete(1) }.should raise_error(SystemExit)
195
+ lambda { invoke(@config, :delete) }.should raise_error(SystemExit)
195
196
  end
196
197
 
197
198
  it "should exit if no path was specified" do
198
199
  $stdout.should_receive(:puts).with(red "No configuration file specified")
199
- lambda { @config.delete }.should raise_error(SystemExit)
200
+ lambda { invoke(@config, :delete) }.should raise_error(SystemExit)
200
201
  end
201
202
 
202
203
  it "should delete configuration file" do
203
- @client.should_receive(:app_delete_config).with("foo-staging", 1).and_return({})
204
+ @client.should_receive(:app_delete_config).with("foo-staging", "path").and_return({})
204
205
  $stdout.should_receive(:puts).with(green "File deleted, redeploy your cloud to make changes")
205
206
  fake_stdin(["y"]) do
206
- @config.delete(1)
207
+ invoke(@config, :delete, "path")
207
208
  end
208
209
  end
209
210
 
@@ -211,7 +212,7 @@ describe Shelly::CLI::Config do
211
212
  @client.should_not_receive(:app_delete_config)
212
213
  $stdout.should_receive(:puts).with("File not deleted")
213
214
  fake_stdin(["n"]) do
214
- @config.delete(1)
215
+ invoke(@config, :delete, "path")
215
216
  end
216
217
  end
217
218
 
@@ -222,15 +223,15 @@ describe Shelly::CLI::Config do
222
223
 
223
224
  it "should show info to select cloud and exit" do
224
225
  $stdout.should_receive(:puts).with("You have multiple clouds in Cloudfile. Specify cloud using:")
225
- lambda { @config.delete(1) }.should raise_error(SystemExit)
226
+ lambda { invoke(@config, :delete, "path") }.should raise_error(SystemExit)
226
227
  end
227
228
 
228
229
  it "should use cloud specified by parameter" do
229
- @client.should_receive(:app_delete_config).with("foo-production", 1).and_return({})
230
+ @client.should_receive(:app_delete_config).with("foo-production", "path").and_return({})
230
231
  $stdout.should_receive(:puts).with(green "File deleted, redeploy your cloud to make changes")
231
232
  @config.options = {:cloud => "foo-production"}
232
233
  fake_stdin(["y"]) do
233
- @config.delete(1)
234
+ invoke(@config, :delete, "path")
234
235
  end
235
236
  end
236
237
  end
@@ -5,6 +5,7 @@ describe Shelly::CLI::Deploys do
5
5
  before do
6
6
  FileUtils.stub(:chmod)
7
7
  @deploys = Shelly::CLI::Deploys.new
8
+ Shelly::CLI::Deploys.stub(:new).and_return(@deploys)
8
9
  @client = mock
9
10
  Shelly::Client.stub(:new).and_return(@client)
10
11
  $stdout.stub(:puts)
@@ -23,7 +24,7 @@ describe Shelly::CLI::Deploys do
23
24
  File.delete("Cloudfile")
24
25
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
25
26
  lambda {
26
- @deploys.list
27
+ invoke(@deploys, :list)
27
28
  }.should raise_error(SystemExit)
28
29
  end
29
30
 
@@ -32,7 +33,7 @@ describe Shelly::CLI::Deploys do
32
33
  exception = Shelly::Client::APIError.new(response.to_json, 404)
33
34
  @client.stub(:deploy_logs).and_raise(exception)
34
35
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
35
- lambda { @deploys.list }.should raise_error(SystemExit)
36
+ lambda { invoke(@deploys, :list) }.should raise_error(SystemExit)
36
37
  end
37
38
 
38
39
  context "multiple clouds" do
@@ -46,7 +47,7 @@ describe Shelly::CLI::Deploys do
46
47
  $stdout.should_receive(:puts).with("Available clouds:")
47
48
  $stdout.should_receive(:puts).with(" * foo-production")
48
49
  $stdout.should_receive(:puts).with(" * foo-staging")
49
- lambda { @deploys.list }.should raise_error(SystemExit)
50
+ lambda { invoke(@deploys, :list) }.should raise_error(SystemExit)
50
51
  end
51
52
 
52
53
  it "should take cloud from command line for which to show logs" do
@@ -54,17 +55,19 @@ describe Shelly::CLI::Deploys do
54
55
  $stdout.should_receive(:puts).with(green "Available deploy logs")
55
56
  $stdout.should_receive(:puts).with(" * 2011-12-12-14-14-59")
56
57
  @deploys.options = {:cloud => "foo-staging"}
57
- @deploys.list
58
+ invoke(@deploys, :list)
58
59
  end
59
60
  end
60
61
 
61
62
  context "single cloud" do
62
63
  it "should display available logs" do
63
- @client.should_receive(:deploy_logs).with("foo-staging").and_return([{"failed" => false, "created_at" => "2011-12-12-14-14-59"}, {"failed" => true, "created_at" => "2011-12-12-15-14-59"}])
64
+ @client.should_receive(:deploy_logs).with("foo-staging").and_return([
65
+ {"failed" => false, "created_at" => "2011-12-12-14-14-59"},
66
+ {"failed" => true, "created_at" => "2011-12-12-15-14-59"}])
64
67
  $stdout.should_receive(:puts).with(green "Available deploy logs")
65
68
  $stdout.should_receive(:puts).with(" * 2011-12-12-14-14-59")
66
69
  $stdout.should_receive(:puts).with(" * 2011-12-12-15-14-59 (failed)")
67
- @deploys.list
70
+ invoke(@deploys, :list)
68
71
  end
69
72
  end
70
73
  end
@@ -81,7 +84,7 @@ describe Shelly::CLI::Deploys do
81
84
  File.delete("Cloudfile")
82
85
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
83
86
  lambda {
84
- @deploys.show
87
+ invoke(@deploys, :show)
85
88
  }.should raise_error(SystemExit)
86
89
  end
87
90
 
@@ -90,7 +93,7 @@ describe Shelly::CLI::Deploys do
90
93
  exception = Shelly::Client::APIError.new(response.to_json, 404)
91
94
  @client.stub(:deploy_log).and_raise(exception)
92
95
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
93
- lambda { @deploys.show("last") }.should raise_error(SystemExit)
96
+ lambda { invoke(@deploys, :show, "last") }.should raise_error(SystemExit)
94
97
  end
95
98
 
96
99
  context "multiple clouds" do
@@ -104,14 +107,14 @@ describe Shelly::CLI::Deploys do
104
107
  $stdout.should_receive(:puts).with("Available clouds:")
105
108
  $stdout.should_receive(:puts).with(" * foo-production")
106
109
  $stdout.should_receive(:puts).with(" * foo-staging")
107
- lambda { @deploys.show("last") }.should raise_error(SystemExit)
110
+ lambda { invoke(@deploys, :show, "last") }.should raise_error(SystemExit)
108
111
  end
109
112
 
110
113
  it "should render the logs" do
111
114
  @client.should_receive(:deploy_log).with("foo-staging", "last").and_return(response)
112
115
  expected_output
113
116
  @deploys.options = {:cloud => "foo-staging"}
114
- @deploys.show("last")
117
+ invoke(@deploys, :show, "last")
115
118
  end
116
119
  end
117
120
 
@@ -119,7 +122,7 @@ describe Shelly::CLI::Deploys do
119
122
  it "should render logs without passing cloud" do
120
123
  @client.should_receive(:deploy_log).with("foo-staging", "last").and_return(response)
121
124
  expected_output
122
- @deploys.show("last")
125
+ invoke(@deploys, :show, "last")
123
126
  end
124
127
  end
125
128
 
@@ -5,6 +5,7 @@ describe Shelly::CLI::Main do
5
5
  before do
6
6
  FileUtils.stub(:chmod)
7
7
  @main = Shelly::CLI::Main.new
8
+ Shelly::CLI::Main.stub(:new).and_return(@main)
8
9
  @client = mock
9
10
  Shelly::Client.stub(:new).and_return(@client)
10
11
  Shelly::User.stub(:guess_email).and_return("")
@@ -15,7 +16,7 @@ describe Shelly::CLI::Main do
15
16
  describe "#version" do
16
17
  it "should return shelly's version" do
17
18
  $stdout.should_receive(:puts).with("shelly version #{Shelly::VERSION}")
18
- @main.version
19
+ invoke(@main, :version)
19
20
  end
20
21
  end
21
22
 
@@ -42,7 +43,7 @@ Tasks:
42
43
  Options:
43
44
  [--debug] # Show debug information
44
45
  OUT
45
- out = IO.popen("bin/shelly").read.strip
46
+ out = IO.popen("bin/shelly --debug").read.strip
46
47
  out.should == expected.strip
47
48
  end
48
49
 
@@ -79,7 +80,7 @@ OUT
79
80
  $stdout.should_receive(:puts).with("\e[31mNo such file or directory - " + @key_path + "\e[0m")
80
81
  $stdout.should_receive(:puts).with("\e[31mUse ssh-keygen to generate ssh key pair\e[0m")
81
82
  lambda {
82
- @main.register
83
+ invoke(@main, :register)
83
84
  }.should raise_error(SystemExit)
84
85
  end
85
86
 
@@ -88,7 +89,7 @@ OUT
88
89
  $stdout.should_receive(:puts).with("\e[31mUser with your ssh key already exists.\e[0m")
89
90
  $stdout.should_receive(:puts).with("\e[31mYou can login using: shelly login [EMAIL]\e[0m")
90
91
  lambda {
91
- @main.register
92
+ invoke(@main, :register)
92
93
  }.should raise_error(SystemExit)
93
94
  end
94
95
 
@@ -97,7 +98,7 @@ OUT
97
98
  $stdout.should_receive(:print).with("Password: ")
98
99
  $stdout.should_receive(:print).with("Password confirmation: ")
99
100
  fake_stdin(["better@example.com", "secret", "secret"]) do
100
- @main.register
101
+ invoke(@main, :register)
101
102
  end
102
103
  end
103
104
 
@@ -106,21 +107,21 @@ OUT
106
107
  $stdout.should_receive(:print).with("Email (kate@example.com - default): ")
107
108
  @client.should_receive(:register_user).with("kate@example.com", "secret", "ssh-key AAbbcc")
108
109
  fake_stdin(["", "secret", "secret"]) do
109
- @main.register
110
+ invoke(@main, :register)
110
111
  end
111
112
  end
112
113
 
113
114
  it "should use email provided by user" do
114
115
  @client.should_receive(:register_user).with("better@example.com", "secret", "ssh-key AAbbcc")
115
116
  fake_stdin(["better@example.com", "secret", "secret"]) do
116
- @main.register
117
+ invoke(@main, :register)
117
118
  end
118
119
  end
119
120
 
120
121
  it "should not ask about email if it's provided as argument" do
121
122
  $stdout.should_receive(:puts).with("Registering with email: kate@example.com")
122
123
  fake_stdin(["secret", "secret"]) do
123
- @main.register("kate@example.com")
124
+ invoke(@main, :register, "kate@example.com")
124
125
  end
125
126
  end
126
127
 
@@ -130,7 +131,7 @@ OUT
130
131
  $stdout.should_receive(:puts).with("\e[31mEmail can't be blank, please try again\e[0m")
131
132
  lambda {
132
133
  fake_stdin(["", "bob@example.com", "only-pass", "only-pass"]) do
133
- @main.register
134
+ invoke(@main, :register)
134
135
  end
135
136
  }.should raise_error(SystemExit)
136
137
  end
@@ -142,7 +143,7 @@ OUT
142
143
  File.open(@key_path, "w") { |f| f << "key" }
143
144
  $stdout.should_receive(:puts).with("Uploading your public SSH key from #{@key_path}")
144
145
  fake_stdin(["kate@example.com", "secret", "secret"]) do
145
- @main.register
146
+ invoke(@main, :register)
146
147
  end
147
148
  end
148
149
  end
@@ -153,7 +154,7 @@ OUT
153
154
  FileUtils.rm_rf(@key_path)
154
155
  $stdout.should_not_receive(:puts).with("Uploading your public SSH key from #{@key_path}")
155
156
  fake_stdin(["kate@example.com", "secret", "secret"]) do
156
- @main.register
157
+ invoke(@main, :register)
157
158
  end
158
159
  end
159
160
  end
@@ -164,7 +165,7 @@ OUT
164
165
  $stdout.should_receive(:puts).with("Successfully registered!")
165
166
  $stdout.should_receive(:puts).with("Check you mailbox for email address confirmation")
166
167
  fake_stdin(["kate@example.com", "pass", "pass"]) do
167
- @main.register
168
+ invoke(@main, :register)
168
169
  end
169
170
  end
170
171
  end
@@ -177,7 +178,7 @@ OUT
177
178
  $stdout.should_receive(:puts).with("\e[31mEmail has been already taken\e[0m")
178
179
  lambda {
179
180
  fake_stdin(["kate@example.com", "pass", "pass"]) do
180
- @main.register
181
+ invoke(@main, :register)
181
182
  end
182
183
  }.should raise_error(SystemExit)
183
184
  end
@@ -199,7 +200,7 @@ OUT
199
200
 
200
201
  it "should ask about email and password" do
201
202
  fake_stdin(["megan@example.com", "secret"]) do
202
- @main.login
203
+ invoke(@main, :login)
203
204
  end
204
205
  end
205
206
 
@@ -207,14 +208,14 @@ OUT
207
208
  it "should display message about successful login" do
208
209
  $stdout.should_receive(:puts).with("Login successful")
209
210
  fake_stdin(["megan@example.com", "secret"]) do
210
- @main.login
211
+ invoke(@main, :login)
211
212
  end
212
213
  end
213
214
 
214
215
  it "should accept email as parameter" do
215
216
  $stdout.should_receive(:puts).with("Login successful")
216
217
  fake_stdin(["secret"]) do
217
- @main.login("megan@example.com")
218
+ invoke(@main, :login, "megan@example.com")
218
219
  end
219
220
  end
220
221
 
@@ -222,7 +223,7 @@ OUT
222
223
  @user.should_receive(:upload_ssh_key)
223
224
  $stdout.should_receive(:puts).with("Uploading your public SSH key")
224
225
  fake_stdin(["megan@example.com", "secret"]) do
225
- @main.login
226
+ invoke(@main, :login)
226
227
  end
227
228
  end
228
229
 
@@ -230,7 +231,7 @@ OUT
230
231
  @user.should_receive(:upload_ssh_key).and_raise(RestClient::Conflict)
231
232
  $stdout.should_receive(:puts).with("\e[32mYou have following clouds available:\e[0m")
232
233
  fake_stdin(["megan@example.com", "secret"]) do
233
- @main.login
234
+ invoke(@main, :login)
234
235
  end
235
236
  end
236
237
 
@@ -239,7 +240,7 @@ OUT
239
240
  $stdout.should_receive(:puts).with(/ abc\s+\| running/)
240
241
  $stdout.should_receive(:puts).with(/ fooo\s+\| no code/)
241
242
  fake_stdin(["megan@example.com", "secret"]) do
242
- @main.login
243
+ invoke(@main, :login)
243
244
  end
244
245
  end
245
246
  end
@@ -251,7 +252,7 @@ OUT
251
252
  $stdout.should_receive(:puts).with("\e[31mNo such file or directory - " + @key_path + "\e[0m")
252
253
  $stdout.should_receive(:puts).with("\e[31mUse ssh-keygen to generate ssh key pair\e[0m")
253
254
  lambda {
254
- @main.login
255
+ invoke(@main, :login)
255
256
  }.should raise_error(SystemExit)
256
257
  end
257
258
  end
@@ -266,7 +267,7 @@ OUT
266
267
  $stdout.should_receive(:puts).with("\e[31mhttps://admin.winniecloud.com/users/password/new\e[0m")
267
268
  lambda {
268
269
  fake_stdin(["megan@example.com", "secret"]) do
269
- @main.login
270
+ invoke(@main, :login)
270
271
  end
271
272
  }.should raise_error(SystemExit)
272
273
  end
@@ -285,6 +286,7 @@ OUT
285
286
  @app.stub(:git_url).and_return("git@git.shellycloud.com:foooo.git")
286
287
  Shelly::App.stub(:inside_git_repository?).and_return(true)
287
288
  Shelly::App.stub(:new).and_return(@app)
289
+ @client.stub(:token).and_return("abc")
288
290
  end
289
291
 
290
292
  it "should exit with message if command run outside git repository" do
@@ -292,7 +294,7 @@ OUT
292
294
  $stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
293
295
  lambda {
294
296
  fake_stdin(["", ""]) do
295
- @main.add
297
+ invoke(@main, :add)
296
298
  end
297
299
  }.should raise_error(SystemExit)
298
300
  end
@@ -303,33 +305,25 @@ OUT
303
305
  it "should show help and exit if not all options are passed" do
304
306
  $stdout.should_receive(:puts).with("\e[31mTry 'shelly help add' for more information\e[0m")
305
307
  @main.options = {"code-name" => "foo"}
306
- lambda { @main.add }.should raise_error(SystemExit)
308
+ lambda {
309
+ invoke(@main, :add)
310
+ }.should raise_error(SystemExit)
307
311
  end
308
312
 
309
313
  it "should exit if databases are not valid" do
310
314
  $stdout.should_receive(:puts).with("\e[31mTry 'shelly help add' for more information\e[0m")
311
- @main.options = {"code-name" => "foo", "databases" => ["not existing"], "domains" => ["foo.example.com"]}
312
- lambda { @main.add }.should raise_error(SystemExit)
313
- end
314
-
315
- it "should display which parameter was wrong" do
316
- expected = "shelly: unrecognized option '--unknown=param'\n" +
317
- "Usage: shelly [COMMAND]... [OPTIONS]\n" +
318
- "Try 'shelly --help' for more information"
319
-
320
- Open3.popen3("bin/shelly add --unknown=param") do |stdin, stdout, stderr, wait_thr|
321
- out = stderr.read.strip
322
- out.should == expected
323
- end
315
+ @main.options = {"code-name" => "foo", :databases => ["not existing"], :domains => "foo.example.com"}
316
+ lambda {
317
+ invoke(@main, :add)
318
+ }.should raise_error(SystemExit)
324
319
  end
325
-
326
320
  end
327
321
 
328
322
  context "valid params" do
329
323
  it "should create app on shelly cloud" do
330
324
  @app.should_receive(:create)
331
325
  @main.options = {"code-name" => "foo", "databases" => ["postgresql"], "domains" => ["foo.example.com"]}
332
- @main.add
326
+ invoke(@main, :add)
333
327
  end
334
328
  end
335
329
  end
@@ -338,7 +332,7 @@ OUT
338
332
  $stdout.should_receive(:print).with("Cloud code name (foo-production - default): ")
339
333
  @app.should_receive(:code_name=).with("mycodename")
340
334
  fake_stdin(["mycodename", ""]) do
341
- @main.add
335
+ invoke(@main, :add)
342
336
  end
343
337
  end
344
338
 
@@ -347,7 +341,7 @@ OUT
347
341
  $stdout.should_receive(:print).with("Cloud code name (foo-production - default): ")
348
342
  @app.should_receive(:code_name=).with("foo-production")
349
343
  fake_stdin(["", ""]) do
350
- @main.add
344
+ invoke(@main, :add)
351
345
  end
352
346
  end
353
347
  end
@@ -356,7 +350,7 @@ OUT
356
350
  $stdout.should_receive(:print).with("Which database do you want to use postgresql, mongodb, redis, none (postgresql - default): ")
357
351
  @app.should_receive(:databases=).with(["postgresql", "mongodb", "redis"])
358
352
  fake_stdin(["", "postgresql ,mongodb redis"]) do
359
- @main.add
353
+ invoke(@main, :add)
360
354
  end
361
355
  end
362
356
 
@@ -364,7 +358,7 @@ OUT
364
358
  $stdout.should_receive(:print).with("Which database do you want to use postgresql, mongodb, redis, none (postgresql - default): ")
365
359
  $stdout.should_receive(:print).with("Unknown database kind. Supported are: postgresql, mongodb, redis, none: ")
366
360
  fake_stdin(["", "postgresql,doesnt-exist", "none"]) do
367
- @main.add
361
+ invoke(@main, :add)
368
362
  end
369
363
  end
370
364
 
@@ -372,7 +366,7 @@ OUT
372
366
  it "should use 'postgresql' database as default" do
373
367
  @app.should_receive(:databases=).with(["postgresql"])
374
368
  fake_stdin(["", ""]) do
375
- @main.add
369
+ invoke(@main, :add)
376
370
  end
377
371
  end
378
372
  end
@@ -380,7 +374,7 @@ OUT
380
374
  it "should create the app on shelly cloud" do
381
375
  @app.should_receive(:create)
382
376
  fake_stdin(["", ""]) do
383
- @main.add
377
+ invoke(@main, :add)
384
378
  end
385
379
  end
386
380
 
@@ -393,7 +387,7 @@ OUT
393
387
  $stdout.should_receive(:puts).with("\e[31mshelly add --code-name=foo-production --databases=postgresql --domains=foo-production.shellyapp.com\e[0m")
394
388
  lambda {
395
389
  fake_stdin(["", ""]) do
396
- @main.add
390
+ invoke(@main, :add)
397
391
  end
398
392
  }.should raise_error(SystemExit)
399
393
  end
@@ -402,14 +396,14 @@ OUT
402
396
  $stdout.should_receive(:puts).with("\e[32mAdding remote production git@git.shellycloud.com:foooo.git\e[0m")
403
397
  @app.should_receive(:add_git_remote)
404
398
  fake_stdin(["foooo", ""]) do
405
- @main.add
399
+ invoke(@main, :add)
406
400
  end
407
401
  end
408
402
 
409
403
  it "should create Cloudfile" do
410
404
  File.exists?("/projects/foo/Cloudfile").should be_false
411
405
  fake_stdin(["foooo", ""]) do
412
- @main.add
406
+ invoke(@main, :add)
413
407
  end
414
408
  File.read("/projects/foo/Cloudfile").should == "Example Cloudfile"
415
409
  end
@@ -418,7 +412,7 @@ OUT
418
412
  $stdout.should_receive(:puts).with("\e[32mProvide billing details. Opening browser...\e[0m")
419
413
  @app.should_receive(:open_billing_page)
420
414
  fake_stdin(["foooo", ""]) do
421
- @main.add
415
+ invoke(@main, :add)
422
416
  end
423
417
  end
424
418
 
@@ -427,7 +421,7 @@ OUT
427
421
  $stdout.should_receive(:puts).with("\e[32mYou can review changes using\e[0m")
428
422
  $stdout.should_receive(:puts).with(" git status")
429
423
  fake_stdin(["foooo", "none"]) do
430
- @main.add
424
+ invoke(@main, :add)
431
425
  end
432
426
  end
433
427
 
@@ -439,7 +433,7 @@ OUT
439
433
  $stdout.should_receive(:puts).with("\e[32mDeploy to production using:\e[0m")
440
434
  $stdout.should_receive(:puts).with(" git push production master")
441
435
  fake_stdin(["foooo", "none"]) do
442
- @main.add
436
+ invoke(@main, :add)
443
437
  end
444
438
  end
445
439
  end
@@ -457,19 +451,19 @@ OUT
457
451
  $stdout.should_receive(:puts).with("\e[32mYou have following clouds available:\e[0m")
458
452
  $stdout.should_receive(:puts).with(/abc\s+\| running/)
459
453
  $stdout.should_receive(:puts).with(/fooo\s+\| deploy failed \(Support has been notified\)/)
460
- @main.list
454
+ invoke(@main, :list)
461
455
  end
462
456
 
463
457
  it "should display info that user has no clouds" do
464
458
  @client.stub(:apps).and_return([])
465
459
  $stdout.should_receive(:puts).with("\e[32mYou have no clouds yet\e[0m")
466
- @main.list
460
+ invoke(@main, :list)
467
461
  end
468
462
 
469
463
  it "should have a 'status' alias" do
470
464
  @client.stub(:apps).and_return([])
471
465
  $stdout.should_receive(:puts).with("\e[32mYou have no clouds yet\e[0m")
472
- Shelly::CLI::Main.start(["status"])
466
+ invoke(@main, :status)
473
467
  end
474
468
 
475
469
  context "on failure" do
@@ -477,9 +471,10 @@ OUT
477
471
  body = {"message" => "Unauthorized"}
478
472
  error = Shelly::Client::APIError.new(body.to_json, 401)
479
473
  @client.stub(:token).and_raise(error)
480
- $stdout.should_receive(:puts).with("\e[31mYou are not logged in, use `shelly login`\e[0m")
474
+ $stdout.should_receive(:puts).with(red "You are not logged in. To log in use:")
475
+ $stdout.should_receive(:puts).with(" shelly login")
481
476
  lambda {
482
- @main.list
477
+ invoke(@main, :list)
483
478
  }.should raise_error(SystemExit)
484
479
  end
485
480
  end
@@ -502,7 +497,7 @@ OUT
502
497
  File.delete("Cloudfile")
503
498
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
504
499
  lambda {
505
- @main.start
500
+ invoke(@main, :start)
506
501
  }.should raise_error(SystemExit)
507
502
  end
508
503
 
@@ -511,7 +506,7 @@ OUT
511
506
  exception = Shelly::Client::APIError.new(response.to_json, 404)
512
507
  @client.stub(:start_cloud).and_raise(exception)
513
508
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-production' cloud defined in Cloudfile")
514
- lambda { @main.start }.should raise_error(SystemExit)
509
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
515
510
  end
516
511
 
517
512
  it "should exit if user is not logged in" do
@@ -520,7 +515,7 @@ OUT
520
515
  @client.stub(:token).and_raise(exception)
521
516
  $stdout.should_receive(:puts).with(red "You are not logged in. To log in use:")
522
517
  $stdout.should_receive(:puts).with(" shelly login")
523
- lambda { @main.start }.should raise_error(SystemExit)
518
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
524
519
  end
525
520
 
526
521
  context "single cloud in Cloudfile" do
@@ -528,7 +523,7 @@ OUT
528
523
  @client.stub(:start_cloud)
529
524
  $stdout.should_receive(:puts).with(green "Starting cloud foo-production. Check status with:")
530
525
  $stdout.should_receive(:puts).with(" shelly list")
531
- @main.start
526
+ invoke(@main, :start)
532
527
  end
533
528
  end
534
529
 
@@ -543,7 +538,7 @@ OUT
543
538
  $stdout.should_receive(:puts).with("Available clouds:")
544
539
  $stdout.should_receive(:puts).with(" * foo-production")
545
540
  $stdout.should_receive(:puts).with(" * foo-staging")
546
- lambda { @main.start }.should raise_error(SystemExit)
541
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
547
542
  end
548
543
 
549
544
  it "should fetch from command line which cloud to start" do
@@ -551,7 +546,7 @@ OUT
551
546
  $stdout.should_receive(:puts).with(green "Starting cloud foo-staging. Check status with:")
552
547
  $stdout.should_receive(:puts).with(" shelly list")
553
548
  @main.options = {:cloud => "foo-staging"}
554
- @main.start
549
+ invoke(@main, :start)
555
550
  end
556
551
  end
557
552
 
@@ -559,14 +554,14 @@ OUT
559
554
  it "should show information that cloud is running" do
560
555
  raise_conflict(:state => "running")
561
556
  $stdout.should_receive(:puts).with(red "Not starting: cloud 'foo-production' is already running")
562
- lambda { @main.start }.should raise_error(SystemExit)
557
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
563
558
  end
564
559
 
565
560
  %w{deploying configuring}.each do |state|
566
561
  it "should show information that cloud is #{state}" do
567
562
  raise_conflict(:state => state)
568
563
  $stdout.should_receive(:puts).with(red "Not starting: cloud 'foo-production' is currently deploying")
569
- lambda { @main.start }.should raise_error(SystemExit)
564
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
570
565
  end
571
566
  end
572
567
 
@@ -575,7 +570,7 @@ OUT
575
570
  $stdout.should_receive(:puts).with(red "Not starting: no source code provided")
576
571
  $stdout.should_receive(:puts).with(red "Push source code using:")
577
572
  $stdout.should_receive(:puts).with(" git push production master")
578
- lambda { @main.start }.should raise_error(SystemExit)
573
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
579
574
  end
580
575
 
581
576
  %w{deploy_failed configuration_failed}.each do |state|
@@ -584,14 +579,14 @@ OUT
584
579
  $stdout.should_receive(:puts).with(red "Not starting: deployment failed")
585
580
  $stdout.should_receive(:puts).with(red "Support has been notified")
586
581
  $stdout.should_receive(:puts).with(red "See http://example.com/logs for reasons of failure")
587
- lambda { @main.start }.should raise_error(SystemExit)
582
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
588
583
  end
589
584
  end
590
585
  it "should open billing page" do
591
586
  raise_conflict(:state => "no_billing")
592
587
  $stdout.should_receive(:puts).with(red "Please fill in billing details to start foo-production. Opening browser.")
593
588
  @app.should_receive(:open_billing_page)
594
- lambda { @main.start }.should raise_error(SystemExit)
589
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
595
590
  end
596
591
 
597
592
  def raise_conflict(options = {})
@@ -620,7 +615,7 @@ OUT
620
615
  File.delete("Cloudfile")
621
616
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
622
617
  lambda {
623
- @main.stop
618
+ invoke(@main, :stop)
624
619
  }.should raise_error(SystemExit)
625
620
  end
626
621
 
@@ -629,7 +624,7 @@ OUT
629
624
  exception = Shelly::Client::APIError.new(response.to_json, 404)
630
625
  @client.stub(:stop_cloud).and_raise(exception)
631
626
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-production' cloud defined in Cloudfile")
632
- lambda { @main.stop }.should raise_error(SystemExit)
627
+ lambda { invoke(@main, :stop) }.should raise_error(SystemExit)
633
628
  end
634
629
 
635
630
  it "should exit if user is not logged in" do
@@ -638,14 +633,14 @@ OUT
638
633
  @client.stub(:token).and_raise(exception)
639
634
  $stdout.should_receive(:puts).with(red "You are not logged in. To log in use:")
640
635
  $stdout.should_receive(:puts).with(" shelly login")
641
- lambda { @main.stop }.should raise_error(SystemExit)
636
+ lambda { invoke(@main, :stop) }.should raise_error(SystemExit)
642
637
  end
643
638
 
644
639
  context "single cloud in Cloudfile" do
645
640
  it "should start the cloud" do
646
641
  @client.stub(:stop_cloud)
647
642
  $stdout.should_receive(:puts).with("Cloud 'foo-production' stopped")
648
- @main.stop
643
+ invoke(@main, :stop)
649
644
  end
650
645
  end
651
646
 
@@ -660,14 +655,14 @@ OUT
660
655
  $stdout.should_receive(:puts).with("Available clouds:")
661
656
  $stdout.should_receive(:puts).with(" * foo-production")
662
657
  $stdout.should_receive(:puts).with(" * foo-staging")
663
- lambda { @main.stop }.should raise_error(SystemExit)
658
+ lambda { invoke(@main, :stop) }.should raise_error(SystemExit)
664
659
  end
665
660
 
666
661
  it "should fetch from command line which cloud to start" do
667
662
  @client.should_receive(:stop_cloud).with("foo-staging")
668
663
  $stdout.should_receive(:puts).with("Cloud 'foo-staging' stopped")
669
664
  @main.options = {:cloud => "foo-staging"}
670
- @main.stop
665
+ invoke(@main, :stop)
671
666
  end
672
667
  end
673
668
  end
@@ -678,29 +673,21 @@ OUT
678
673
  Shelly::App.stub(:inside_git_repository?).and_return(true)
679
674
  end
680
675
 
681
- it "should exit with message if command run outside git repository" do
682
- Shelly::App.stub(:inside_git_repository?).and_return(false)
683
- $stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
684
- lambda {
685
- @main.ip
686
- }.should raise_error(SystemExit)
687
- end
688
-
689
676
  it "should exit with message if there is no Cloudfile" do
690
677
  File.delete("Cloudfile")
691
678
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
692
679
  lambda {
693
- @main.ip
680
+ invoke(@main, :ip)
694
681
  }.should raise_error(SystemExit)
695
682
  end
696
683
 
697
684
  context "on success" do
698
685
  it "should display mail and web server ip's" do
699
- @client.stub(:app_ips).and_return(response)
686
+ @client.stub(:app).and_return(response)
700
687
  $stdout.should_receive(:puts).with("\e[32mCloud foo-production:\e[0m")
701
688
  $stdout.should_receive(:puts).with(" Web server IP: 22.22.22.22")
702
689
  $stdout.should_receive(:puts).with(" Mail server IP: 11.11.11.11")
703
- @main.ip
690
+ invoke(@main, :ip)
704
691
  end
705
692
  end
706
693
 
@@ -709,18 +696,12 @@ OUT
709
696
  end
710
697
 
711
698
  context "on failure" do
712
- it "should raise an error if user is not in git repository" do
713
- Shelly::App.stub(:inside_git_repository?).and_return(false)
714
- $stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
715
- lambda { @main.ip }.should raise_error(SystemExit)
716
- end
717
-
718
699
  it "should raise an error if user does not have access to cloud" do
719
700
  response = {"message" => "Cloud foo-staging not found"}
720
701
  exception = Shelly::Client::APIError.new(response.to_json, 404)
721
- @client.stub(:app_ips).and_raise(exception)
702
+ @client.stub(:app).and_raise(exception)
722
703
  $stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
723
- @main.ip
704
+ invoke(@main, :ip)
724
705
  end
725
706
  end
726
707
  end
@@ -753,9 +734,9 @@ OUT
753
734
  $stdout.should_receive(:puts).with("\n")
754
735
  $stdout.should_receive(:puts).with("Scheduling application delete - done")
755
736
  $stdout.should_receive(:puts).with("Removing git remote - done")
737
+ @main.options = {:cloud => "foo-staging"}
756
738
  fake_stdin(["yes", "yes", "yes"]) do
757
- @main.options = {:cloud => "foo-staging"}
758
- @main.delete
739
+ invoke(@main, :delete)
759
740
  end
760
741
  end
761
742
 
@@ -763,8 +744,7 @@ OUT
763
744
  @app.should_not_receive(:delete)
764
745
  lambda{
765
746
  fake_stdin(["yes", "yes", "no"]) do
766
- @main.options = {:cloud => "foo-staging"}
767
- @main.delete
747
+ invoke(@main, :delete, "--cloud", "foo-staging")
768
748
  end
769
749
  }.should raise_error(SystemExit)
770
750
  end
@@ -780,8 +760,7 @@ OUT
780
760
  Shelly::App.stub(:inside_git_repository?).and_return(false)
781
761
  $stdout.should_receive(:puts).with("Missing git remote")
782
762
  fake_stdin(["yes", "yes", "yes"]) do
783
- @main.options = {:cloud => "foo-staging"}
784
- @main.delete
763
+ invoke(@main, :delete, "--cloud", "foo-staging")
785
764
  end
786
765
  end
787
766
  end
@@ -799,8 +778,7 @@ OUT
799
778
  $stdout.should_receive(:puts).with("\e[31mApplication not found\e[0m")
800
779
  lambda{
801
780
  fake_stdin(["yes", "yes", "yes"]) do
802
- @main.options = {:cloud => "foo-bar"}
803
- @main.delete
781
+ invoke(@main, :delete, "--cloud", "foo-bar")
804
782
  end
805
783
  }.should raise_error(SystemExit)
806
784
  end
@@ -824,7 +802,7 @@ OUT
824
802
  $stdout.should_receive(:puts).with("Scheduling application delete - done")
825
803
  $stdout.should_receive(:puts).with("Removing git remote - done")
826
804
  fake_stdin(["yes", "yes", "yes"]) do
827
- @main.delete
805
+ invoke(@main, :delete)
828
806
  end
829
807
  end
830
808
  end
@@ -848,7 +826,7 @@ OUT
848
826
  File.delete("Cloudfile")
849
827
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
850
828
  lambda {
851
- @main.logs
829
+ invoke(@main, :logs)
852
830
  }.should raise_error(SystemExit)
853
831
  end
854
832
 
@@ -858,7 +836,7 @@ OUT
858
836
  @client.stub(:application_logs).and_raise(exception)
859
837
  $stdout.should_receive(:puts).
860
838
  with(red "You have no access to cloud 'foo-production'")
861
- lambda { @main.logs }.should raise_error(SystemExit)
839
+ lambda { invoke(@main, :logs) }.should raise_error(SystemExit)
862
840
  end
863
841
 
864
842
  it "should exit if user is not logged in" do
@@ -868,7 +846,7 @@ OUT
868
846
  $stdout.should_receive(:puts).
869
847
  with(red "You are not logged in. To log in use:")
870
848
  $stdout.should_receive(:puts).with(" shelly login")
871
- lambda { @main.logs }.should raise_error(SystemExit)
849
+ lambda { invoke(@main, :logs) }.should raise_error(SystemExit)
872
850
  end
873
851
 
874
852
  context "single cloud in Cloudfile" do
@@ -877,7 +855,7 @@ OUT
877
855
  $stdout.should_receive(:puts).with(green "Cloud foo-production:")
878
856
  $stdout.should_receive(:puts).with(green "Instance 1:")
879
857
  $stdout.should_receive(:puts).with("log1")
880
- @main.logs
858
+ invoke(@main, :logs)
881
859
  end
882
860
  end
883
861
 
@@ -894,7 +872,7 @@ OUT
894
872
  $stdout.should_receive(:puts).with("Available clouds:")
895
873
  $stdout.should_receive(:puts).with(" * foo-production")
896
874
  $stdout.should_receive(:puts).with(" * foo-staging")
897
- lambda { @main.logs }.should raise_error(SystemExit)
875
+ lambda { invoke(@main, :logs) }.should raise_error(SystemExit)
898
876
  end
899
877
 
900
878
  it "should fetch from command line which cloud to start" do
@@ -904,7 +882,7 @@ OUT
904
882
  $stdout.should_receive(:puts).with(green "Instance 1:")
905
883
  $stdout.should_receive(:puts).with("log1")
906
884
  @main.options = {:cloud => "foo-staging"}
907
- @main.logs
885
+ invoke(@main, :logs)
908
886
  end
909
887
  end
910
888
 
@@ -916,7 +894,7 @@ OUT
916
894
  $stdout.should_receive(:puts).with("log1")
917
895
  $stdout.should_receive(:puts).with(green "Instance 2:")
918
896
  $stdout.should_receive(:puts).with("log2")
919
- @main.logs
897
+ invoke(@main, :logs)
920
898
  end
921
899
  end
922
900
  end