shelly 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
data/lib/shelly/app.rb CHANGED
@@ -19,8 +19,12 @@ module Shelly
19
19
  IO.popen("git remote").read.split("\n").include?(purpose)
20
20
  end
21
21
 
22
+ def git_host
23
+ ENV["SHELLY_GIT_HOST"] || "git.shellycloud.com"
24
+ end
25
+
22
26
  def git_url
23
- "git@git.shellycloud.com:#{code_name}.git"
27
+ "git@#{git_host}:#{code_name}.git"
24
28
  end
25
29
 
26
30
  def generate_cloudfile
@@ -1,14 +1,11 @@
1
1
  require "shelly"
2
2
  require "thor/group"
3
- require "shelly/cli/account"
4
- require "shelly/cli/apps"
5
3
 
6
4
  module Shelly
7
5
  module CLI
8
6
  class Main < Thor
9
7
  include Thor::Actions
10
- register(Account, "account", "account <command>", "Manages your account")
11
- register(Apps, "apps", "apps <command>", "Manages your applications")
8
+ include Helpers
12
9
 
13
10
  map %w(-v --version) => :version
14
11
  desc "version", "Displays shelly version"
@@ -18,12 +15,139 @@ module Shelly
18
15
 
19
16
  desc "register [EMAIL]", "Registers new user account on Shelly Cloud"
20
17
  def register(email = nil)
21
- invoke "account:register", email
18
+ say "Registering with email: #{email}" if email
19
+ user = User.new(email || ask_for_email, ask_for_password)
20
+ user.register
21
+ if user.ssh_key_exists?
22
+ say "Uploading your public SSH key from #{user.ssh_key_path}"
23
+ end
24
+ say "Successfully registered!"
25
+ say "Check you mailbox for email address confirmation"
26
+ rescue Client::APIError => e
27
+ if e.message == "Validation Failed"
28
+ e.errors.each { |error| say "#{error.first} #{error.last}" }
29
+ exit 1
30
+ end
31
+ end
32
+
33
+ desc "login [EMAIL]", "Logins user to Shelly Cloud"
34
+ def login(email = nil)
35
+ user = User.new(email || ask_for_email, ask_for_password(false))
36
+ user.login
37
+ say "Login successful"
38
+ say "Uploading your public SSH key"
39
+ user.upload_ssh_key
40
+ rescue RestClient::Unauthorized
41
+ say "Wrong email or password or your email is unconfirmend"
42
+ exit 1
22
43
  end
23
44
 
24
45
  desc "add", "Adds new application to Shelly Cloud"
25
46
  def add
26
- invoke "apps:add"
47
+ say_error "Must be run inside your project git repository" unless App.inside_git_repository?
48
+
49
+ @app = Shelly::App.new
50
+ @app.purpose = ask_for_purpose
51
+ @app.code_name = ask_for_code_name
52
+ @app.databases = ask_for_databases
53
+ @app.create
54
+
55
+ unless @app.remote_exists?
56
+ say "Adding remote #{@app.purpose} #{@app.git_url}", :green
57
+ @app.add_git_remote
58
+ else
59
+ say "Remote #{@app.purpose} already exists"
60
+ if yes?("Would you like to overwrite remote #{@app.purpose} with #{@app.git_url} (Y/N)?:")
61
+ @app.add_git_remote(true)
62
+ end
63
+ end
64
+
65
+ say "Creating Cloudfile", :green
66
+ @app.create_cloudfile
67
+
68
+ say "Provide billing details. Opening browser...", :green
69
+ @app.open_billing_page
70
+
71
+ info_adding_cloudfile_to_repository
72
+ info_deploying_to_shellycloud
73
+ rescue Client::APIError => e
74
+ if e.message == "Validation Failed"
75
+ e.errors.each { |error| say "#{error.first} #{error.last}" }
76
+ exit 1
77
+ end
78
+ end
79
+
80
+
81
+ # FIXME: move to helpers
82
+ no_tasks do
83
+ def ask_for_email
84
+ email_question = User.guess_email.blank? ? "Email:" : "Email (#{User.guess_email} - default):"
85
+ email = ask(email_question)
86
+ email = email.blank? ? User.guess_email : email
87
+ return email if email.present?
88
+ say_error "Email can't be blank, please try again"
89
+ end
90
+
91
+ def ask_for_password(with_confirmation = true)
92
+ loop do
93
+ say "Password: "
94
+ password = echo_disabled { $stdin.gets.strip }
95
+ say_new_line
96
+ return password unless with_confirmation
97
+ say "Password confirmation: "
98
+ password_confirmation = echo_disabled { $stdin.gets.strip }
99
+ say_new_line
100
+ if password.present?
101
+ return password if password == password_confirmation
102
+ say "Password and password confirmation don't match, please type them again"
103
+ else
104
+ say "Password can't be blank"
105
+ end
106
+ end
107
+ end
108
+
109
+ def ask_for_purpose
110
+ purpose = ask("How will you use this system (production - default,staging):")
111
+ purpose.blank? ? "production" : purpose
112
+ end
113
+
114
+ def ask_for_code_name
115
+ default_code_name = "#{Shelly::App.guess_code_name}-#{@app.purpose}"
116
+ code_name = ask("Application code name (#{default_code_name} - default):")
117
+ code_name.blank? ? default_code_name : code_name
118
+ end
119
+
120
+ def ask_for_databases
121
+ kinds = Shelly::App::DATABASE_KINDS
122
+ databases = ask("Which database do you want to use #{kinds.join(", ")} (postgresql - default):")
123
+ begin
124
+ databases = databases.split(/[\s,]/)
125
+ valid = databases.all? { |kind| kinds.include?(kind) }
126
+ break if valid
127
+ databases = ask("Unknown database kind. Supported are: #{kinds.join(", ")}:")
128
+ end while not valid
129
+
130
+ databases.empty? ? ["postgresql"] : databases
131
+ end
132
+
133
+ def info_adding_cloudfile_to_repository
134
+ say_new_line
135
+ say "Project is now configured for use with Shell Cloud:", :green
136
+ say "You can review changes using", :green
137
+ say " git status"
138
+ end
139
+
140
+ def info_deploying_to_shellycloud
141
+ say_new_line
142
+ say "When you make sure all settings are correct please issue following commands:", :green
143
+ say " git add ."
144
+ say ' git commit -m "Application added to Shelly Cloud"'
145
+ say " git push"
146
+ say_new_line
147
+ say "Deploy to #{@app.purpose} using:", :green
148
+ say " git push #{@app.purpose} master"
149
+ say_new_line
150
+ end
27
151
  end
28
152
  end
29
153
  end
data/lib/shelly/client.rb CHANGED
@@ -3,8 +3,6 @@ require "json"
3
3
 
4
4
  module Shelly
5
5
  class Client
6
- class UnauthorizedException < Exception; end
7
- class UnsupportedResponseException < Exception; end
8
6
  class APIError < Exception
9
7
  def initialize(response)
10
8
  @response = response
@@ -40,10 +38,18 @@ module Shelly
40
38
  post("/apps", :app => attributes)
41
39
  end
42
40
 
41
+ def update_ssh_key(ssh_key)
42
+ put("/ssh_key", :ssh_key => ssh_key)
43
+ end
44
+
43
45
  def post(path, params = {})
44
46
  request(path, :post, params)
45
47
  end
46
48
 
49
+ def put(path, params = {})
50
+ request(path, :put, params)
51
+ end
52
+
47
53
  def get(path)
48
54
  request(path, :get)
49
55
  end
@@ -74,19 +80,14 @@ module Shelly
74
80
  end
75
81
 
76
82
  def process_response(response)
77
- raise UnauthorizedException.new if response.code == 302
78
83
  if [404, 422, 500].include?(response.code)
84
+ # FIXME: move parsing JSON to APIError class
79
85
  error_details = JSON.parse(response.body)
80
86
  raise APIError.new(error_details)
81
87
  end
82
88
 
83
- begin
84
- response.return!
85
- JSON.parse(response.body)
86
- rescue RestClient::RequestFailed => e
87
- raise UnauthorizedException.new if e.http_code == 406
88
- raise UnsupportedResponseException.new(e)
89
- end
89
+ response.return!
90
+ JSON.parse(response.body)
90
91
  end
91
92
  end
92
93
  end
data/lib/shelly/user.rb CHANGED
@@ -13,6 +13,14 @@ module Shelly
13
13
  save_credentials
14
14
  end
15
15
 
16
+ def login
17
+ client = Client.new(email, password)
18
+ # test if credentials are valid
19
+ # if not RestClient::Unauthorized will be raised
20
+ client.token
21
+ save_credentials
22
+ end
23
+
16
24
  def token
17
25
  shelly.token["token"]
18
26
  end
@@ -44,6 +52,11 @@ module Shelly
44
52
  File.expand_path("~/.shelly")
45
53
  end
46
54
 
55
+ def upload_ssh_key
56
+ key = File.read(ssh_key_path)
57
+ shelly.update_ssh_key(key)
58
+ end
59
+
47
60
  protected
48
61
  def credentials_path
49
62
  File.join(config_dir, "credentials")
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
@@ -136,4 +136,17 @@ config
136
136
  end
137
137
  end
138
138
  end
139
+
140
+ describe "#git_host" do
141
+ it "should return default git host" do
142
+ @app.git_host.should == "git.shellycloud.com"
143
+ end
144
+
145
+ context "SHELLY_GIT_HOST set" do
146
+ it "should return value of SHELLY_GIT_HOST env variable" do
147
+ ENV['SHELLY_GIT_HOST'] = "git.example.com"
148
+ @app.git_host.should == "git.example.com"
149
+ end
150
+ end
151
+ end
139
152
  end
@@ -3,7 +3,14 @@ require "shelly/cli/main"
3
3
 
4
4
  describe Shelly::CLI::Main do
5
5
  before do
6
+ ENV['SHELLY_GIT_HOST'] = nil
7
+ FileUtils.stub(:chmod)
6
8
  @main = Shelly::CLI::Main.new
9
+ @client = mock
10
+ Shelly::Client.stub(:new).and_return(@client)
11
+ Shelly::User.stub(:guess_email).and_return("")
12
+ $stdout.stub(:puts)
13
+ $stdout.stub(:print)
7
14
  end
8
15
 
9
16
  describe "#version" do
@@ -13,33 +20,360 @@ describe Shelly::CLI::Main do
13
20
  end
14
21
  end
15
22
 
16
- describe "#register" do
17
- it "should invoke account:register command" do
18
- @main.should_receive(:invoke).with("account:register", "kate@example.com")
19
- @main.register("kate@example.com")
20
- end
21
- end
22
-
23
- describe "#add" do
24
- it "should invoke apps:add command" do
25
- @main.should_receive(:invoke).with("apps:add")
26
- @main.add
27
- end
28
- end
29
-
30
23
  describe "#help" do
31
24
  it "should display available commands" do
32
25
  expected = <<-OUT
33
26
  Tasks:
34
- shelly account <command> # Manages your account
35
- shelly add # Adds new application to Shelly Cloud
36
- shelly apps <command> # Manages your applications
37
- shelly help [TASK] # Describe available tasks or one specific task
38
- shelly register [EMAIL] # Registers new user account on Shelly Cloud
39
- shelly version # Displays shelly version
27
+ shelly add # Adds new application to Shelly Cloud
28
+ shelly help [TASK] # Describe available tasks or one specific task
29
+ shelly login [EMAIL] # Logins user to Shelly Cloud
30
+ shelly register [EMAIL] # Registers new user account on Shelly Cloud
31
+ shelly version # Displays shelly version
40
32
  OUT
41
33
  out = IO.popen("bin/shelly").read.strip
42
34
  out.should == expected.strip
43
35
  end
44
36
  end
37
+
38
+ describe "#register" do
39
+ before do
40
+ @client.stub(:register_user)
41
+ @key_path = File.expand_path("~/.ssh/id_rsa.pub")
42
+ end
43
+
44
+ it "should ask for email, password and password confirmation" do
45
+ $stdout.should_receive(:print).with("Email: ")
46
+ $stdout.should_receive(:print).with("Password: ")
47
+ $stdout.should_receive(:print).with("Password confirmation: ")
48
+ fake_stdin(["better@example.com", "secret", "secret"]) do
49
+ @main.register
50
+ end
51
+ end
52
+
53
+ it "should suggest email and use it if user enters blank email" do
54
+ Shelly::User.stub(:guess_email).and_return("kate@example.com")
55
+ $stdout.should_receive(:print).with("Email (kate@example.com - default): ")
56
+ @client.should_receive(:register_user).with("kate@example.com", "secret", nil)
57
+ fake_stdin(["", "secret", "secret"]) do
58
+ @main.register
59
+ end
60
+ end
61
+
62
+ it "should use email provided by user" do
63
+ @client.should_receive(:register_user).with("better@example.com", "secret", nil)
64
+ fake_stdin(["better@example.com", "secret", "secret"]) do
65
+ @main.register
66
+ end
67
+ end
68
+
69
+ it "should not ask about email if it's provided as argument" do
70
+ $stdout.should_receive(:puts).with("Registering with email: kate@example.com")
71
+ fake_stdin(["secret", "secret"]) do
72
+ @main.register("kate@example.com")
73
+ end
74
+ end
75
+
76
+ context "when user enters blank email" do
77
+ it "should show error message and exit with 1" do
78
+ Shelly::User.stub(:guess_email).and_return("")
79
+ $stdout.should_receive(:puts).with("Email can't be blank, please try again")
80
+ lambda {
81
+ fake_stdin(["", "bob@example.com", "only-pass", "only-pass"]) do
82
+ @main.register
83
+ end
84
+ }.should raise_error(SystemExit)
85
+ end
86
+ end
87
+
88
+ context "when user enters blank password" do
89
+ it "should ask for it again" do
90
+ $stdout.should_receive(:puts).with("Password can't be blank")
91
+ fake_stdin(["better@example.com", "", "", "secret", "secret"]) do
92
+ @main.register
93
+ end
94
+ end
95
+ end
96
+
97
+ context "when user enters password and password confirmation which don't match each other" do
98
+ it "should ask for them again" do
99
+ $stdout.should_receive(:puts).with("Password and password confirmation don't match, please type them again")
100
+ fake_stdin(["better@example.com", "secret", "sec-TYPO-ret", "secret", "secret"]) do
101
+ @main.register
102
+ end
103
+ end
104
+ end
105
+
106
+ context "public SSH key exists" do
107
+ it "should register with the public SSH key" do
108
+ FileUtils.mkdir_p("~/.ssh")
109
+ File.open(@key_path, "w") { |f| f << "key" }
110
+ $stdout.should_receive(:puts).with("Uploading your public SSH key from #{@key_path}")
111
+ fake_stdin(["kate@example.com", "secret", "secret"]) do
112
+ @main.register
113
+ end
114
+ end
115
+ end
116
+
117
+ context "public SSH key doesn't exist" do
118
+ it "should register user without the public SSH key" do
119
+ $stdout.should_not_receive(:puts).with("Uploading your public SSH key from #{@key_path}")
120
+ fake_stdin(["kate@example.com", "secret", "secret"]) do
121
+ @main.register
122
+ end
123
+ end
124
+ end
125
+
126
+ context "on successful registration" do
127
+ it "should display message about registration and email address confirmation" do
128
+ @client.stub(:register_user).and_return(true)
129
+ $stdout.should_receive(:puts).with("Successfully registered!")
130
+ $stdout.should_receive(:puts).with("Check you mailbox for email address confirmation")
131
+ fake_stdin(["kate@example.com", "pass", "pass"]) do
132
+ @main.register
133
+ end
134
+ end
135
+ end
136
+
137
+ context "on unsuccessful registration" do
138
+ it "should display errors and exit with 1" do
139
+ response = {"message" => "Validation Failed", "errors" => [["email", "has been already taken"]]}
140
+ exception = Shelly::Client::APIError.new(response)
141
+ @client.stub(:register_user).and_raise(exception)
142
+ $stdout.should_receive(:puts).with("email has been already taken")
143
+ lambda {
144
+ fake_stdin(["kate@example.com", "pass", "pass"]) do
145
+ @main.register
146
+ end
147
+ }.should raise_error(SystemExit)
148
+ end
149
+ end
150
+ end
151
+
152
+ describe "#login" do
153
+ before do
154
+ @user = Shelly::User.new
155
+ @user.stub(:upload_ssh_key)
156
+ @client.stub(:token).and_return("abc")
157
+ Shelly::User.stub(:new).and_return(@user)
158
+ end
159
+
160
+ it "should ask about email and password" do
161
+ fake_stdin(["megan@example.com", "secret"]) do
162
+ @main.login
163
+ end
164
+ end
165
+
166
+ context "on successful login" do
167
+ it "should display message about successful login" do
168
+ $stdout.should_receive(:puts).with("Login successful")
169
+ fake_stdin(["megan@example.com", "secret"]) do
170
+ @main.login
171
+ end
172
+ end
173
+
174
+ it "should upload user's public SSH key" do
175
+ @user.should_receive(:upload_ssh_key)
176
+ $stdout.should_receive(:puts).with("Uploading your public SSH key")
177
+ fake_stdin(["megan@example.com", "secret"]) do
178
+ @main.login
179
+ end
180
+ end
181
+
182
+ it "should display list of applications to which user has access"
183
+ end
184
+
185
+ context "on unauthorized user" do
186
+ it "should exit with 1 and display error message" do
187
+ exception = RestClient::Unauthorized.new
188
+ @client.stub(:token).and_raise(exception)
189
+ $stdout.should_receive(:puts).with("Wrong email or password or your email is unconfirmend")
190
+ lambda {
191
+ fake_stdin(["megan@example.com", "secret"]) do
192
+ @main.login
193
+ end
194
+ }.should raise_error(SystemExit)
195
+ end
196
+ end
197
+ end
198
+
199
+ describe "#add" do
200
+ before do
201
+ FileUtils.mkdir_p("/projects/foo")
202
+ Dir.chdir("/projects/foo")
203
+ @app = Shelly::App.new
204
+ @app.stub(:add_git_remote)
205
+ @app.stub(:create)
206
+ @app.stub(:generate_cloudfile).and_return("Example Cloudfile")
207
+ @app.stub(:open_billing_page)
208
+ @app.stub(:remote_exists?).and_return(false)
209
+ Shelly::App.stub(:inside_git_repository?).and_return(true)
210
+ Shelly::App.stub(:new).and_return(@app)
211
+ end
212
+
213
+ it "should exit with message if command run outside git repository" do
214
+ Shelly::App.stub(:inside_git_repository?).and_return(false)
215
+ $stdout.should_receive(:puts).with("Must be run inside your project git repository")
216
+ lambda {
217
+ fake_stdin(["staging", "", ""]) do
218
+ @main.add
219
+ end
220
+ }.should raise_error(SystemExit)
221
+ end
222
+
223
+ it "should ask user how he will use application" do
224
+ $stdout.should_receive(:print).with("How will you use this system (production - default,staging): ")
225
+ @app.should_receive(:purpose=).with("staging")
226
+ fake_stdin(["staging", "", ""]) do
227
+ @main.add
228
+ end
229
+ end
230
+
231
+ context "when user provided empty purpose" do
232
+ it "should use 'production' as default" do
233
+ $stdout.should_receive(:print).with("How will you use this system (production - default,staging): ")
234
+ @app.should_receive(:purpose=).with("production")
235
+ fake_stdin(["", "", ""]) do
236
+ @main.add
237
+ end
238
+ end
239
+ end
240
+
241
+ it "should use code name provided by user" do
242
+ $stdout.should_receive(:print).with("How will you use this system (production - default,staging): ")
243
+ $stdout.should_receive(:print).with("Application code name (foo-staging - default): ")
244
+ @app.should_receive(:code_name=).with("mycodename")
245
+ fake_stdin(["staging", "mycodename", ""]) do
246
+ @main.add
247
+ end
248
+ end
249
+
250
+ context "when user provided empty code name" do
251
+ it "should use 'current_dirname-purpose' as default" do
252
+ $stdout.should_receive(:print).with("How will you use this system (production - default,staging): ")
253
+ $stdout.should_receive(:print).with("Application code name (foo-staging - default): ")
254
+ fake_stdin(["staging", "", ""]) do
255
+ @main.add
256
+ end
257
+ end
258
+ end
259
+
260
+ it "should use database provided by user (separated by comma or space)" do
261
+ $stdout.should_receive(:print).with("Which database do you want to use postgresql, mongodb, redis, none (postgresql - default): ")
262
+ @app.should_receive(:databases=).with(["postgresql", "mongodb", "redis"])
263
+ fake_stdin(["staging", "", "postgresql,mongodb redis"]) do
264
+ @main.add
265
+ end
266
+ end
267
+
268
+ it "should ask again for databases if unsupported kind typed" do
269
+ $stdout.should_receive(:print).with("Which database do you want to use postgresql, mongodb, redis, none (postgresql - default): ")
270
+ $stdout.should_receive(:print).with("Unknown database kind. Supported are: postgresql, mongodb, redis, none: ")
271
+ fake_stdin(["staging", "", "postgresql,doesnt-exist", "none"]) do
272
+ @main.add
273
+ end
274
+ end
275
+
276
+ context "when user provided empty database" do
277
+ it "should use 'postgresql' database as default" do
278
+ @app.should_receive(:databases=).with(["postgresql"])
279
+ fake_stdin(["staging", "", ""]) do
280
+ @main.add
281
+ end
282
+ end
283
+ end
284
+
285
+ it "should create the app on shelly cloud" do
286
+ @app.should_receive(:create)
287
+ fake_stdin(["", "", ""]) do
288
+ @main.add
289
+ end
290
+ end
291
+
292
+ it "should display validation errors if they are any" do
293
+ response = {"message" => "Validation Failed", "errors" => [["code_name", "has been already taken"]]}
294
+ exception = Shelly::Client::APIError.new(response)
295
+ @app.should_receive(:create).and_raise(exception)
296
+ $stdout.should_receive(:puts).with("code_name has been already taken")
297
+ lambda {
298
+ fake_stdin(["", "", ""]) do
299
+ @main.add
300
+ end
301
+ }.should raise_error(SystemExit)
302
+ end
303
+
304
+ context "git remote doesn't exist" do
305
+ it "should add git remote" do
306
+ $stdout.should_receive(:puts).with("\e[32mAdding remote staging git@git.shellycloud.com:foooo.git\e[0m")
307
+ @app.should_receive(:add_git_remote)
308
+ fake_stdin(["staging", "foooo", ""]) do
309
+ @main.add
310
+ end
311
+ end
312
+ end
313
+
314
+ context "git remote exist" do
315
+ before do
316
+ @app.stub(:remote_exists?).and_return(true)
317
+ end
318
+
319
+ it "should ask user if he wants to overwrite existing git remote" do
320
+ $stdout.should_receive(:puts).with("Remote staging already exists")
321
+ $stdout.should_receive(:print).with("Would you like to overwrite remote staging with git@git.shellycloud.com:foooo.git (Y/N)?: ")
322
+ fake_stdin(["staging", "foooo", "", "y"]) do
323
+ @main.add
324
+ end
325
+ end
326
+
327
+ it "should overwrite existing git remote on 'yes' from user" do
328
+ @app.should_receive(:add_git_remote).with(true)
329
+ fake_stdin(["staging", "foooo", "", "y"]) do
330
+ @main.add
331
+ end
332
+ end
333
+
334
+ it "should not overwrite existing git remote on 'no' from user" do
335
+ @app.should_not_receive(:add_git_remote).with(true)
336
+ fake_stdin(["staging", "foooo", "", "n"]) do
337
+ @main.add
338
+ end
339
+ end
340
+ end
341
+
342
+ it "should create Cloudfile" do
343
+ File.exists?("/projects/foo/Cloudfile").should be_false
344
+ fake_stdin(["staging", "foooo", ""]) do
345
+ @main.add
346
+ end
347
+ File.read("/projects/foo/Cloudfile").should == "Example Cloudfile"
348
+ end
349
+
350
+ it "should browser window with link to edit billing information" do
351
+ $stdout.should_receive(:puts).with("\e[32mProvide billing details. Opening browser...\e[0m")
352
+ @app.should_receive(:open_billing_page)
353
+ fake_stdin(["staging", "foooo", ""]) do
354
+ @main.add
355
+ end
356
+ end
357
+
358
+ it "should display info about adding Cloudfile to repository" do
359
+ $stdout.should_receive(:puts).with("\e[32mProject is now configured for use with Shell Cloud:\e[0m")
360
+ $stdout.should_receive(:puts).with("\e[32mYou can review changes using\e[0m")
361
+ $stdout.should_receive(:puts).with(" git status")
362
+ fake_stdin(["staging", "foooo", "none"]) do
363
+ @main.add
364
+ end
365
+ end
366
+
367
+ it "should display info on how to deploy to ShellyCloud" do
368
+ $stdout.should_receive(:puts).with("\e[32mWhen you make sure all settings are correct please issue following commands:\e[0m")
369
+ $stdout.should_receive(:puts).with(" git add .")
370
+ $stdout.should_receive(:puts).with(' git commit -m "Application added to Shelly Cloud"')
371
+ $stdout.should_receive(:puts).with(" git push")
372
+ $stdout.should_receive(:puts).with("\e[32mDeploy to staging using:\e[0m")
373
+ $stdout.should_receive(:puts).with(" git push staging master")
374
+ fake_stdin(["staging", "foooo", "none"]) do
375
+ @main.add
376
+ end
377
+ end
378
+ end
45
379
  end