rhc 1.6.8 → 1.7.8

Sign up to get free protection for your applications and to get access to all the features.
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 }