startapp 0.1.6

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 (156) hide show
  1. checksums.yaml +7 -0
  2. data/COPYRIGHT +1 -0
  3. data/LICENSE +11 -0
  4. data/README.md +95 -0
  5. data/Rakefile +6 -0
  6. data/autocomplete/rhc_bash +1672 -0
  7. data/bin/app +37 -0
  8. data/conf/express.conf +8 -0
  9. data/features/assets/deploy.tar.gz +0 -0
  10. data/features/core_feature.rb +191 -0
  11. data/features/deployments_feature.rb +129 -0
  12. data/features/domains_feature.rb +58 -0
  13. data/features/keys_feature.rb +37 -0
  14. data/features/members_feature.rb +166 -0
  15. data/lib/rhc/auth/basic.rb +64 -0
  16. data/lib/rhc/auth/token.rb +102 -0
  17. data/lib/rhc/auth/token_store.rb +53 -0
  18. data/lib/rhc/auth.rb +5 -0
  19. data/lib/rhc/autocomplete.rb +66 -0
  20. data/lib/rhc/autocomplete_templates/bash.erb +39 -0
  21. data/lib/rhc/cartridge_helpers.rb +118 -0
  22. data/lib/rhc/cli.rb +40 -0
  23. data/lib/rhc/command_runner.rb +185 -0
  24. data/lib/rhc/commands/account.rb +25 -0
  25. data/lib/rhc/commands/alias.rb +124 -0
  26. data/lib/rhc/commands/app.rb +726 -0
  27. data/lib/rhc/commands/apps.rb +20 -0
  28. data/lib/rhc/commands/authorization.rb +115 -0
  29. data/lib/rhc/commands/base.rb +174 -0
  30. data/lib/rhc/commands/cartridge.rb +329 -0
  31. data/lib/rhc/commands/clone.rb +66 -0
  32. data/lib/rhc/commands/configure.rb +20 -0
  33. data/lib/rhc/commands/create.rb +100 -0
  34. data/lib/rhc/commands/delete.rb +19 -0
  35. data/lib/rhc/commands/deploy.rb +32 -0
  36. data/lib/rhc/commands/deployment.rb +82 -0
  37. data/lib/rhc/commands/domain.rb +172 -0
  38. data/lib/rhc/commands/env.rb +142 -0
  39. data/lib/rhc/commands/force_stop.rb +17 -0
  40. data/lib/rhc/commands/git_clone.rb +34 -0
  41. data/lib/rhc/commands/logout.rb +51 -0
  42. data/lib/rhc/commands/logs.rb +21 -0
  43. data/lib/rhc/commands/member.rb +148 -0
  44. data/lib/rhc/commands/port_forward.rb +197 -0
  45. data/lib/rhc/commands/reload.rb +17 -0
  46. data/lib/rhc/commands/restart.rb +17 -0
  47. data/lib/rhc/commands/scp.rb +54 -0
  48. data/lib/rhc/commands/server.rb +40 -0
  49. data/lib/rhc/commands/setup.rb +60 -0
  50. data/lib/rhc/commands/show.rb +43 -0
  51. data/lib/rhc/commands/snapshot.rb +137 -0
  52. data/lib/rhc/commands/ssh.rb +51 -0
  53. data/lib/rhc/commands/sshkey.rb +97 -0
  54. data/lib/rhc/commands/start.rb +17 -0
  55. data/lib/rhc/commands/stop.rb +17 -0
  56. data/lib/rhc/commands/tail.rb +47 -0
  57. data/lib/rhc/commands/threaddump.rb +14 -0
  58. data/lib/rhc/commands/tidy.rb +17 -0
  59. data/lib/rhc/commands.rb +396 -0
  60. data/lib/rhc/config.rb +321 -0
  61. data/lib/rhc/context_helper.rb +121 -0
  62. data/lib/rhc/core_ext.rb +202 -0
  63. data/lib/rhc/coverage_helper.rb +33 -0
  64. data/lib/rhc/deployment_helpers.rb +111 -0
  65. data/lib/rhc/exceptions.rb +256 -0
  66. data/lib/rhc/git_helpers.rb +106 -0
  67. data/lib/rhc/help_formatter.rb +55 -0
  68. data/lib/rhc/helpers.rb +481 -0
  69. data/lib/rhc/highline_extensions.rb +479 -0
  70. data/lib/rhc/json.rb +51 -0
  71. data/lib/rhc/output_helpers.rb +260 -0
  72. data/lib/rhc/rest/activation.rb +11 -0
  73. data/lib/rhc/rest/alias.rb +42 -0
  74. data/lib/rhc/rest/api.rb +87 -0
  75. data/lib/rhc/rest/application.rb +348 -0
  76. data/lib/rhc/rest/attributes.rb +36 -0
  77. data/lib/rhc/rest/authorization.rb +8 -0
  78. data/lib/rhc/rest/base.rb +79 -0
  79. data/lib/rhc/rest/cartridge.rb +162 -0
  80. data/lib/rhc/rest/client.rb +650 -0
  81. data/lib/rhc/rest/deployment.rb +18 -0
  82. data/lib/rhc/rest/domain.rb +98 -0
  83. data/lib/rhc/rest/environment_variable.rb +15 -0
  84. data/lib/rhc/rest/gear_group.rb +16 -0
  85. data/lib/rhc/rest/httpclient.rb +145 -0
  86. data/lib/rhc/rest/key.rb +44 -0
  87. data/lib/rhc/rest/membership.rb +105 -0
  88. data/lib/rhc/rest/mock.rb +1042 -0
  89. data/lib/rhc/rest/user.rb +32 -0
  90. data/lib/rhc/rest.rb +148 -0
  91. data/lib/rhc/scp_helpers.rb +27 -0
  92. data/lib/rhc/ssh_helpers.rb +380 -0
  93. data/lib/rhc/tar_gz.rb +51 -0
  94. data/lib/rhc/usage_templates/command_help.erb +51 -0
  95. data/lib/rhc/usage_templates/command_syntax_help.erb +11 -0
  96. data/lib/rhc/usage_templates/help.erb +61 -0
  97. data/lib/rhc/usage_templates/missing_help.erb +1 -0
  98. data/lib/rhc/usage_templates/options_help.erb +12 -0
  99. data/lib/rhc/vendor/okjson.rb +600 -0
  100. data/lib/rhc/vendor/parseconfig.rb +178 -0
  101. data/lib/rhc/vendor/sshkey.rb +253 -0
  102. data/lib/rhc/vendor/zliby.rb +628 -0
  103. data/lib/rhc/version.rb +5 -0
  104. data/lib/rhc/wizard.rb +637 -0
  105. data/lib/rhc.rb +34 -0
  106. data/spec/coverage_helper.rb +82 -0
  107. data/spec/direct_execution_helper.rb +339 -0
  108. data/spec/keys/example.pem +23 -0
  109. data/spec/keys/example_private.pem +27 -0
  110. data/spec/keys/server.pem +19 -0
  111. data/spec/rest_spec_helper.rb +31 -0
  112. data/spec/rhc/assets/cert.crt +22 -0
  113. data/spec/rhc/assets/cert_key_rsa +27 -0
  114. data/spec/rhc/assets/empty.txt +0 -0
  115. data/spec/rhc/assets/env_vars.txt +7 -0
  116. data/spec/rhc/assets/env_vars_2.txt +1 -0
  117. data/spec/rhc/assets/foo.txt +1 -0
  118. data/spec/rhc/assets/targz_corrupted.tar.gz +1 -0
  119. data/spec/rhc/assets/targz_sample.tar.gz +0 -0
  120. data/spec/rhc/auth_spec.rb +442 -0
  121. data/spec/rhc/cli_spec.rb +186 -0
  122. data/spec/rhc/command_spec.rb +435 -0
  123. data/spec/rhc/commands/account_spec.rb +42 -0
  124. data/spec/rhc/commands/alias_spec.rb +333 -0
  125. data/spec/rhc/commands/app_spec.rb +777 -0
  126. data/spec/rhc/commands/apps_spec.rb +39 -0
  127. data/spec/rhc/commands/authorization_spec.rb +157 -0
  128. data/spec/rhc/commands/cartridge_spec.rb +665 -0
  129. data/spec/rhc/commands/clone_spec.rb +41 -0
  130. data/spec/rhc/commands/deployment_spec.rb +327 -0
  131. data/spec/rhc/commands/domain_spec.rb +401 -0
  132. data/spec/rhc/commands/env_spec.rb +493 -0
  133. data/spec/rhc/commands/git_clone_spec.rb +102 -0
  134. data/spec/rhc/commands/logout_spec.rb +86 -0
  135. data/spec/rhc/commands/member_spec.rb +247 -0
  136. data/spec/rhc/commands/port_forward_spec.rb +217 -0
  137. data/spec/rhc/commands/scp_spec.rb +77 -0
  138. data/spec/rhc/commands/server_spec.rb +69 -0
  139. data/spec/rhc/commands/setup_spec.rb +118 -0
  140. data/spec/rhc/commands/snapshot_spec.rb +179 -0
  141. data/spec/rhc/commands/ssh_spec.rb +163 -0
  142. data/spec/rhc/commands/sshkey_spec.rb +188 -0
  143. data/spec/rhc/commands/tail_spec.rb +81 -0
  144. data/spec/rhc/commands/threaddump_spec.rb +84 -0
  145. data/spec/rhc/config_spec.rb +407 -0
  146. data/spec/rhc/helpers_spec.rb +531 -0
  147. data/spec/rhc/highline_extensions_spec.rb +314 -0
  148. data/spec/rhc/json_spec.rb +30 -0
  149. data/spec/rhc/rest_application_spec.rb +258 -0
  150. data/spec/rhc/rest_client_spec.rb +752 -0
  151. data/spec/rhc/rest_spec.rb +740 -0
  152. data/spec/rhc/targz_spec.rb +55 -0
  153. data/spec/rhc/wizard_spec.rb +756 -0
  154. data/spec/spec_helper.rb +575 -0
  155. data/spec/wizard_spec_helper.rb +330 -0
  156. metadata +469 -0
@@ -0,0 +1,401 @@
1
+ require 'spec_helper'
2
+ require 'rest_spec_helper'
3
+ require 'rhc/commands/domain'
4
+
5
+ describe RHC::Commands::Domain do
6
+ let(:rest_client){ MockRestClient.new }
7
+ before{ user_config }
8
+
9
+ describe 'default action' do
10
+ before{ rest_client }
11
+ context 'when run with no domains' do
12
+ let(:arguments) { ['domain'] }
13
+
14
+ it { expect { run }.to exit_with_code(1) }
15
+ it { run_output.should match(/To create your first domain.*app create-domain/m) }
16
+ end
17
+ context 'when help is shown' do
18
+ let(:arguments) { ['domain', '--noprompt', '--help'] }
19
+
20
+ it { expect { run }.to exit_with_code(0) }
21
+ it { run_output.should match(/configure.*delete.*leave.*list.*rename/m) }
22
+ end
23
+ end
24
+
25
+ describe 'show' do
26
+ before{ rest_client }
27
+ let(:arguments) { ['domain', 'show'] }
28
+
29
+ context 'when run with no domains' do
30
+ it { expect { run }.to exit_with_code(1) }
31
+ it { run_output.should match(/In order to deploy applications, you must create a domain/m) }
32
+ end
33
+
34
+ context 'when run with one domain no apps' do
35
+ before{ rest_client.add_domain("onedomain") }
36
+
37
+ it { expect { run }.to exit_with_code(0) }
38
+ it "should match output" do
39
+ output = run_output
40
+ output.should match("The domain onedomain exists but has no applications. You can use")
41
+ end
42
+ end
43
+
44
+ context 'when run with multiple domain no apps' do
45
+ before do
46
+ rest_client.add_domain("firstdomain")
47
+ rest_client.add_domain("seconddomain")
48
+ end
49
+ it { expect { run }.to exit_with_code(0) }
50
+ it "should match output" do
51
+ output = run_output
52
+ output.should match("The domain firstdomain exists but has no applications. You can use")
53
+ output.should_not match("Applications in seconddomain")
54
+ end
55
+ end
56
+
57
+ context 'when run with one domain multiple apps' do
58
+ before do
59
+ d = rest_client.add_domain("appdomain")
60
+ a = d.add_application("app_no_carts", "testframework-1.0")
61
+ a = d.add_application("app_multi_carts", "testframework-1.0")
62
+ a.add_cartridge("testcart-1")
63
+ a.add_cartridge("testcart-2")
64
+ a.add_cartridge("testcart-3")
65
+ end
66
+ it { expect { run }.to exit_with_code(0) }
67
+ it "should match output" do
68
+ output = run_output
69
+ output.should match("app_no_carts")
70
+ output.should match("app_multi_carts")
71
+ output.should match("testframework-1.0")
72
+ output.should match("testcart-1")
73
+ output.should match("testcart-2")
74
+ output.should match("testcart-3")
75
+ end
76
+ end
77
+
78
+ context 'when run with an app without cartridges' do
79
+ before do
80
+ d = rest_client.add_domain("appdomain")
81
+ a = d.add_application("app_no_carts")
82
+ end
83
+ it { expect { run }.to exit_with_code(0) }
84
+ it "should match output" do
85
+ output = run_output
86
+ output.should match("app_no_carts")
87
+ output.should match(/127.0.0.1\s*$/m)
88
+ end
89
+ end
90
+ end
91
+
92
+
93
+ describe 'list' do
94
+ before{ rest_client }
95
+ let(:arguments) { ['domain', 'list'] }
96
+
97
+ context 'when run with no domains' do
98
+ it { expect { run }.to exit_with_code(1) }
99
+ it { run_output.should match(/In order to deploy applications.*app create-domain/) }
100
+ end
101
+
102
+ context 'when run with one domain no apps' do
103
+ before{ rest_client.add_domain("onedomain") }
104
+
105
+ it { expect { run }.to exit_with_code(0) }
106
+ it "should match output" do
107
+ output = run_output
108
+ output.should match("You have access to 1 domain\\.")
109
+ output.should match("onedomain")
110
+ end
111
+
112
+ context 'when has no creation date, members, or allowed_gear_sizes' do
113
+ before{ rest_client.domains.first.attributes.merge(:creation_date => nil, :allowed_gear_sizes => nil, :members => nil, :id => '123') }
114
+ it { expect { run }.to exit_with_code(0) }
115
+ it "should match output" do
116
+ output = run_output
117
+ output.should match("onedomain")
118
+ output.should_not match ("Allowed Gear Sizes:")
119
+ output.should_not match ("Created:")
120
+ output.should_not match ("Members:")
121
+ output.should_not match ("ID:.*")
122
+ end
123
+ end
124
+ context 'when an ID is present and differs from name' do
125
+ let(:arguments) { ['domain', 'list', '--ids'] }
126
+ before{ rest_client.domains.first.attributes['id'] = '123' }
127
+ it { expect { run }.to exit_with_code(0) }
128
+ it "should match output" do
129
+ output = run_output
130
+ output.should match("onedomain")
131
+ output.should match ("ID:.*123")
132
+ end
133
+ end
134
+ context 'when an ID is present and identical to name' do
135
+ let(:arguments) { ['domain', 'list', '--ids'] }
136
+ before{ rest_client.domains.first.attributes['id'] = 'onedomain' }
137
+ it { expect { run }.to exit_with_code(0) }
138
+ it "should not match output" do
139
+ run_output.should_not match ("ID:.*123")
140
+ end
141
+ end
142
+ context 'when an ID is present and name is not' do
143
+ let(:arguments) { ['domain', 'list', '--ids'] }
144
+ before{ rest_client.domains.first.attributes['id'] = 'onedomain' }
145
+ before{ rest_client.domains.first.instance_variable_set(:@name, nil) }
146
+ it { expect { run }.to exit_with_code(0) }
147
+ it "should match output" do
148
+ run_output.should match ("onedomain")
149
+ run_output.should_not match ("ID:.*")
150
+ end
151
+ end
152
+ end
153
+
154
+ context 'when run with one owned domain' do
155
+ let(:arguments) { ['domains', '--mine'] }
156
+ before{ d = rest_client.add_domain('mine', true); rest_client.stub(:owned_domains).and_return([d]) }
157
+
158
+ it { expect { run }.to exit_with_code(0) }
159
+ it "should match output" do
160
+ output = run_output
161
+ output.should match("You have access to 1 domain\\.")
162
+ output.should match("mine")
163
+ output.should match("Created")
164
+ output.should match("Allowed Gear Sizes: small")
165
+ end
166
+ end
167
+
168
+ context 'when run with multiple domains and extra domain info' do
169
+ before do
170
+ rest_client.add_domain("firstdomain")
171
+ rest_client.add_domain("seconddomain", true)
172
+ end
173
+ it { expect { run }.to exit_with_code(0) }
174
+ it "should match output" do
175
+ output = run_output
176
+ output.should match("You have access to 2 domains")
177
+ output.should match("seconddomain \\(owned by a_user_name\\)")
178
+ output.should match("Created")
179
+ output.should match("Allowed Gear Sizes: small")
180
+ end
181
+ end
182
+ end
183
+
184
+ describe 'create' do
185
+ before{ rest_client }
186
+ let(:arguments) { ['domain', 'create', 'testnamespace'] }
187
+
188
+ context 'when no issues with ' do
189
+
190
+ it "should create a domain" do
191
+ expect { run }.to exit_with_code(0)
192
+ rest_client.domains[0].name.should == 'testnamespace'
193
+ end
194
+ it { run_output.should match(/Creating.*'testnamespace'.*done/m) }
195
+ end
196
+ end
197
+
198
+ describe 'rename' do
199
+ before{ rest_client }
200
+ let(:arguments) { ['domain', 'rename', 'olddomain', 'alterednamespace'] }
201
+
202
+ context 'when no issues with ' do
203
+ before{ rest_client.add_domain("olddomain") }
204
+
205
+ it "should update a domain" do
206
+ expect { run }.to exit_with_code(0)
207
+ rest_client.domains[0].name.should == 'alterednamespace'
208
+ end
209
+ it { run_output.should match(/Renaming domain 'olddomain' to 'alterednamespace'.*done.*?Applications in this domain will use the new name in their URL./m) }
210
+ end
211
+
212
+ context 'when there is no domain' do
213
+ it "should not create a domain" do
214
+ expect { run }.to exit_with_code(127)
215
+ rest_client.domains.empty?.should be_true
216
+ end
217
+ it { run_output.should match("not found") }
218
+ end
219
+ end
220
+
221
+ describe 'update' do
222
+ before{ rest_client }
223
+ let(:arguments) { ['domain', 'update', 'olddomain', 'alterednamespace'] }
224
+
225
+ before{ rest_client.add_domain("olddomain") }
226
+ it "should update a domain" do
227
+ expect { run }.to exit_with_code(0)
228
+ rest_client.domains[0].name.should == 'alterednamespace'
229
+ end
230
+ it { run_output.should match(/This command is deprecated.*Renaming domain 'olddomain' to 'alterednamespace'.*done.*?Applications in this domain will use the new name in their URL./m) }
231
+ end
232
+
233
+ describe 'alter alias has been removed' do
234
+ let(:arguments) { ['domain', 'alter', 'olddomain', 'alterednamespace'] }
235
+ it{ expect { run }.to exit_with_code(1) }
236
+ end
237
+
238
+ describe 'configure' do
239
+ context "no settings" do
240
+ before{ rest_client.add_domain("domain1") }
241
+ let(:arguments) { ['domain', 'configure', '-n', 'domain1'] }
242
+ it("should succeed"){ expect { run }.to exit_with_code(0) }
243
+ it("should display the domain config"){ run_output.should match(/Domain domain1 configuration/m) }
244
+ it("should not display the domain config without gear sizes"){ run_output.should_not match(/Allowed Gear Sizes/) }
245
+
246
+ context "server supports allowed gear sizes" do
247
+ before{ rest_client.domains.first.should_receive(:allowed_gear_sizes).and_return([]) }
248
+ it("should display the domain config"){ run_output.should match(/Domain domain1 configuration.*Allowed Gear Sizes:\s+<none>/m) }
249
+ end
250
+ context "server supports allowed gear sizes" do
251
+ before{ rest_client.domains.first.should_receive(:allowed_gear_sizes).and_return(['small', 'medium']) }
252
+ it("should display the domain config"){ run_output.should match(/Domain domain1 configuration.*Allowed Gear Sizes:\s+small, medium/m) }
253
+ end
254
+ end
255
+
256
+ context "when server does not support allowed-gear-sizes" do
257
+ before do
258
+ rest_client.add_domain("domain1")
259
+ rest_client.api.should_receive(:has_param?).with(:add_domain, 'allowed_gear_sizes').and_return(false)
260
+ end
261
+ let(:arguments) { ['domain', 'configure', '--allowed-gear-sizes', 'small'] }
262
+ it("display a message"){ run_output.should match 'The server does not support --allowed-gear-sizes' }
263
+ end
264
+
265
+ context "against a server that supports gear sizes" do
266
+ let(:username){ 'test_user' }
267
+ let(:password){ 'password' }
268
+ let(:server){ 'test.domain.com' }
269
+ let(:supports_allowed_gear_sizes?){ true }
270
+ before{ subject.class.any_instance.stub(:namespace_context).and_return('domain1') }
271
+ before do
272
+ stub_api
273
+ challenge{ stub_one_domain('domain1', nil, mock_user_auth) }
274
+ end
275
+
276
+ context "with --allowed-gear-sizes singular" do
277
+ before do
278
+ stub_api_request(:put, "domains/domain1/update", nil).
279
+ with(:body => {:allowed_gear_sizes => ['valid']}).
280
+ to_return({:body => {:type => 'domain', :data => {:name => 'domain1', :allowed_gear_sizes => ['valid']}, :messages => [{:severity => 'info', :text => 'Updated allowed gear sizes'},]}.to_json, :status => 200})
281
+ end
282
+ let(:arguments) { ['domain', 'configure', '--trace', '--allowed-gear-sizes', 'valid'] }
283
+ it("should succeed"){ expect { run }.to exit_with_code(0) }
284
+ it("should display the domain config"){ run_output.should match(/Domain domain1 configuration.*Allowed Gear Sizes:\s+valid/m) }
285
+ end
286
+
287
+ context "with --allowed-gear-sizes multiple" do
288
+ before do
289
+ stub_api_request(:put, "domains/domain1/update", nil).
290
+ with(:body => {:allowed_gear_sizes => ['one', 'two']}).
291
+ to_return({:body => {:type => 'domain', :data => {:name => 'domain1', :allowed_gear_sizes => ['one', 'two']}, :messages => [{:severity => 'info', :text => 'Updated allowed gear sizes'},]}.to_json, :status => 200})
292
+ end
293
+ let(:arguments) { ['domain', 'configure', '--trace', '--allowed-gear-sizes', 'one,two'] }
294
+ it("should succeed"){ expect { run }.to exit_with_code(0) }
295
+ it("should display the domain config"){ run_output.should match(/Domain domain1 configuration.*Allowed Gear Sizes:\s+one, two/m) }
296
+ end
297
+
298
+ context "with --allowed-gear-sizes" do
299
+ let(:arguments) { ['domain', 'configure', 'domain1', '--trace', '--allowed-gear-sizes'] }
300
+ it("raise an invalid option"){ expect{ run }.to raise_error(OptionParser::InvalidOption, /Provide a comma delimited list of valid gear/) }
301
+ end
302
+
303
+ context "with --allowed-gear-sizes=false" do
304
+ before do
305
+ stub_api_request(:put, "domains/domain1/update", nil).
306
+ with(:body => {:allowed_gear_sizes => ['false']}).
307
+ to_return({:body => {:type => 'domain', :messages => [{:field => 'allowed_gear_sizes', :exit_code => 10, :severity => 'error', :text => 'The specified gear size is invalid: false'},]}.to_json, :status => 422})
308
+ end
309
+ let(:arguments) { ['domain', 'configure', '--allowed-gear-sizes=false'] }
310
+ it("should succeed"){ expect { run }.to exit_with_code(1) }
311
+ it("should display the domain config"){ run_output.should match(/Updating domain configuration.*The specified gear size is invalid/m) }
312
+ end
313
+
314
+ context "with --no-allowed-gear-sizes" do
315
+ before do
316
+ stub_api_request(:put, "domains/domain1/update", nil).
317
+ with(:body => {:allowed_gear_sizes => []}).
318
+ to_return({:body => {:type => 'domain', :data => {:name => 'domain1', :allowed_gear_sizes => []}, :messages => [{:severity => 'info', :text => 'Updated allowed gear sizes'},]}.to_json, :status => 200})
319
+ end
320
+ let(:arguments) { ['domain', 'configure', '--no-allowed-gear-sizes'] }
321
+ it("should succeed"){ expect { run }.to exit_with_code(0) }
322
+ it("should display the domain config"){ run_output.should match(/Domain domain1 configuration.*Allowed Gear Sizes:\s+<none>/m) }
323
+ end
324
+
325
+ context "with --allowed-gear-sizes and --no-allowed-gear-sizes" do
326
+ let(:arguments) { ['domain', 'configure', 'domain1', '--trace', '--no-allowed-gear-sizes', '--allowed-gear-sizes', 'small'] }
327
+ it("raise an invalid option"){ expect{ run }.to raise_error(OptionParser::InvalidOption, /--allowed-gear-sizes.*--no-allowed-gear-sizes/) }
328
+ end
329
+ end
330
+ end
331
+
332
+ describe 'leave' do
333
+ before{ rest_client.add_domain("deleteme") }
334
+ let(:arguments) { ['domain', 'leave', '-n', 'deleteme'] }
335
+
336
+ it "should leave the domain" do
337
+ rest_client.domains.first.should_receive(:leave)
338
+ expect { run }.to exit_with_code(0)
339
+ end
340
+ end
341
+
342
+ describe 'delete' do
343
+ before{ rest_client }
344
+ let(:arguments) { ['domain', 'delete', 'deleteme'] }
345
+
346
+ context 'when no issues with ' do
347
+ before{ rest_client.add_domain("deleteme") }
348
+
349
+ it "should delete a domain" do
350
+ expect { run }.to exit_with_code(0)
351
+ rest_client.domains.empty?.should be_true
352
+ end
353
+ end
354
+
355
+ context 'when there is a different domain' do
356
+ before{ rest_client.add_domain("dontdelete") }
357
+
358
+ it "should error out" do
359
+ expect { run }.to exit_with_code(127)
360
+ rest_client.domains[0].name.should == 'dontdelete'
361
+ end
362
+ it { run_output.should match("Domain deleteme not found") }
363
+ end
364
+
365
+ context 'when there are applications on the domain' do
366
+ before do
367
+ domain = rest_client.add_domain("deleteme")
368
+ domain.add_application 'testapp1', 'mock-1.0'
369
+ end
370
+ it "should error out" do
371
+ expect { run }.to exit_with_code(1)
372
+ rest_client.domains[0].name.should == 'deleteme'
373
+ end
374
+ it { run_output.should match("Applications must be empty") }
375
+ end
376
+
377
+ context 'when delete is forced' do
378
+ let(:arguments) { ['domain', 'delete', 'deleteme', '--force'] }
379
+ before do
380
+ domain = rest_client.add_domain("deleteme")
381
+ domain.add_application 'testapp1', 'mock-1.0'
382
+ end
383
+ it "should delete successfully" do
384
+ expect { run }.to exit_with_code(0)
385
+ rest_client.domains.empty?.should be_true
386
+ end
387
+ end
388
+
389
+ end
390
+
391
+ describe 'help' do
392
+ let(:arguments) { ['domain', '--help'] }
393
+
394
+ context 'help is run' do
395
+ it "should display help" do
396
+ expect { run }.to exit_with_code(0)
397
+ end
398
+ it('should output usage') { run_output.should match("Usage: app domain") }
399
+ end
400
+ end
401
+ end