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
@@ -4,7 +4,7 @@ require 'rhc/rest/mock'
4
4
  require 'rhc/exceptions'
5
5
  require 'base64'
6
6
 
7
- Spec::Matchers.define :have_same_attributes_as do |expected|
7
+ RSpec::Matchers.define :have_same_attributes_as do |expected|
8
8
  match do |actual|
9
9
  (actual.instance_variables == expected.instance_variables) &&
10
10
  (actual.instance_variables.map { |i| instance_variable_get(i) } ==
@@ -26,6 +26,6 @@ module RestSpecHelper
26
26
  include RHC::Rest::Mock
27
27
  end
28
28
 
29
- Spec::Runner.configure do |configuration|
29
+ RSpec.configure do |configuration|
30
30
  include(RestSpecHelper)
31
31
  end
@@ -26,6 +26,20 @@ describe RHC::CLI do
26
26
  it('should provide a --config switch') { run_output.should =~ /\-\-config FILE/ }
27
27
  end
28
28
 
29
+ shared_examples_for 'a list of all commands' do
30
+ let(:arguments) { @arguments or raise "no arguments" }
31
+ it('should contain a message') { run_output.should =~ /Showing all commands/ }
32
+ it('should contain command help') { run_output.should =~ /Create an application./ }
33
+ it('should contain aliases') { run_output.should =~ /\(also/ }
34
+ end
35
+
36
+ shared_examples_for 'a list of commands' do
37
+ let(:arguments) { @arguments or raise "no arguments" }
38
+ it('should contain a message') { run_output.should =~ /Showing commands matching '/ }
39
+ it('should contain command help') { run_output.should =~ /Create an application./ }
40
+ it('should contain aliases') { run_output.should =~ /\(also/ }
41
+ end
42
+
29
43
  shared_examples_for 'a command-line options help page' do
30
44
  let(:arguments) { @arguments or raise "no arguments" }
31
45
  it('should contain an introduction') { run_output.should =~ /The following options can be passed to any/ }
@@ -92,6 +106,23 @@ describe RHC::CLI do
92
106
  it_should_behave_like 'an invalid command'
93
107
  end
94
108
 
109
+ context 'with help commands' do
110
+ before(:each) { @arguments = ['help', 'commands'] }
111
+ it_should_behave_like 'a list of all commands'
112
+ end
113
+
114
+ context 'with help and possible command matches' do
115
+ before(:each) { @arguments = ['help', 'app c'] }
116
+ it_should_behave_like 'a list of commands'
117
+ end
118
+
119
+ context 'with help and a single matching command segment' do
120
+ let(:arguments){ ['help', 'app creat'] }
121
+ it("prints the usage for the command"){ run_output.should match('Usage: rhc app-create <') }
122
+ it("prints part of the description for the command"){ run_output.should match('OpenShift runs the components of your') }
123
+ it("prints a local option"){ run_output.should match('--namespace NAME') }
124
+ end
125
+
95
126
  context 'with --help' do
96
127
  before(:each){ @arguments = ['--help'] }
97
128
  it_should_behave_like 'a global help page'
@@ -121,14 +152,14 @@ describe RHC::CLI do
121
152
  describe '#set_terminal' do
122
153
  before(:each) { mock_terminal }
123
154
  it('should update $terminal.wrap_at') do
124
- $stdin.should_receive(:tty?).twice.and_return(true)
155
+ $stdin.should_receive(:tty?).once.and_return(true)
125
156
  HighLine::SystemExtensions.should_receive(:terminal_size).and_return([5])
126
157
  expect { RHC::CLI.set_terminal }.to change($terminal, :wrap_at)
127
158
  end
128
- it('should update $terminal.page_at') do
129
- $stdin.should_receive(:tty?).twice.and_return(true)
130
- $stdout.should_receive(:tty?).twice.and_return(true)
131
- expect { RHC::CLI.set_terminal }.to change($terminal, :page_at)
159
+ it('should not update $terminal.page_at') do
160
+ $stdin.should_receive(:tty?).once.and_return(true)
161
+ $stdout.should_receive(:tty?).once.and_return(true)
162
+ expect { RHC::CLI.set_terminal }.to_not change($terminal, :page_at)
132
163
  end
133
164
  end
134
165
 
@@ -8,7 +8,7 @@ describe RHC::Commands::Base do
8
8
  let!(:config){ base_config }
9
9
 
10
10
  before{ c = RHC::Commands.instance_variable_get(:@commands); @saved_commands = c && c.dup || nil }
11
- after do
11
+ after do
12
12
  (Kernel.send(:remove_const, subject) if subject.is_a?(Class)) rescue nil
13
13
  RHC::Commands.instance_variable_set(:@commands, @saved_commands)
14
14
  end
@@ -19,7 +19,7 @@ describe RHC::Commands::Base do
19
19
 
20
20
  context 'when the class is at the root' do
21
21
  subject do
22
- Kernel.module_eval do
22
+ Kernel.module_eval do
23
23
  class StaticRootClass < RHC::Commands::Base; def run; 1; end; end
24
24
  end
25
25
  StaticRootClass
@@ -27,8 +27,8 @@ describe RHC::Commands::Base do
27
27
  its(:object_name) { should == 'static-root-class' }
28
28
  end
29
29
  context 'when the class is nested in a module' do
30
- subject do
31
- Kernel.module_eval do
30
+ subject do
31
+ Kernel.module_eval do
32
32
  module Nested; class StaticRootClass < RHC::Commands::Base; def run; 1; end; end; end
33
33
  end
34
34
  Nested::StaticRootClass
@@ -72,8 +72,8 @@ describe RHC::Commands::Base do
72
72
  end
73
73
 
74
74
  context 'when statically defined' do
75
- subject do
76
- Kernel.module_eval do
75
+ subject do
76
+ Kernel.module_eval do
77
77
  module Nested
78
78
  class Static < RHC::Commands::Base
79
79
  suppress_wizard
@@ -90,8 +90,8 @@ describe RHC::Commands::Base do
90
90
  end
91
91
 
92
92
  context 'when a command calls exit' do
93
- subject do
94
- Kernel.module_eval do
93
+ subject do
94
+ Kernel.module_eval do
95
95
  class Failing < RHC::Commands::Base
96
96
  def run
97
97
  exit 2
@@ -122,93 +122,137 @@ describe RHC::Commands::Base do
122
122
  summary "Test command execute-list"
123
123
  def execute_list(args); 1; end
124
124
 
125
+ argument :arg1, "Test arg", ['--test'], :optional => true
126
+ argument :arg2, "Test arg list", ['--test2'], :arg_type => :list, :optional => true
127
+ argument :arg3, "Test arg list", ['--test3'], :arg_type => :list, :optional => true
128
+ summary "Test command execute-vararg"
129
+ def execute_vararg(arg1, arg2, arg3); 1; end
130
+
131
+ RHC::Helpers.global_option '--test-context', 'Test', :context => :context_var
132
+ def execute_implicit
133
+ end
134
+
135
+ argument :testarg, "Test arg", ["--testarg testarg"], :context => :context_var
136
+ summary "Test command execute"
137
+ def execute_context_arg(testarg); 1; end
138
+
125
139
  def raise_error
126
140
  raise StandardError.new("test exception")
127
141
  end
128
142
  def raise_exception
129
143
  raise Exception.new("test exception")
130
144
  end
145
+
146
+ protected
147
+ def context_var
148
+ "contextual"
149
+ end
131
150
  end
132
151
  end
133
152
  Static
134
153
  end
135
154
 
136
- it("should register itself") { expect { subject }.to change(commands, :length).by(5) }
155
+ it("should register itself") { expect { subject }.to change(commands, :length).by(8) }
137
156
  it("should have an object name of the class") { subject.object_name.should == 'static' }
138
157
 
139
158
  context 'and when test is called' do
140
- it { expects_running('static', 'test').should call(:test).on(instance).with(no_args) }
159
+ it { expects_running('static-test').should call(:test).on(instance).with(no_args) }
141
160
  end
142
161
 
143
162
  context 'and when execute is called with argument' do
144
- it { expects_running('static', 'execute', 'simplearg').should call(:execute).on(instance).with('simplearg') }
163
+ it { expects_running('static-execute', 'simplearg').should call(:execute).on(instance).with('simplearg') }
145
164
  end
146
165
  context 'and when execute is called with argument switch' do
147
- it { expects_running('static', 'execute', '--testarg', 'switcharg').should call(:execute).on(instance).with('switcharg') }
166
+ it { expects_running('static-execute', '--testarg', 'switcharg').should call(:execute).on(instance).with('switcharg') }
148
167
  end
149
168
  context 'and when execute is called with same argument and switch' do
150
- it { expects_running('statis', 'execute', 'duparg', '--testarg', 'duparg2').should exit_with_code(1) }
169
+ it { expects_running('statis-execute', 'duparg', '--testarg', 'duparg2').should exit_with_code(1) }
151
170
  end
152
171
 
153
172
  context 'and when the provided option is ambiguous' do
154
- it { expects_running('static', 'execute', '-t', '--trace').should raise_error(OptionParser::AmbiguousOption) }
173
+ it { expects_running('static-execute', '-t', '--trace').should raise_error(OptionParser::AmbiguousOption) }
155
174
  end
156
175
 
157
176
  context 'and when execute is called with too many arguments' do
158
- it { expects_running('static', 'execute', 'arg1', 'arg2').should exit_with_code(1) }
177
+ it { expects_running('static-execute', 'arg1', 'arg2').should exit_with_code(1) }
159
178
  end
160
179
 
161
180
  context 'and when execute is called with a missing argument' do
162
- it { expects_running('static', 'execute').should exit_with_code(1) }
181
+ it { expects_running('static-execute').should exit_with_code(1) }
163
182
  end
164
183
 
165
184
  context 'and when execute_list is called' do
166
- it { expects_running('static', 'execute-list', '--trace').should call(:execute_list).on(instance).with([]) }
167
- it { expects_running('static', 'execute-list', '1', '2', '3').should call(:execute_list).on(instance).with(['1', '2', '3']) }
168
- it { expects_running('static', 'execute-list', '1', '2', '3').should call(:execute_list).on(instance).with(['1', '2', '3']) }
169
- it('should make the option available') { command_for('static', 'execute-list', '1', '2', '3').send(:options).tests.should == ['1','2','3'] }
185
+ it { expects_running('static-execute-list', '--trace').should call(:execute_list).on(instance).with([]) }
186
+ it { expects_running('static-execute-list', '1', '2', '3').should call(:execute_list).on(instance).with(['1', '2', '3']) }
187
+ it { expects_running('static-execute-list', '1', '2', '3').should call(:execute_list).on(instance).with(['1', '2', '3']) }
188
+ it('should make the option available') { command_for('static-execute-list', '1', '2', '3').send(:options).tests.should == ['1','2','3'] }
189
+ end
190
+
191
+ context 'and when execute_vararg is called' do
192
+ it{ expects_running('static-execute-vararg').should call(:execute_vararg).on(instance).with(nil, nil, nil) }
193
+ it{ expects_running('static-execute-vararg', '1', '2', '3').should call(:execute_vararg).on(instance).with('1', ['2', '3'], []) }
194
+ it("handles a list separator"){ expects_running('static-execute-vararg', '1', '2', '--', '3').should call(:execute_vararg).on(instance).with('1', ['2'], ['3']) }
195
+ it{ command_for('static-execute-vararg', '1', '2', '--', '3').send(:options).test.should == '1' }
196
+ it{ command_for('static-execute-vararg', '1', '2', '--', '3').send(:options).test2.should == ['2'] }
197
+ it{ command_for('static-execute-vararg', '1', '2', '--', '3').send(:options).test3.should == ['3'] }
198
+ end
199
+ context 'and when execute is called with a contextual global option' do
200
+ it("calls the helper") { command_for('static', 'execute-implicit').send(:options).test_context.should == 'contextual' }
201
+ end
202
+
203
+ context 'and when execute-context-arg is called with a contextual argument' do
204
+ it("calls the helper") { command_for('static', 'execute-context-arg').send(:options).test_context.should == 'contextual' }
205
+ it("takes the argument") { command_for('static', 'execute-context-arg', 'arg1').send(:options).testarg.should == 'arg1' }
170
206
  end
171
207
 
172
208
  context 'and when an error is raised in a call' do
173
- it { expects_running('static', 'raise-error').should raise_error(StandardError, "test exception") }
209
+ it { expects_running('static-raise-error').should raise_error(StandardError, "test exception") }
174
210
  end
175
211
 
176
212
  context 'and when an exception is raised in a call' do
177
- it { expects_running('static', 'raise-exception').should raise_error(Exception, "test exception") }
213
+ it { expects_running('static-raise-exception').should raise_error(Exception, "test exception") }
178
214
  end
179
215
 
180
216
  context 'and when an exception is raised in a call with --trace option' do
181
- it { expects_running('static', 'raise-exception', "--trace").should raise_error(Exception, "test exception") }
217
+ it { expects_running('static-raise-exception', "--trace").should raise_error(Exception, "test exception") }
182
218
  end
183
219
 
184
220
  context 'and when deprecated alias is called' do
185
- it do
221
+ it("prints a warning") do
186
222
  expects_running('static', 'exe', "arg").should call(:execute).on(instance).with('arg')
187
- stderr.should match("Warning: This command is deprecated. Please use 'rhc static execute' instead.")
223
+ stderr.should match("Warning: This command is deprecated. Please use 'rhc static-execute' instead.")
188
224
  end
189
225
  end
190
226
 
191
227
  context 'and when deprecated alias is called with DISABLE_DEPRECATED env var' do
192
228
  before { ENV['DISABLE_DEPRECATED'] = '1' }
193
229
  after { ENV['DISABLE_DEPRECATED'] = nil }
194
- it { expects_running('static', 'exe', 'arg', '--trace').should raise_error(RHC::DeprecatedError) }
230
+ it("raises an error") { expects_running('static', 'exe', 'arg', '--trace').should raise_error(RHC::DeprecatedError) }
195
231
  end
196
232
  end
197
233
  end
198
234
 
199
235
  describe "rest_client" do
200
236
  let(:instance){ subject }
237
+ before{ RHC::Rest::Client.any_instance.stub(:api_version_negotiated).and_return(1.4) }
201
238
 
202
239
  context "when initializing the object" do
203
- let(:auth){ mock }
204
- let(:basic_auth){ mock }
205
- before{ RHC::Auth::Basic.should_receive(:new).once.with{ |arg| arg.should == instance.send(:options) }.and_return(basic_auth) }
206
- before{ RHC::Auth::Token.should_receive(:new).once.with{ |arg, arg2, arg3| [arg, arg2, arg3].should == [instance.send(:options), basic_auth, instance.send(:token_store)] }.and_return(auth) }
207
-
208
- it "should create a new auth object" do
209
- subject.should_receive(:client_from_options).with(:auth => auth)
210
- subject.send(:rest_client)
240
+ let(:auth){ mock('auth') }
241
+ let(:basic_auth){ mock('basic_auth') }
242
+ before{ RHC::Auth::Basic.should_receive(:new).at_least(1).times.with{ |arg| arg.should == instance.send(:options) }.and_return(basic_auth) }
243
+ before{ RHC::Auth::Token.should_receive(:new).any_number_of_times.with{ |arg, arg2, arg3| [arg, arg2, arg3].should == [instance.send(:options), basic_auth, instance.send(:token_store)] }.and_return(auth) }
244
+
245
+ context "with no options" do
246
+ before{ subject.should_receive(:client_from_options).with(:auth => basic_auth) }
247
+ it("should create only a basic auth object"){ subject.send(:rest_client) }
248
+ end
249
+
250
+ context "with use_authorization_tokens" do
251
+ before{ subject.send(:options).use_authorization_tokens = true }
252
+ before{ subject.should_receive(:client_from_options).with(:auth => auth) }
253
+ it("should create a token auth object"){ subject.send(:rest_client) }
211
254
  end
255
+
212
256
  it { subject.send(:rest_client).should be_a(RHC::Rest::Client) }
213
257
  it { subject.send(:rest_client).should equal subject.send(:rest_client) }
214
258
  end
@@ -217,7 +261,7 @@ describe RHC::Commands::Base do
217
261
  subject{ Class.new(RHC::Commands::Base){ object_name :test; def run; 0; end } }
218
262
  let(:instance) { subject.new }
219
263
  let(:rest_client){ command_for(*arguments).send(:rest_client) }
220
- let(:basic_auth){ rest_client.send(:auth).send(:auth) }
264
+ let(:basic_auth){ auth = rest_client.send(:auth); auth.is_a?(RHC::Auth::Basic) ? auth : auth.send(:auth) }
221
265
  let(:stored_token){ nil }
222
266
  before{ instance.send(:token_store).stub(:get).and_return(nil) unless stored_token }
223
267
 
@@ -257,10 +301,18 @@ describe RHC::Commands::Base do
257
301
  let(:username){ 'foo' }
258
302
  let(:stored_token){ 'a_token' }
259
303
  let(:arguments){ ['test', '-l', username, '--server', mock_uri] }
260
- before{ instance.send(:token_store).should_receive(:get).with{ |user, server| user.should == username; server.should == instance.send(:openshift_server) }.and_return(stored_token) }
261
304
  before{ stub_api; stub_user(:token => stored_token) }
262
- it("has token set") { command_for(*arguments).send(:options).token.should == stored_token }
263
- it("calls the server") { rest_client.user }
305
+
306
+ context "when tokens are not allowed" do
307
+ it("calls the server") { rest_client.send(:auth).is_a? RHC::Auth::Basic }
308
+ end
309
+
310
+ context "when tokens are allowed" do
311
+ let!(:config){ base_config{ |c, d| d.add('use_authorization_tokens', 'true') } }
312
+ before{ instance.send(:token_store).should_receive(:get).with{ |user, server| user.should == username; server.should == instance.send(:openshift_server) }.and_return(stored_token) }
313
+ it("has token set") { command_for(*arguments).send(:token_for_user).should == stored_token }
314
+ it("calls the server") { rest_client.user }
315
+ end
264
316
  end
265
317
 
266
318
  context "with username and tokens enabled" do
@@ -268,9 +320,9 @@ describe RHC::Commands::Base do
268
320
  let(:username){ 'foo' }
269
321
  let(:auth_token){ stub(:token => 'a_token') }
270
322
  let(:arguments){ ['test', '-l', username, '--server', mock_uri] }
271
- before{ instance.send(:token_store).should_receive(:get).with{ |user, server| user.should == username; server.should == instance.send(:openshift_server) }.twice.and_return(nil) }
323
+ before{ instance.send(:token_store).should_receive(:get).with{ |user, server| user.should == username; server.should == instance.send(:openshift_server) }.and_return(nil) }
272
324
  before{ stub_api(false, true); stub_api_request(:get, 'broker/rest/user', false).to_return{ |request| request.headers['Authorization'] =~ /Bearer/ ? simple_user(username) : {:status => 401} } }
273
- it("should attempt to create a new token") do
325
+ it("should attempt to create a new token") do
274
326
  rest_client.should_receive(:new_session).ordered.and_return(auth_token)
275
327
  rest_client.user
276
328
  end
@@ -280,9 +332,9 @@ describe RHC::Commands::Base do
280
332
  let!(:config){ base_config{ |c, d| d.add('use_authorization_tokens', 'true') } }
281
333
  let(:username){ 'foo' }
282
334
  let(:arguments){ ['test', '-l', username, '--server', mock_uri] }
283
- before{ instance.send(:token_store).should_receive(:get).with{ |user, server| user.should == username; server.should == instance.send(:openshift_server) }.twice.and_return(nil) }
335
+ before{ instance.send(:token_store).should_receive(:get).with{ |user, server| user.should == username; server.should == instance.send(:openshift_server) }.and_return(nil) }
284
336
  before{ stub_api(false, false); stub_api_request(:get, 'broker/rest/user', false).to_return{ |request| request.headers['Authorization'] =~ /Basic/ ? simple_user(username) : {:status => 401} } }
285
- it("should prompt for password") do
337
+ it("should prompt for password") do
286
338
  basic_auth.should_receive(:ask).once.and_return('password')
287
339
  rest_client.user
288
340
  end
@@ -21,7 +21,7 @@ describe RHC::Commands::Account do
21
21
  it('should show the gear capabilities') { run_output.should =~ /Allowed Gear Sizes:\s*small/ }
22
22
  it('should show the consumed gears') { run_output.should =~ /Gears Used:\s*0/ }
23
23
  it('should show the maximum gears') { run_output.should =~ /Gears Allowed:\s*3/ }
24
- it { expect { run }.should exit_with_code(0) }
24
+ it { expect { run }.to exit_with_code(0) }
25
25
 
26
26
  context 'with a free plan' do
27
27
  let(:user_plan_id){ 'free' }
@@ -38,78 +38,4 @@ describe RHC::Commands::Account do
38
38
  it('should show') { run_output.should =~ /Plan:\s*Other/ }
39
39
  end
40
40
  end
41
-
42
- describe '#logout' do
43
- let(:arguments) { ['account', 'logout'] }
44
- let(:username) { 'foo' }
45
- let(:password) { 'pass' }
46
- let(:supports_auth) { false }
47
- let(:server) { mock_uri }
48
- let!(:token_store) { RHC::Auth::TokenStore.new(Dir.mktmpdir) }
49
- before{ user_config }
50
- before do
51
- stub_api(mock_user_auth, supports_auth)
52
- stub_user
53
- RHC::Auth::TokenStore.should_receive(:new).at_least(1).and_return(token_store)
54
- end
55
-
56
- it("should clear the token cache"){ expect{ run }.should call(:clear).on(token_store) }
57
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
58
- it("should display a message"){ run_output.should match("All local sessions removed.") }
59
-
60
- context "when --all is requested" do
61
- let(:arguments) { ['account', 'logout', '--all'] }
62
-
63
- context "if the server does not implement authorizations" do
64
- it("should display a message"){ run_output.should match(/Deleting all authorizations associated with your account.*not supported/) }
65
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
66
- end
67
-
68
- context "if the server implements authorizations" do
69
- let(:supports_auth) { true }
70
- before{ stub_delete_authorizations }
71
-
72
- it("should display a message"){ run_output.should match(/Deleting all authorizations associated with your account.*done/) }
73
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
74
- end
75
- end
76
-
77
- context "when --token is provided" do
78
- let(:arguments) { ['account', 'logout', '--token', 'foo'] }
79
- def user_auth; { :token => 'foo' }; end
80
-
81
- context "if the server does not implement authorizations" do
82
- it("should display a message"){ run_output.should match(/Ending session on server.*not supported/) }
83
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
84
- end
85
-
86
- context "if the server implements authorizations" do
87
- let(:supports_auth) { true }
88
-
89
- context "if the server returns successfully" do
90
- before{ stub_delete_authorization('foo') }
91
-
92
- it("should display a message"){ run_output.should match(/Ending session on server.*deleted/) }
93
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
94
- it("should clear the token cache"){ expect{ run }.should call(:clear).on(token_store) }
95
- end
96
-
97
- context "if the server rejects the token" do
98
- before{ stub_request(:delete, mock_href('broker/rest/user/authorizations/foo', false)).to_return(:status => 401, :body => {}.to_json) }
99
-
100
- it("should display a message"){ run_output.should match(/Ending session on server.*already closed/) }
101
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
102
- it("should clear the token cache"){ expect{ run }.should call(:clear).on(token_store) }
103
- end
104
-
105
- context "if the server returns an unexpected error" do
106
- before{ stub_request(:delete, mock_href('broker/rest/user/authorizations/foo', false)).to_return(:status => 500, :body => {}.to_json) }
107
-
108
- it("should display a message"){ run_output.should match(/Ending session on server.*The server did not respond/) }
109
- it("should exit with success"){ expect{ run }.should exit_with_code(0) }
110
- it("should clear the token cache"){ expect{ run }.should call(:clear).on(token_store) }
111
- end
112
- end
113
- end
114
- end
115
41
  end
@@ -99,9 +99,9 @@ describe RHC::Commands::Alias do
99
99
 
100
100
  context 'help is run' do
101
101
  it "should display help" do
102
- expect { run }.should exit_with_code(0)
102
+ expect { run }.to exit_with_code(0)
103
103
  end
104
- it('should output usage') { run_output.should match("Usage: rhc alias <command> <application> <alias> [--namespace namespace]") }
104
+ it('should output usage') { run_output.should match("Usage: rhc alias <action>$") }
105
105
  end
106
106
  end
107
107
 
@@ -110,9 +110,9 @@ describe RHC::Commands::Alias do
110
110
 
111
111
  context 'help is run' do
112
112
  it "should display help" do
113
- expect { run }.should exit_with_code(0)
113
+ expect { run }.to exit_with_code(0)
114
114
  end
115
- it('should output usage') { run_output.should match("Usage: rhc alias add <application> <alias> [--namespace namespace]") }
115
+ it('should output usage') { run_output.should match("Usage: rhc alias-add <application> <alias> [--namespace NAME]") }
116
116
  end
117
117
  end
118
118
 
@@ -121,9 +121,9 @@ describe RHC::Commands::Alias do
121
121
 
122
122
  context 'help is run' do
123
123
  it "should display help" do
124
- expect { run }.should exit_with_code(0)
124
+ expect { run }.to exit_with_code(0)
125
125
  end
126
- it('should output usage') { run_output.should match("Usage: rhc alias remove <application> <alias> [--namespace namespace]") }
126
+ it('should output usage') { run_output.should match("Usage: rhc alias-remove <application> <alias> [--namespace NAME]") }
127
127
  end
128
128
  end
129
129
 
@@ -132,9 +132,9 @@ describe RHC::Commands::Alias do
132
132
 
133
133
  context 'help is run' do
134
134
  it "should display help" do
135
- expect { run }.should exit_with_code(0)
135
+ expect { run }.to exit_with_code(0)
136
136
  end
137
- it('should output usage') { run_output.should match("Usage: rhc alias update-cert <application> <alias> --certificate FILE --private-key FILE [--passphrase passphrase]") }
137
+ it('should output usage') { run_output.should match("Usage: rhc alias-update-cert <application> <alias> --certificate FILE --private-key FILE [--passphrase passphrase]") }
138
138
  end
139
139
  end
140
140
 
@@ -143,9 +143,9 @@ describe RHC::Commands::Alias do
143
143
 
144
144
  context 'help is run' do
145
145
  it "should display help" do
146
- expect { run }.should exit_with_code(0)
146
+ expect { run }.to exit_with_code(0)
147
147
  end
148
- it('should output usage') { run_output.should match("Usage: rhc alias delete-cert <application> <alias>") }
148
+ it('should output usage') { run_output.should match("Usage: rhc alias-delete-cert <application> <alias>") }
149
149
  end
150
150
  end
151
151
 
@@ -154,15 +154,15 @@ describe RHC::Commands::Alias do
154
154
 
155
155
  context 'help is run' do
156
156
  it "should display help" do
157
- expect { run }.should exit_with_code(0)
157
+ expect { run }.to exit_with_code(0)
158
158
  end
159
- it('should output usage') { run_output.should match("Usage: rhc alias list <application>") }
159
+ it('should output usage') { run_output.should match("Usage: rhc alias-list <application>") }
160
160
  end
161
161
  end
162
162
 
163
163
  describe 'add alias' do
164
164
  let(:arguments) { ['alias', 'add', 'mock_app_0', 'www.foo.bar' ] }
165
- it { expect { run }.should exit_with_code(0) }
165
+ it { expect { run }.to exit_with_code(0) }
166
166
  it { run_output.should =~ /Alias 'www.foo.bar' has been added/m }
167
167
  end
168
168
 
@@ -172,7 +172,7 @@ describe RHC::Commands::Alias do
172
172
  end
173
173
  context 'remove alias successfully' do
174
174
  let(:arguments) { ['alias', 'remove', 'mock_app_0', 'www.foo.bar' ] }
175
- it { expect { run }.should exit_with_code(0) }
175
+ it { expect { run }.to exit_with_code(0) }
176
176
  it { run_output.should =~ /Alias 'www.foo.bar' has been removed/m }
177
177
  end
178
178
  context 'remove alias with server api <= 1.3' do
@@ -180,7 +180,7 @@ describe RHC::Commands::Alias do
180
180
  before do
181
181
  rest_client.stub(:api_version_negotiated).and_return(1.3)
182
182
  end
183
- it { expect { run }.should exit_with_code(0) }
183
+ it { expect { run }.to exit_with_code(0) }
184
184
  it { run_output.should =~ /Alias 'www.foo.bar' has been removed/m }
185
185
  end
186
186
  end
@@ -193,28 +193,28 @@ describe RHC::Commands::Alias do
193
193
  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar',
194
194
  '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
195
195
  '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
196
- it { expect { run }.should exit_with_code(0) }
196
+ it { expect { run }.to exit_with_code(0) }
197
197
  it { run_output.should =~ /SSL certificate successfully added/m }
198
198
  end
199
199
  context 'cert file not found' do
200
200
  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar',
201
201
  '--certificate', File.expand_path('../../assets/nothing.foo', __FILE__),
202
202
  '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
203
- it { expect { run }.should exit_with_code(1) }
203
+ it { expect { run }.to exit_with_code(1) }
204
204
  it { run_output.should =~ /Certificate file not found/m }
205
205
  end
206
206
  context 'private key file not found' do
207
207
  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar',
208
208
  '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
209
209
  '--private-key', File.expand_path('../../assets/nothing.foo', __FILE__) ] }
210
- it { expect { run }.should exit_with_code(1) }
210
+ it { expect { run }.to exit_with_code(1) }
211
211
  it { run_output.should =~ /Private key file not found/m }
212
212
  end
213
213
  context 'not existing certificate alias' do
214
214
  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.unicorns.com',
215
215
  '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
216
216
  '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
217
- it { expect { run }.should exit_with_code(156) }
217
+ it { expect { run }.to exit_with_code(156) }
218
218
  it { run_output.should =~ /Alias www.unicorns.com can't be found in application/m }
219
219
  end
220
220
  context 'fails if server does not support' do
@@ -224,21 +224,21 @@ describe RHC::Commands::Alias do
224
224
  before do
225
225
  rest_client.stub(:api_version_negotiated).and_return(1.3)
226
226
  end
227
- it { expect { run }.should exit_with_code(1) }
227
+ it { expect { run }.to exit_with_code(1) }
228
228
  it { run_output.should =~ /The server does not support SSL certificates for custom aliases/m }
229
229
  end
230
230
  context 'invalid certificate file (empty)' do
231
231
  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar',
232
232
  '--certificate', File.expand_path('../../assets/empty.txt', __FILE__),
233
233
  '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
234
- it { expect { run }.should exit_with_code(1) }
234
+ it { expect { run }.to exit_with_code(1) }
235
235
  it { run_output.should =~ /Invalid certificate file/m }
236
236
  end
237
237
  context 'invalid private key file (empty)' do
238
238
  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar',
239
239
  '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
240
240
  '--private-key', File.expand_path('../../assets/empty.txt', __FILE__) ] }
241
- it { expect { run }.should exit_with_code(1) }
241
+ it { expect { run }.to exit_with_code(1) }
242
242
  it { run_output.should =~ /Invalid private key file/m }
243
243
  end
244
244
  end
@@ -249,12 +249,12 @@ describe RHC::Commands::Alias do
249
249
  end
250
250
  context 'delete existing certificate' do
251
251
  let(:arguments) { ['alias', 'delete-cert', 'mock_app_0', 'www.foo.bar', '--confirm'] }
252
- it { expect { run }.should exit_with_code(0) }
252
+ it { expect { run }.to exit_with_code(0) }
253
253
  it { run_output.should =~ /SSL certificate successfully deleted/m }
254
254
  end
255
255
  context 'delete not existing certificate' do
256
256
  let(:arguments) { ['alias', 'delete-cert', 'mock_app_0', 'www.unicorns.com', '--confirm'] }
257
- it { expect { run }.should exit_with_code(156) }
257
+ it { expect { run }.to exit_with_code(156) }
258
258
  it { run_output.should =~ /Alias www.unicorns.com can't be found in application mock_app_0/m }
259
259
  end
260
260
  context 'fails if server does not support' do
@@ -262,7 +262,7 @@ describe RHC::Commands::Alias do
262
262
  before do
263
263
  rest_client.stub(:api_version_negotiated).and_return(1.3)
264
264
  end
265
- it { expect { run }.should exit_with_code(1) }
265
+ it { expect { run }.to exit_with_code(1) }
266
266
  it { run_output.should =~ /The server does not support SSL certificates for custom aliases/m }
267
267
  end
268
268
  end
@@ -273,14 +273,14 @@ describe RHC::Commands::Alias do
273
273
  end
274
274
  context 'list app with existing certificate' do
275
275
  let(:arguments) { ['alias', 'list', 'mock_app_0'] }
276
- it { expect { run }.should exit_with_code(0) }
276
+ it { expect { run }.to exit_with_code(0) }
277
277
  it { run_output.should =~ /Has Certificate?/m }
278
278
  it { run_output.should =~ /Certificate Added/m }
279
279
  it { run_output.should =~ /www.foo.bar/m }
280
280
  end
281
281
  context 'list app without certificates' do
282
282
  let(:arguments) { ['alias', 'list', 'mock_app_1'] }
283
- it { expect { run }.should exit_with_code(0) }
283
+ it { expect { run }.to exit_with_code(0) }
284
284
  it { run_output.should =~ /No aliases associated with the application mock_app_1/m }
285
285
  end
286
286
  context 'simple list is server does not support ssl certs' do
@@ -288,7 +288,7 @@ describe RHC::Commands::Alias do
288
288
  before do
289
289
  rest_client.stub(:api_version_negotiated).and_return(1.3)
290
290
  end
291
- it { expect { run }.should exit_with_code(0) }
291
+ it { expect { run }.to exit_with_code(0) }
292
292
  it { run_output.should =~ /no/m }
293
293
  it { run_output.should =~ /-/m }
294
294
  it { run_output.should =~ /www.foo.bar/m }