rhc 1.6.8 → 1.7.8

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.
Files changed (85) hide show
  1. data/autocomplete/rhc_bash +1167 -0
  2. data/features/README.md +1 -1
  3. data/features/domain.feature +1 -1
  4. data/features/lib/rhc_helper/persistable.rb +4 -1
  5. data/features/multiple_cartridge.feature +4 -3
  6. data/features/sshkey.feature +3 -3
  7. data/features/support/assumptions.rb +3 -3
  8. data/features/support/env.rb +10 -0
  9. data/features/support/platform_support.rb +2 -2
  10. data/lib/rhc.rb +6 -0
  11. data/lib/rhc/auth/token.rb +4 -0
  12. data/lib/rhc/autocomplete.rb +50 -52
  13. data/lib/rhc/autocomplete_templates/{rhc.erb → bash.erb} +8 -2
  14. data/lib/rhc/cartridge_helpers.rb +1 -1
  15. data/lib/rhc/cli.rb +1 -7
  16. data/lib/rhc/command_runner.rb +45 -16
  17. data/lib/rhc/commands.rb +75 -55
  18. data/lib/rhc/commands/account.rb +7 -51
  19. data/lib/rhc/commands/alias.rb +26 -17
  20. data/lib/rhc/commands/app.rb +75 -39
  21. data/lib/rhc/commands/authorization.rb +4 -2
  22. data/lib/rhc/commands/base.rb +31 -29
  23. data/lib/rhc/commands/cartridge.rb +66 -44
  24. data/lib/rhc/commands/domain.rb +20 -8
  25. data/lib/rhc/commands/git_clone.rb +3 -3
  26. data/lib/rhc/commands/logout.rb +51 -0
  27. data/lib/rhc/commands/port_forward.rb +15 -11
  28. data/lib/rhc/commands/setup.rb +25 -0
  29. data/lib/rhc/commands/snapshot.rb +20 -10
  30. data/lib/rhc/commands/sshkey.rb +21 -7
  31. data/lib/rhc/commands/tail.rb +2 -2
  32. data/lib/rhc/commands/threaddump.rb +2 -2
  33. data/lib/rhc/context_helper.rb +0 -4
  34. data/lib/rhc/core_ext.rb +96 -76
  35. data/lib/rhc/exceptions.rb +6 -0
  36. data/lib/rhc/help_formatter.rb +19 -2
  37. data/lib/rhc/helpers.rb +32 -194
  38. data/lib/rhc/highline_extensions.rb +412 -0
  39. data/lib/rhc/output_helpers.rb +31 -67
  40. data/lib/rhc/rest.rb +4 -2
  41. data/lib/rhc/rest/alias.rb +0 -2
  42. data/lib/rhc/rest/application.rb +9 -4
  43. data/lib/rhc/rest/authorization.rb +0 -2
  44. data/lib/rhc/rest/base.rb +1 -1
  45. data/lib/rhc/rest/client.rb +11 -9
  46. data/lib/rhc/rest/domain.rb +5 -1
  47. data/lib/rhc/rest/gear_group.rb +0 -2
  48. data/lib/rhc/rest/key.rb +0 -2
  49. data/lib/rhc/rest/mock.rb +32 -10
  50. data/lib/rhc/ssh_helpers.rb +2 -2
  51. data/lib/rhc/usage_templates/command_help.erb +20 -13
  52. data/lib/rhc/usage_templates/command_syntax_help.erb +1 -3
  53. data/lib/rhc/usage_templates/help.erb +15 -16
  54. data/lib/rhc/usage_templates/options_help.erb +7 -9
  55. data/lib/rhc/wizard.rb +193 -159
  56. data/spec/rest_spec_helper.rb +2 -2
  57. data/spec/rhc/cli_spec.rb +36 -5
  58. data/spec/rhc/command_spec.rb +94 -42
  59. data/spec/rhc/commands/account_spec.rb +1 -75
  60. data/spec/rhc/commands/alias_spec.rb +28 -28
  61. data/spec/rhc/commands/app_spec.rb +141 -33
  62. data/spec/rhc/commands/apps_spec.rb +4 -4
  63. data/spec/rhc/commands/authorization_spec.rb +8 -8
  64. data/spec/rhc/commands/cartridge_spec.rb +18 -9
  65. data/spec/rhc/commands/domain_spec.rb +16 -16
  66. data/spec/rhc/commands/git_clone_spec.rb +3 -3
  67. data/spec/rhc/commands/logout_spec.rb +86 -0
  68. data/spec/rhc/commands/port_forward_spec.rb +9 -9
  69. data/spec/rhc/commands/server_spec.rb +5 -5
  70. data/spec/rhc/commands/setup_spec.rb +19 -5
  71. data/spec/rhc/commands/snapshot_spec.rb +12 -12
  72. data/spec/rhc/commands/sshkey_spec.rb +11 -11
  73. data/spec/rhc/commands/tail_spec.rb +5 -5
  74. data/spec/rhc/commands/threaddump_spec.rb +3 -3
  75. data/spec/rhc/config_spec.rb +6 -6
  76. data/spec/rhc/helpers_spec.rb +72 -219
  77. data/spec/rhc/highline_extensions_spec.rb +269 -0
  78. data/spec/rhc/rest_application_spec.rb +28 -1
  79. data/spec/rhc/rest_client_spec.rb +20 -21
  80. data/spec/rhc/rest_spec.rb +10 -0
  81. data/spec/rhc/wizard_spec.rb +72 -32
  82. data/spec/spec_helper.rb +86 -56
  83. data/spec/wizard_spec_helper.rb +7 -4
  84. metadata +165 -160
  85. data/spec/spec.opts +0 -1
@@ -6,12 +6,13 @@ require 'resolv'
6
6
 
7
7
  describe RHC::Commands::App do
8
8
  let!(:rest_client){ MockRestClient.new }
9
- before(:each) do
9
+ let!(:config){ user_config }
10
+ before{ RHC::Config.stub(:home_dir).and_return('/home/mock_user') }
11
+ before do
10
12
  FakeFS.activate!
11
13
  FakeFS::FileSystem.clear
12
- user_config
13
- RHC::Helpers::remove_const(:MAX_RETRIES) rescue nil
14
- RHC::Helpers::const_set(:MAX_RETRIES, 3)
14
+ RHC::Helpers.send(:remove_const, :MAX_RETRIES) rescue nil
15
+ RHC::Helpers.const_set(:MAX_RETRIES, 3)
15
16
  @instance = RHC::Commands::App.new
16
17
  RHC::Commands::App.stub(:new) do
17
18
  @instance.stub(:git_config_get) { "" }
@@ -38,7 +39,7 @@ describe RHC::Commands::App do
38
39
  end
39
40
 
40
41
  context 'app' do
41
- let(:arguments) { ['app', '--noprompt', '--config', 'test.conf', '-l', 'test@test.foo', '-p', 'password'] }
42
+ let(:arguments) { ['app'] }
42
43
  it { run_output.should match('Usage:') }
43
44
  end
44
45
  end
@@ -49,9 +50,116 @@ describe RHC::Commands::App do
49
50
  it("shows number of started"){ subject.send(:gear_group_state, ['started', 'idle']).should == '1/2 started' }
50
51
  end
51
52
 
53
+ describe '#check_domain!' do
54
+ let(:rest_client){ stub('RestClient') }
55
+ let(:domain){ stub('Domain', :id => 'test') }
56
+ before{ subject.stub(:rest_client).and_return(rest_client) }
57
+ let(:interactive){ false }
58
+ before{ subject.stub(:interactive?).and_return(interactive) }
59
+
60
+ context "when no options are provided and there is one domain" do
61
+ before{ rest_client.should_receive(:domains).twice.and_return([domain]) }
62
+ it("should load the first domain"){ subject.send(:check_domain!).should == domain }
63
+ after{ subject.send(:options).namespace.should == domain.id }
64
+ end
65
+
66
+ context "when no options are provided and there are no domains" do
67
+ before{ rest_client.should_receive(:domains).and_return([]) }
68
+ it("should load the first domain"){ expect{ subject.send(:check_domain!) }.to raise_error(RHC::Rest::DomainNotFoundException) }
69
+ after{ subject.send(:options).namespace.should be_nil }
70
+ end
71
+
72
+ context "when valid namespace is provided" do
73
+ before{ subject.send(:options)[:namespace] = 'test' }
74
+ before{ rest_client.should_receive(:find_domain).with('test').and_return(domain) }
75
+ it("should load the requested domain"){ subject.send(:check_domain!).should == domain }
76
+ after{ subject.send(:options).namespace.should == 'test' }
77
+ end
78
+
79
+ context "when interactive and no domains" do
80
+ let(:interactive){ true }
81
+ before{ rest_client.should_receive(:domains).twice.and_return([]) }
82
+ before{ RHC::DomainWizard.should_receive(:new).and_return(stub(:run => true)) }
83
+ it("should raise if the wizard doesn't set the option"){ expect{ subject.send(:check_domain!) }.to raise_error(RHC::Rest::DomainNotFoundException) }
84
+ after{ subject.send(:options).namespace.should be_nil }
85
+ end
86
+ end
87
+
52
88
  describe 'app create' do
53
- before(:each) do
54
- domain = rest_client.add_domain("mockdomain")
89
+ before{ rest_client.add_domain("mockdomain") }
90
+
91
+ context "when we ask for help with the alias" do
92
+ before{ FakeFS.deactivate! }
93
+ context do
94
+ let(:arguments) { ['help', 'create-app'] }
95
+ it{ run_output.should match "Usage: rhc app-create <name>" }
96
+ end
97
+ context do
98
+ let(:arguments) { ['create-app', '-h'] }
99
+ it{ run_output.should match "Usage: rhc app-create <name>" }
100
+ end
101
+ end
102
+
103
+ context "when run with no arguments" do
104
+ before{ FakeFS.deactivate! }
105
+ let(:arguments){ ['create-app'] }
106
+ it{ run_output.should match "Usage: rhc app-create <name>" }
107
+ it{ run_output.should match "When creating an application, you must provide a name and a cartridge from the list below:" }
108
+ it{ run_output.should match "mock_standalone_cart-1" }
109
+ it{ run_output.should match "Please specify the name of the application" }
110
+ end
111
+
112
+ context "when dealing with config" do
113
+ subject{ described_class.new(Commander::Command::Options.new(options)) }
114
+ let(:wizard){ s = stub('Wizard'); RHC::EmbeddedWizard.should_receive(:new).and_return(s); s }
115
+ let(:options){ nil }
116
+ let(:interactive){ true }
117
+ before{ subject.should_receive(:interactive?).at_least(1).times.and_return(interactive) }
118
+ before{ subject.stub(:check_sshkeys!) }
119
+
120
+ it("should run the wizard"){ expect{ subject.create('name', ['mock_standalone_cart-1']) }.to call(:run).on(wizard).and_stop }
121
+
122
+ context "when has config" do
123
+ let(:options){ {:server => 'test', :rhlogin => 'foo'} }
124
+ before{ subject.send(:config).should_receive(:has_local_config?).and_return(true) }
125
+ it("should not run the wizard"){ expect{ subject.create('name', ['mock_standalone_cart-1']) }.to not_call(:new).on(RHC::EmbeddedWizard) }
126
+ end
127
+
128
+ context "when has no config" do
129
+ before{ subject.send(:config).should_receive(:has_local_config?).and_return(false) }
130
+ it("should run the wizard"){ expect{ subject.create('name', ['mock_standalone_cart-1']) }.to call(:new).on(RHC::EmbeddedWizard).and_stop }
131
+ end
132
+
133
+ context "when not interactive" do
134
+ let(:interactive){ false }
135
+ it("should not run the wizard"){ expect{ subject.create('name', ['mock_standalone_cart-1']) }.to not_call(:new).on(RHC::EmbeddedWizard) }
136
+ end
137
+ end
138
+
139
+ context "when dealing with ssh keys" do
140
+ subject{ described_class.new(options) }
141
+ let(:wizard){ s = stub('Wizard'); RHC::SSHWizard.should_receive(:new).and_return(s); s }
142
+ let(:options){ Commander::Command::Options.new(:server => 'foo.com', :rhlogin => 'test') }
143
+ let(:interactive){ true }
144
+ before{ subject.should_receive(:interactive?).at_least(1).times.and_return(interactive) }
145
+ before{ subject.should_receive(:check_config!) }
146
+
147
+ it("should run the wizard"){ expect{ subject.create('name', ['mock_standalone_cart-1']) }.to call(:run).on(wizard).and_stop }
148
+
149
+ context "when not interactive" do
150
+ let(:interactive){ false }
151
+ it("should not run the wizard"){ expect{ subject.create('name', ['mock_standalone_cart-1']) }.to not_call(:new).on(RHC::SSHWizard) }
152
+ end
153
+ end
154
+
155
+ context "when in full interactive mode with no keys, domain, or config" do
156
+ let!(:config){ base_config }
157
+ before{ RHC::Config.any_instance.stub(:has_local_config?).and_return(false) }
158
+ before{ described_class.any_instance.stub(:interactive?).and_return(true) }
159
+ before{ rest_client.domains.clear }
160
+ let(:arguments) { ['app', 'create', 'app1', 'mock_standalone_cart-1'] }
161
+ # skips login stage and insecure check because of mock rest client, doesn't check keys
162
+ it { run_output(['mydomain', 'y', 'mykey']).should match(/This wizard.*Checking your namespace.*Your domain name 'mydomain' has been successfully created.*Creating application.*Your public SSH key.*Uploading key 'mykey' .*Downloading the application.*Success/m) }
55
163
  end
56
164
 
57
165
  context 'when run without a cart' do
@@ -62,7 +170,7 @@ describe RHC::Commands::App do
62
170
 
63
171
  context 'when run with a valid cart' do
64
172
  let(:arguments) { ['app', 'create', 'app1', 'mock_standalone_cart-1', '--noprompt', '--timeout', '10', '--config', 'test.conf', '-l', 'test@test.foo', '-p', 'password'] }
65
- it { expect { run }.should exit_with_code(0) }
173
+ it { expect { run }.to exit_with_code(0) }
66
174
  it { run_output.should match("Success") }
67
175
  it { run_output.should match("Cartridges: mock_standalone_cart-1\n") }
68
176
  end
@@ -75,13 +183,13 @@ describe RHC::Commands::App do
75
183
  resolver.should_receive(:getaddress).with('app1-mockdomain.fake.foo').and_raise(ArgumentError)
76
184
  end
77
185
 
78
- it { expect { run }.should exit_with_code(0) }
186
+ it { expect { run }.to exit_with_code(0) }
79
187
  it { run_output.should match("Success") }
80
188
  end
81
189
 
82
190
  context 'when run with multiple carts' do
83
191
  let(:arguments) { ['app', 'create', 'app1', 'mock_standalone_cart-1', 'mock_cart-1', '--noprompt', '-p', 'password'] }
84
- it { expect { run }.should exit_with_code(0) }
192
+ it { expect { run }.to exit_with_code(0) }
85
193
  it { run_output.should match("Success") }
86
194
  it { run_output.should match("Cartridges: mock_standalone_cart-1, mock_cart-1\n") }
87
195
  after{ rest_client.domains.first.applications.first.cartridges.find{ |c| c.name == 'mock_cart-1' }.should be_true }
@@ -89,7 +197,7 @@ describe RHC::Commands::App do
89
197
 
90
198
  context 'when run with a git url' do
91
199
  let(:arguments) { ['app', 'create', 'app1', 'mock_standalone_cart-1', '--from', 'git://url', '--noprompt', '-p', 'password'] }
92
- it { expect { run }.should exit_with_code(0) }
200
+ it { expect { run }.to exit_with_code(0) }
93
201
  it { run_output.should match("Success") }
94
202
  it { run_output.should match("Source Code: git://url\n") }
95
203
  it { run_output.should match("Initial Git URL: git://url\n") }
@@ -106,7 +214,7 @@ describe RHC::Commands::App do
106
214
  end
107
215
  context 'with trace' do
108
216
  let(:arguments) { ['app', 'create', 'app1', 'nomatch_cart', '--noprompt', '--config', 'test.conf', '-l', 'test@test.foo', '-p', 'password', '--trace'] }
109
- it { expect { run }.should raise_error(RHC::CartridgeNotFoundException, "There are no cartridges that match 'nomatch_cart'.") }
217
+ it { expect { run }.to raise_error(RHC::CartridgeNotFoundException, "There are no cartridges that match 'nomatch_cart'.") }
110
218
  end
111
219
  end
112
220
 
@@ -119,7 +227,7 @@ describe RHC::Commands::App do
119
227
 
120
228
  context 'multiple web matches' do
121
229
  let(:arguments) { ['app', 'create', 'app1', 'mock_standalone_cart', '--trace', '--noprompt'] }
122
- it { expect { run }.should raise_error(RHC::MultipleCartridgesException) }
230
+ it { expect { run }.to raise_error(RHC::MultipleCartridgesException) }
123
231
  end
124
232
  context 'when only a single cart can match' do
125
233
  let(:arguments) { ['app', 'create', 'app1', 'unique', '--trace', '--noprompt'] }
@@ -135,15 +243,15 @@ describe RHC::Commands::App do
135
243
  end
136
244
  context 'when I pick only embedded carts' do
137
245
  let(:arguments) { ['app', 'create', 'app1', 'mock_cart', '--trace', '--noprompt'] }
138
- it { expect { run }.should raise_error(RHC::CartridgeNotFoundException, /Every application needs a web cartridge/) }
246
+ it { expect { run }.to raise_error(RHC::CartridgeNotFoundException, /Every application needs a web cartridge/) }
139
247
  end
140
248
  context 'when I pick multiple embedded carts' do
141
249
  let(:arguments) { ['app', 'create', 'app1', 'unique_standalone', 'mock_cart', '--trace', '--noprompt'] }
142
- it { expect { run }.should raise_error(RHC::MultipleCartridgesException, /There are multiple cartridges matching 'mock_cart'/) }
250
+ it { expect { run }.to raise_error(RHC::MultipleCartridgesException, /There are multiple cartridges matching 'mock_cart'/) }
143
251
  end
144
252
  context 'when I pick multiple standalone carts' do
145
253
  let(:arguments) { ['app', 'create', 'app1', 'unique_standalone', 'mock_standalone_cart', '--trace', '--noprompt'] }
146
- it { expect { run }.should raise_error(RHC::MultipleCartridgesException, /You must select only a single web cart/) }
254
+ it { expect { run }.to raise_error(RHC::MultipleCartridgesException, /You must select only a single web cart/) }
147
255
  end
148
256
  end
149
257
 
@@ -156,7 +264,7 @@ describe RHC::Commands::App do
156
264
  end
157
265
  it "should create a jenkins app and a regular app with an embedded jenkins client" do
158
266
  #puts run_output
159
- expect { run }.should exit_with_code(0)
267
+ expect { run }.to exit_with_code(0)
160
268
  jenkins_app = rest_client.find_application(@domain.id,"jenkins")
161
269
  jenkins_app.cartridges[0].name.should == "jenkins-1.4"
162
270
  app = rest_client.find_application(@domain.id,"app1")
@@ -172,7 +280,7 @@ describe RHC::Commands::App do
172
280
  before(:each) do
173
281
  domain = rest_client.add_domain("mockdomain")
174
282
  end
175
- it { expect { run }.should_not raise_error(ArgumentError, /The --no-dns option can't be used in conjunction with --enable-jenkins/) }
283
+ it { expect { run }.to_not raise_error(ArgumentError, /The --no-dns option can't be used in conjunction with --enable-jenkins/) }
176
284
  end
177
285
  end
178
286
 
@@ -183,7 +291,7 @@ describe RHC::Commands::App do
183
291
  before(:each) do
184
292
  domain = rest_client.add_domain("mockdomain")
185
293
  end
186
- it { expect { run }.should raise_error(ArgumentError, /You have named both your main application and your Jenkins application/) }
294
+ it { expect { run }.to raise_error(ArgumentError, /You have named both your main application and your Jenkins application/) }
187
295
  end
188
296
  end
189
297
 
@@ -196,9 +304,9 @@ describe RHC::Commands::App do
196
304
  @domain.add_application("jenkins", "jenkins-1.4")
197
305
  end
198
306
  it "should use existing jenkins" do
199
- expect { run }.should exit_with_code(0)
200
- expect { rest_client.find_application(@domain.id,"jenkins") }.should_not raise_error
201
- expect { rest_client.find_application(@domain.id,"jenkins2") }.should raise_error(RHC::Rest::ApplicationNotFoundException)
307
+ expect { run }.to exit_with_code(0)
308
+ expect { rest_client.find_application(@domain.id,"jenkins") }.to_not raise_error
309
+ expect { rest_client.find_application(@domain.id,"jenkins2") }.to raise_error(RHC::Rest::ApplicationNotFoundException)
202
310
  end
203
311
  end
204
312
  end
@@ -261,7 +369,7 @@ describe RHC::Commands::App do
261
369
  before(:each) do
262
370
  @domain = rest_client.add_domain("mockdomain")
263
371
  @instance.stub(:git_clone_application) { raise RHC::GitException }
264
- @instance.should_not_receive(:check_sshkeys!)
372
+ @instance.stub(:check_sshkeys!)
265
373
  end
266
374
 
267
375
  context 'when run with error in git clone' do
@@ -324,7 +432,7 @@ describe RHC::Commands::App do
324
432
  end
325
433
 
326
434
  context 'when run' do
327
- it { expect { run }.should exit_with_code(0) }
435
+ it { expect { run }.to exit_with_code(0) }
328
436
  end
329
437
  end
330
438
 
@@ -335,34 +443,34 @@ describe RHC::Commands::App do
335
443
  before{ @domain = rest_client.add_domain("mockdomain") }
336
444
 
337
445
  it "should raise cartridge not found exception when no apps exist" do
338
- expect { run }.should raise_error RHC::Rest::ApplicationNotFoundException
446
+ expect { run }.to raise_error RHC::Rest::ApplicationNotFoundException
339
447
  end
340
448
 
341
449
  context "with an app" do
342
450
  before{ @app = @domain.add_application("app1", "mock_type") }
343
451
 
344
452
  it "should not remove app when no is sent as input" do
345
- expect { run(["no"]) }.should raise_error(RHC::ConfirmationError)
453
+ expect { run(["no"]) }.to raise_error(RHC::ConfirmationError)
346
454
  @domain.applications.length.should == 1
347
455
  @domain.applications[0] == @app
348
456
  end
349
457
 
350
458
  it "should remove app when yes is sent as input" do
351
- expect { run(["yes"]) }.should exit_with_code(0)
459
+ expect { run(["yes"]) }.to exit_with_code(0)
352
460
  @domain.applications.length.should == 0
353
461
  end
354
462
 
355
463
  context "with --noprompt but without --confirm" do
356
464
  let(:arguments) { ['app', 'delete', 'app1', '--noprompt', '--trace'] }
357
465
  it "should not remove the app" do
358
- expect { run(["no"]) }.should raise_error(RHC::ConfirmationError)
466
+ expect { run(["no"]) }.to raise_error(RHC::ConfirmationError)
359
467
  @domain.applications.length.should == 1
360
468
  end
361
469
  end
362
470
  context "with --noprompt and --confirm" do
363
471
  let(:arguments) { ['app', 'delete', 'app1', '--noprompt', '--confirm'] }
364
472
  it "should remove the app" do
365
- expect { run }.should exit_with_code(0)
473
+ expect { run }.to exit_with_code(0)
366
474
  @domain.applications.length.should == 0
367
475
  end
368
476
  end
@@ -445,7 +553,7 @@ describe RHC::Commands::App do
445
553
  Kernel.should_receive(:system).with("ssh fakeuuidfortestsapp1@127.0.0.1").and_return(0)
446
554
  end
447
555
  it { run_output.should match("Connecting to fakeuuidfortestsapp") }
448
- it { expect { run }.should exit_with_code(0) }
556
+ it { expect { run }.to exit_with_code(0) }
449
557
  end
450
558
  end
451
559
 
@@ -459,7 +567,7 @@ describe RHC::Commands::App do
459
567
  @instance.should_receive(:has_ssh?).and_return(false)
460
568
  end
461
569
  it { run_output.should match("Please use the --ssh option to specify the path to your SSH executable, or install SSH.") }
462
- it { expect { run }.should exit_with_code(1) }
570
+ it { expect { run }.to exit_with_code(1) }
463
571
  end
464
572
  end
465
573
 
@@ -474,7 +582,7 @@ describe RHC::Commands::App do
474
582
  Kernel.should_receive(:system).with("path_to_ssh fakeuuidfortestsapp1@127.0.0.1").and_return(1)
475
583
  end
476
584
  it { run_output.should match("Connecting to fakeuuidfortestsapp") }
477
- it { expect { run }.should exit_with_code(1) }
585
+ it { expect { run }.to exit_with_code(1) }
478
586
  end
479
587
  end
480
588
 
@@ -496,7 +604,7 @@ describe RHC::Commands::App do
496
604
  @domain.add_application("app1", "mock_type")
497
605
  end
498
606
  it { run_output.should match("started") }
499
- it { run_output.should match("deprecated") }
607
+ it("should warn about deprecation") { run_output.should match("deprecated") }
500
608
  end
501
609
  end
502
610
 
@@ -10,7 +10,7 @@ describe RHC::Commands::Apps do
10
10
  context 'when no domains' do
11
11
  let(:arguments) { ['apps'] }
12
12
 
13
- it { expect { run }.should exit_with_code(1) }
13
+ it { expect { run }.to exit_with_code(1) }
14
14
  it { run_output.should match(/In order to deploy applications.*rhc domain create/) }
15
15
  end
16
16
 
@@ -18,21 +18,21 @@ describe RHC::Commands::Apps do
18
18
  let(:arguments){ ['apps'] }
19
19
  let!(:domain){ rest_client.add_domain("first") }
20
20
 
21
- it { expect { run }.should exit_with_code(1) }
21
+ it { expect { run }.to exit_with_code(1) }
22
22
  it { run_output.should match(/No applications.*rhc app create/) }
23
23
 
24
24
  context 'with apps' do
25
25
  let(:arguments) { ['apps'] }
26
26
  before{ domain.add_application('scaled', 'php', true) }
27
27
 
28
- it { expect { run }.should exit_with_code(0) }
28
+ it { expect { run }.to exit_with_code(0) }
29
29
  it { run_output.should match(/scaled.*\-\-.*php.*Scaling:.*x2 \(minimum/m) }
30
30
  end
31
31
  end
32
32
 
33
33
  context 'when help is shown' do
34
34
  let(:arguments) { ['apps', '--help'] }
35
- it { expect { run }.should exit_with_code(0) }
35
+ it { expect { run }.to exit_with_code(0) }
36
36
  it { run_output.should match(/rhc apps.*Display the list of applications/m) }
37
37
  end
38
38
  end
@@ -23,7 +23,7 @@ describe RHC::Commands::Authorization do
23
23
  context "without authorizations" do
24
24
  without_authorization
25
25
  it('should warn that the server doesn\'t support auth'){ run_output.should =~ /The server does not support setting, retrieving, or authenticating with authorization tokens/ }
26
- it{ expect{ run }.should exit_with_code(1) }
26
+ it{ expect{ run }.to exit_with_code(1) }
27
27
  end
28
28
  end
29
29
 
@@ -37,7 +37,7 @@ describe RHC::Commands::Authorization do
37
37
  it('should display the expiration') { run_output.should =~ /Expires In:\s+1 minute/ }
38
38
  it('should display the creation date') { run_output.should =~ /Created:\s+#{RHC::Helpers.date('2013-02-21T01:00:01Z')}/ }
39
39
  it('should display the scopes') { run_output.should =~ /Scopes:\s+session read/ }
40
- it{ expect{ run }.should exit_with_code(0) }
40
+ it{ expect{ run }.to exit_with_code(0) }
41
41
  end
42
42
 
43
43
  expect_an_unsupported_message
@@ -47,7 +47,7 @@ describe RHC::Commands::Authorization do
47
47
  let(:arguments) { ['authorization', '--h']}
48
48
  context 'given --h' do
49
49
  it 'should not raise SystemStackError' do
50
- expect{ run }.should_not raise_error(SystemStackError)
50
+ expect{ run }.to_not raise_error(SystemStackError)
51
51
  end
52
52
  end
53
53
  end
@@ -60,7 +60,7 @@ describe RHC::Commands::Authorization do
60
60
  before{ stub_delete_authorization('foo') }
61
61
  before{ stub_delete_authorization('bar') }
62
62
  it('should display success') { run_output.should =~ /Deleting auth.*done/ }
63
- it{ expect{ run }.should exit_with_code(0) }
63
+ it{ expect{ run }.to exit_with_code(0) }
64
64
  after{ a_request(:delete, mock_href('broker/rest/user/authorizations/foo', true)).should have_been_made }
65
65
  after{ a_request(:delete, mock_href('broker/rest/user/authorizations/bar', true)).should have_been_made }
66
66
  end
@@ -68,7 +68,7 @@ describe RHC::Commands::Authorization do
68
68
  context "without a token in the command line" do
69
69
  let(:arguments) { ['authorization', 'delete'] }
70
70
  it('should display success') { run_output.should =~ /You must specify one or more tokens to delete/ }
71
- it{ expect{ run }.should exit_with_code(1) }
71
+ it{ expect{ run }.to exit_with_code(1) }
72
72
  end
73
73
 
74
74
  expect_an_unsupported_message
@@ -81,7 +81,7 @@ describe RHC::Commands::Authorization do
81
81
  with_authorization
82
82
  before{ stub_delete_authorizations }
83
83
  it('should display success') { run_output.should =~ /Deleting all auth.*done/ }
84
- it{ expect{ run }.should exit_with_code(0) }
84
+ it{ expect{ run }.to exit_with_code(0) }
85
85
  after{ a_request(:delete, mock_href('broker/rest/user/authorizations', true)).should have_been_made }
86
86
  end
87
87
 
@@ -105,7 +105,7 @@ describe RHC::Commands::Authorization do
105
105
  before{ instance.should_receive(:scope_help) }
106
106
 
107
107
  it('should display the scope help') { command_output.should =~ /When adding an authorization.*to see more options/m }
108
- it{ expect{ run_command }.should exit_with_code(0) }
108
+ it{ expect{ run_command }.to exit_with_code(0) }
109
109
  end
110
110
 
111
111
  expect_an_unsupported_message
@@ -121,7 +121,7 @@ describe RHC::Commands::Authorization do
121
121
  it('should display the expiration') { run_output.should =~ /Expires In:\s+5 minutes/ }
122
122
  it('should display the creation date') { run_output.should =~ /Created:\s+#{RHC::Helpers.date(mock_date_1)}/ }
123
123
  it('should display the scopes') { run_output.should =~ /Scopes:\s+foo bar/ }
124
- it{ expect{ run }.should exit_with_code(0) }
124
+ it{ expect{ run }.to exit_with_code(0) }
125
125
 
126
126
  expect_an_unsupported_message
127
127
  end
@@ -6,7 +6,7 @@ require 'rhc/config'
6
6
  describe RHC::Commands::Cartridge do
7
7
 
8
8
  def exit_with_code_and_message(code, message = nil)
9
- expect{ run }.should exit_with_code(code)
9
+ expect{ run }.to exit_with_code(code)
10
10
  run_output.should match(message) if message
11
11
  end
12
12
 
@@ -50,7 +50,7 @@ describe RHC::Commands::Cartridge do
50
50
  it{ run_output.should match /mock_standalone_cart\-2\s+web/ }
51
51
  it{ run_output.should match /mock_embedded_cart\-1\s+Mock1 Embedded Cart\s+addon/ }
52
52
  it{ run_output.should match /premium_cart\-1 \(\*\)\s+Premium Cart\s+web/ }
53
- it{ expect{ run }.should exit_with_code(0) }
53
+ it{ expect{ run }.to exit_with_code(0) }
54
54
 
55
55
  context 'with verbose list' do
56
56
  let(:arguments){ ['cartridge', 'list', '--verbose'] }
@@ -200,12 +200,12 @@ describe RHC::Commands::Cartridge do
200
200
  end
201
201
  it "should remove cartridge" do
202
202
  @app.add_cartridge('mock_cart-1')
203
- expect { run }.should exit_with_code(0)
203
+ expect { run }.to exit_with_code(0)
204
204
  # framework cart should be the only one listed
205
205
  @app.cartridges.length.should == 1
206
206
  end
207
207
  it "should raise cartridge not found exception" do
208
- expect { run }.should raise_error RHC::CartridgeNotFoundException
208
+ expect { run }.to raise_error RHC::CartridgeNotFoundException
209
209
  end
210
210
  end
211
211
  end
@@ -398,7 +398,7 @@ describe RHC::Commands::Cartridge do
398
398
  end
399
399
 
400
400
  describe 'cartridge storage' do
401
- let!(:rest_client){ MockRestClient.new }
401
+ let!(:rest_client){ MockRestClient.new(RHC::Config, 1.3) }
402
402
  let(:cmd_base) { ['cartridge', 'storage'] }
403
403
  let(:std_args) { ['-a', 'app1', '--noprompt', '--config', 'test.conf', '-l', 'test@test.foo', '-p', 'password'] | (@extra_args || []) }
404
404
  let(:cart_type) { ['mock_cart-1'] }
@@ -411,10 +411,8 @@ describe RHC::Commands::Cartridge do
411
411
 
412
412
  context 'when run with no arguments' do
413
413
  let(:arguments) { cmd_base | std_args }
414
- it "should show a list of storage info for all carts" do
415
- run_output.should match('mock_type')
416
- run_output.should match('mock_cart-1')
417
- end
414
+ it ("should show the mock_type"){ run_output.should match('mock_type') }
415
+ it ('should show mock_cart-1'){ run_output.should match('mock_cart-1') }
418
416
  end
419
417
 
420
418
  context 'when run for a non-existent cartridge' do
@@ -483,5 +481,16 @@ describe RHC::Commands::Cartridge do
483
481
  fail_with_message("The amount format must be a number, optionally followed by 'GB'")
484
482
  end
485
483
  end
484
+
485
+ context 'when run against an outdated broker' do
486
+ before { rest_client.stub(:api_version_negotiated).and_return(1.2) }
487
+ let(:arguments) { cmd_base | cart_type | std_args }
488
+
489
+ it 'adding storage should raise a version error' do
490
+ @extra_args = ["--add", "1GB"]
491
+ fail_with_message('The server does not support this command \(requires 1.3, found 1.2\).')
492
+ end
493
+
494
+ end
486
495
  end
487
496
  end