trucker-cli 0.0.1

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 (294) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +1277 -0
  3. data/Rakefile +13 -0
  4. data/bin/truck +18 -0
  5. data/lib/admin/README.md +30 -0
  6. data/lib/admin/curl.rb +59 -0
  7. data/lib/admin/guid.rb +89 -0
  8. data/lib/admin/plugin.rb +8 -0
  9. data/lib/admin/service_auth_token.rb +93 -0
  10. data/lib/admin/service_broker/add.rb +54 -0
  11. data/lib/admin/service_broker/remove.rb +33 -0
  12. data/lib/admin/service_broker/service_brokers.rb +29 -0
  13. data/lib/admin/service_broker/update.rb +60 -0
  14. data/lib/admin/set_quota.rb +44 -0
  15. data/lib/cf.rb +14 -0
  16. data/lib/cf/cli.rb +495 -0
  17. data/lib/cf/cli/app/app.rb +43 -0
  18. data/lib/cf/cli/app/apps.rb +87 -0
  19. data/lib/cf/cli/app/base.rb +72 -0
  20. data/lib/cf/cli/app/delete.rb +95 -0
  21. data/lib/cf/cli/app/deprecated.rb +11 -0
  22. data/lib/cf/cli/app/env.rb +99 -0
  23. data/lib/cf/cli/app/events.rb +45 -0
  24. data/lib/cf/cli/app/files.rb +137 -0
  25. data/lib/cf/cli/app/health.rb +26 -0
  26. data/lib/cf/cli/app/instances.rb +53 -0
  27. data/lib/cf/cli/app/logs.rb +76 -0
  28. data/lib/cf/cli/app/push.rb +104 -0
  29. data/lib/cf/cli/app/push/create.rb +108 -0
  30. data/lib/cf/cli/app/push/interactions.rb +90 -0
  31. data/lib/cf/cli/app/push/sync.rb +57 -0
  32. data/lib/cf/cli/app/rename.rb +35 -0
  33. data/lib/cf/cli/app/restart.rb +31 -0
  34. data/lib/cf/cli/app/scale.rb +63 -0
  35. data/lib/cf/cli/app/start.rb +175 -0
  36. data/lib/cf/cli/app/stats.rb +66 -0
  37. data/lib/cf/cli/app/stop.rb +27 -0
  38. data/lib/cf/cli/domain/base.rb +9 -0
  39. data/lib/cf/cli/domain/domains.rb +40 -0
  40. data/lib/cf/cli/domain/map.rb +55 -0
  41. data/lib/cf/cli/domain/unmap.rb +56 -0
  42. data/lib/cf/cli/help.rb +15 -0
  43. data/lib/cf/cli/interactive.rb +104 -0
  44. data/lib/cf/cli/login_requirements.rb +13 -0
  45. data/lib/cf/cli/organization/base.rb +12 -0
  46. data/lib/cf/cli/organization/create.rb +36 -0
  47. data/lib/cf/cli/organization/delete.rb +61 -0
  48. data/lib/cf/cli/organization/org.rb +45 -0
  49. data/lib/cf/cli/organization/orgs.rb +30 -0
  50. data/lib/cf/cli/organization/rename.rb +36 -0
  51. data/lib/cf/cli/populators/base.rb +16 -0
  52. data/lib/cf/cli/populators/organization.rb +32 -0
  53. data/lib/cf/cli/populators/populator_methods.rb +64 -0
  54. data/lib/cf/cli/populators/space.rb +33 -0
  55. data/lib/cf/cli/populators/target.rb +14 -0
  56. data/lib/cf/cli/route/base.rb +9 -0
  57. data/lib/cf/cli/route/delete.rb +28 -0
  58. data/lib/cf/cli/route/map.rb +68 -0
  59. data/lib/cf/cli/route/routes.rb +26 -0
  60. data/lib/cf/cli/route/unmap.rb +56 -0
  61. data/lib/cf/cli/service/base.rb +9 -0
  62. data/lib/cf/cli/service/bind.rb +43 -0
  63. data/lib/cf/cli/service/create.rb +158 -0
  64. data/lib/cf/cli/service/delete.rb +82 -0
  65. data/lib/cf/cli/service/rename.rb +35 -0
  66. data/lib/cf/cli/service/service.rb +40 -0
  67. data/lib/cf/cli/service/service_helper.rb +25 -0
  68. data/lib/cf/cli/service/service_instance_helper.rb +100 -0
  69. data/lib/cf/cli/service/services.rb +110 -0
  70. data/lib/cf/cli/service/unbind.rb +36 -0
  71. data/lib/cf/cli/space/base.rb +27 -0
  72. data/lib/cf/cli/space/create.rb +66 -0
  73. data/lib/cf/cli/space/delete.rb +55 -0
  74. data/lib/cf/cli/space/rename.rb +38 -0
  75. data/lib/cf/cli/space/space.rb +66 -0
  76. data/lib/cf/cli/space/spaces.rb +57 -0
  77. data/lib/cf/cli/space/switch.rb +18 -0
  78. data/lib/cf/cli/start/base.rb +35 -0
  79. data/lib/cf/cli/start/colors.rb +13 -0
  80. data/lib/cf/cli/start/login.rb +104 -0
  81. data/lib/cf/cli/start/logout.rb +17 -0
  82. data/lib/cf/cli/start/target.rb +50 -0
  83. data/lib/cf/cli/start/target_prettifier.rb +35 -0
  84. data/lib/cf/cli/start/targets.rb +16 -0
  85. data/lib/cf/cli/user/base.rb +29 -0
  86. data/lib/cf/cli/user/create.rb +51 -0
  87. data/lib/cf/cli/user/passwd.rb +36 -0
  88. data/lib/cf/cli/user/register.rb +42 -0
  89. data/lib/cf/cli/user/users.rb +32 -0
  90. data/lib/cf/constants.rb +10 -0
  91. data/lib/cf/errors.rb +19 -0
  92. data/lib/cf/plugin.rb +56 -0
  93. data/lib/cf/spacing.rb +89 -0
  94. data/lib/cf/spec_helper.rb +1 -0
  95. data/lib/cf/test_support.rb +6 -0
  96. data/lib/cf/version.rb +3 -0
  97. data/lib/console/README.md +16 -0
  98. data/lib/console/console.rb +187 -0
  99. data/lib/console/plugin.rb +32 -0
  100. data/lib/manifests/errors.rb +35 -0
  101. data/lib/manifests/loader.rb +31 -0
  102. data/lib/manifests/loader/builder.rb +39 -0
  103. data/lib/manifests/loader/normalizer.rb +145 -0
  104. data/lib/manifests/loader/resolver.rb +79 -0
  105. data/lib/manifests/manifests.rb +343 -0
  106. data/lib/manifests/plugin.rb +140 -0
  107. data/lib/micro/README.md +25 -0
  108. data/lib/micro/errors.rb +4 -0
  109. data/lib/micro/micro.rb +56 -0
  110. data/lib/micro/plugin.rb +197 -0
  111. data/lib/micro/switcher/base.rb +79 -0
  112. data/lib/micro/switcher/darwin.rb +21 -0
  113. data/lib/micro/switcher/dummy.rb +15 -0
  114. data/lib/micro/switcher/linux.rb +16 -0
  115. data/lib/micro/switcher/windows.rb +31 -0
  116. data/lib/micro/vmrun.rb +175 -0
  117. data/lib/tasks/gem_release.rake +56 -0
  118. data/lib/tasks/windows_build.rake +14 -0
  119. data/lib/tunnel/README.md +29 -0
  120. data/lib/tunnel/config/clients.yml +17 -0
  121. data/lib/tunnel/helper-app/Gemfile +10 -0
  122. data/lib/tunnel/helper-app/Gemfile.lock +48 -0
  123. data/lib/tunnel/helper-app/server.rb +43 -0
  124. data/lib/tunnel/plugin.rb +183 -0
  125. data/lib/tunnel/tunnel.rb +295 -0
  126. data/spec/admin/curl_spec.rb +52 -0
  127. data/spec/admin/guid_spec.rb +85 -0
  128. data/spec/admin/service_broker/add_spec.rb +64 -0
  129. data/spec/admin/service_broker/remove_spec.rb +46 -0
  130. data/spec/admin/service_broker/service_brokers_spec.rb +34 -0
  131. data/spec/admin/service_broker/update_spec.rb +51 -0
  132. data/spec/admin/set_quota_spec.rb +89 -0
  133. data/spec/assets/env/Gemfile +4 -0
  134. data/spec/assets/env/Gemfile.lock +20 -0
  135. data/spec/assets/env/env_test.rb +58 -0
  136. data/spec/assets/hello-sinatra/Gemfile +3 -0
  137. data/spec/assets/hello-sinatra/Gemfile.lock +17 -0
  138. data/spec/assets/hello-sinatra/config.ru +3 -0
  139. data/spec/assets/hello-sinatra/fat-cat-makes-app-larger.png +0 -0
  140. data/spec/assets/hello-sinatra/main.rb +8 -0
  141. data/spec/assets/rails328_ruby187_app/Gemfile +39 -0
  142. data/spec/assets/rails328_ruby187_app/README.rdoc +261 -0
  143. data/spec/assets/rails328_ruby187_app/Rakefile +7 -0
  144. data/spec/assets/rails328_ruby187_app/app/assets/images/rails.png +0 -0
  145. data/spec/assets/rails328_ruby187_app/app/assets/javascripts/application.js +15 -0
  146. data/spec/assets/rails328_ruby187_app/app/assets/stylesheets/application.css +13 -0
  147. data/spec/assets/rails328_ruby187_app/app/controllers/application_controller.rb +3 -0
  148. data/spec/assets/rails328_ruby187_app/app/helpers/application_helper.rb +2 -0
  149. data/spec/assets/rails328_ruby187_app/app/views/layouts/application.html.erb +14 -0
  150. data/spec/assets/rails328_ruby187_app/config.ru +4 -0
  151. data/spec/assets/rails328_ruby187_app/config/application.rb +62 -0
  152. data/spec/assets/rails328_ruby187_app/config/boot.rb +6 -0
  153. data/spec/assets/rails328_ruby187_app/config/database.yml +25 -0
  154. data/spec/assets/rails328_ruby187_app/config/environment.rb +5 -0
  155. data/spec/assets/rails328_ruby187_app/config/environments/development.rb +37 -0
  156. data/spec/assets/rails328_ruby187_app/config/environments/production.rb +67 -0
  157. data/spec/assets/rails328_ruby187_app/config/environments/test.rb +37 -0
  158. data/spec/assets/rails328_ruby187_app/config/initializers/backtrace_silencers.rb +7 -0
  159. data/spec/assets/rails328_ruby187_app/config/initializers/inflections.rb +15 -0
  160. data/spec/assets/rails328_ruby187_app/config/initializers/mime_types.rb +5 -0
  161. data/spec/assets/rails328_ruby187_app/config/initializers/secret_token.rb +7 -0
  162. data/spec/assets/rails328_ruby187_app/config/initializers/session_store.rb +8 -0
  163. data/spec/assets/rails328_ruby187_app/config/initializers/wrap_parameters.rb +14 -0
  164. data/spec/assets/rails328_ruby187_app/config/locales/en.yml +5 -0
  165. data/spec/assets/rails328_ruby187_app/config/routes.rb +58 -0
  166. data/spec/assets/rails328_ruby187_app/db/seeds.rb +7 -0
  167. data/spec/assets/rails328_ruby187_app/doc/README_FOR_APP +2 -0
  168. data/spec/assets/rails328_ruby187_app/manifest.yml +7 -0
  169. data/spec/assets/rails328_ruby187_app/public/404.html +26 -0
  170. data/spec/assets/rails328_ruby187_app/public/422.html +26 -0
  171. data/spec/assets/rails328_ruby187_app/public/500.html +25 -0
  172. data/spec/assets/rails328_ruby187_app/public/assets/application-7270767b2a9e9fff880aa5de378ca791.css +0 -0
  173. data/spec/assets/rails328_ruby187_app/public/assets/application-7270767b2a9e9fff880aa5de378ca791.css.gz +0 -0
  174. data/spec/assets/rails328_ruby187_app/public/assets/application-ccab98dc1abdf097c0af693e20aed861.js +17 -0
  175. data/spec/assets/rails328_ruby187_app/public/assets/application-ccab98dc1abdf097c0af693e20aed861.js.gz +0 -0
  176. data/spec/assets/rails328_ruby187_app/public/assets/application.css +0 -0
  177. data/spec/assets/rails328_ruby187_app/public/assets/application.css.gz +0 -0
  178. data/spec/assets/rails328_ruby187_app/public/assets/application.js +17 -0
  179. data/spec/assets/rails328_ruby187_app/public/assets/application.js.gz +0 -0
  180. data/spec/assets/rails328_ruby187_app/public/assets/manifest.yml +4 -0
  181. data/spec/assets/rails328_ruby187_app/public/assets/rails-be8732dac73d845ac5b142c8fb5f9fb0.png +0 -0
  182. data/spec/assets/rails328_ruby187_app/public/assets/rails.png +0 -0
  183. data/spec/assets/rails328_ruby187_app/public/favicon.ico +0 -0
  184. data/spec/assets/rails328_ruby187_app/public/index.html +241 -0
  185. data/spec/assets/rails328_ruby187_app/public/robots.txt +5 -0
  186. data/spec/assets/rails328_ruby187_app/script/rails +6 -0
  187. data/spec/assets/rails328_ruby187_app/test/performance/browsing_test.rb +12 -0
  188. data/spec/assets/rails328_ruby187_app/test/test_helper.rb +13 -0
  189. data/spec/cf/cli/app/base_spec.rb +17 -0
  190. data/spec/cf/cli/app/delete_spec.rb +197 -0
  191. data/spec/cf/cli/app/env_spec.rb +261 -0
  192. data/spec/cf/cli/app/events_spec.rb +72 -0
  193. data/spec/cf/cli/app/help_spec.rb +39 -0
  194. data/spec/cf/cli/app/instances_spec.rb +69 -0
  195. data/spec/cf/cli/app/push/create_spec.rb +444 -0
  196. data/spec/cf/cli/app/push/interactions_spec.rb +32 -0
  197. data/spec/cf/cli/app/push_spec.rb +332 -0
  198. data/spec/cf/cli/app/rename_spec.rb +108 -0
  199. data/spec/cf/cli/app/restart_spec.rb +47 -0
  200. data/spec/cf/cli/app/scale_spec.rb +63 -0
  201. data/spec/cf/cli/app/start_spec.rb +255 -0
  202. data/spec/cf/cli/app/stats_spec.rb +66 -0
  203. data/spec/cf/cli/domain/help_spec.rb +39 -0
  204. data/spec/cf/cli/domain/map_spec.rb +140 -0
  205. data/spec/cf/cli/domain/unmap_spec.rb +77 -0
  206. data/spec/cf/cli/help_spec.rb +21 -0
  207. data/spec/cf/cli/organization/create_spec.rb +121 -0
  208. data/spec/cf/cli/organization/delete_spec.rb +105 -0
  209. data/spec/cf/cli/organization/help_spec.rb +39 -0
  210. data/spec/cf/cli/organization/orgs_spec.rb +116 -0
  211. data/spec/cf/cli/organization/rename_spec.rb +116 -0
  212. data/spec/cf/cli/populators/organization_spec.rb +179 -0
  213. data/spec/cf/cli/populators/space_spec.rb +156 -0
  214. data/spec/cf/cli/populators/target_spec.rb +39 -0
  215. data/spec/cf/cli/route/delete_spec.rb +92 -0
  216. data/spec/cf/cli/route/help_spec.rb +32 -0
  217. data/spec/cf/cli/route/map_spec.rb +148 -0
  218. data/spec/cf/cli/route/unmap_spec.rb +114 -0
  219. data/spec/cf/cli/service/bind_spec.rb +25 -0
  220. data/spec/cf/cli/service/create_spec.rb +147 -0
  221. data/spec/cf/cli/service/delete_spec.rb +22 -0
  222. data/spec/cf/cli/service/help_spec.rb +39 -0
  223. data/spec/cf/cli/service/rename_spec.rb +103 -0
  224. data/spec/cf/cli/service/service_helper_spec.rb +66 -0
  225. data/spec/cf/cli/service/service_instance_helper_spec.rb +155 -0
  226. data/spec/cf/cli/service/service_spec.rb +23 -0
  227. data/spec/cf/cli/service/services_spec.rb +156 -0
  228. data/spec/cf/cli/service/unbind_spec.rb +25 -0
  229. data/spec/cf/cli/space/base_spec.rb +49 -0
  230. data/spec/cf/cli/space/create_spec.rb +144 -0
  231. data/spec/cf/cli/space/delete_spec.rb +109 -0
  232. data/spec/cf/cli/space/help_spec.rb +39 -0
  233. data/spec/cf/cli/space/rename_spec.rb +110 -0
  234. data/spec/cf/cli/space/space_spec.rb +80 -0
  235. data/spec/cf/cli/space/spaces_spec.rb +107 -0
  236. data/spec/cf/cli/space/switch_space_spec.rb +57 -0
  237. data/spec/cf/cli/start/help_spec.rb +39 -0
  238. data/spec/cf/cli/start/login_spec.rb +142 -0
  239. data/spec/cf/cli/start/logout_spec.rb +49 -0
  240. data/spec/cf/cli/start/target_prettifier_spec.rb +78 -0
  241. data/spec/cf/cli/start/target_spec.rb +123 -0
  242. data/spec/cf/cli/user/create_spec.rb +98 -0
  243. data/spec/cf/cli/user/help_spec.rb +32 -0
  244. data/spec/cf/cli/user/passwd_spec.rb +94 -0
  245. data/spec/cf/cli/user/register_spec.rb +145 -0
  246. data/spec/cf/cli_spec.rb +474 -0
  247. data/spec/console/console_spec.rb +189 -0
  248. data/spec/factories/cfoundry/v2/apps_factory.rb +12 -0
  249. data/spec/factories/cfoundry/v2/clients_factory.rb +7 -0
  250. data/spec/factories/cfoundry/v2/domains_factory.rb +8 -0
  251. data/spec/factories/cfoundry/v2/managed_service_instances_factory.rb +13 -0
  252. data/spec/factories/cfoundry/v2/organizations_factory.rb +14 -0
  253. data/spec/factories/cfoundry/v2/quota_definitions.rb +13 -0
  254. data/spec/factories/cfoundry/v2/routes_factory.rb +8 -0
  255. data/spec/factories/cfoundry/v2/service_bindings_factory.rb +11 -0
  256. data/spec/factories/cfoundry/v2/service_brokers_factory.rb +11 -0
  257. data/spec/factories/cfoundry/v2/service_plans_factory.rb +17 -0
  258. data/spec/factories/cfoundry/v2/services_factory.rb +14 -0
  259. data/spec/factories/cfoundry/v2/spaces_factory.rb +13 -0
  260. data/spec/factories/cfoundry/v2/stacks_factory.rb +11 -0
  261. data/spec/factories/cfoundry/v2/user_provided_service_instances_factory.rb +12 -0
  262. data/spec/factories/cfoundry/v2/users_factory.rb +7 -0
  263. data/spec/features/backspace_spec.rb +46 -0
  264. data/spec/features/create_user_spec.rb +74 -0
  265. data/spec/features/delete_orphaned_service_spec.rb +64 -0
  266. data/spec/features/login_spec.rb +65 -0
  267. data/spec/features/manifests_spec.rb +86 -0
  268. data/spec/features/org_spec.rb +50 -0
  269. data/spec/features/push_flow_spec.rb +169 -0
  270. data/spec/features/service_brokers_spec.rb +173 -0
  271. data/spec/features/services_spec.rb +122 -0
  272. data/spec/features/space_spec.rb +107 -0
  273. data/spec/features/switching_targets_spec.rb +70 -0
  274. data/spec/manifests/errors_spec.rb +43 -0
  275. data/spec/manifests/loader/builder_spec.rb +80 -0
  276. data/spec/manifests/loader/normalizer_spec.rb +158 -0
  277. data/spec/manifests/manifests_spec.rb +335 -0
  278. data/spec/manifests/plugin_spec.rb +410 -0
  279. data/spec/micro/plugin_spec.rb +64 -0
  280. data/spec/spec_helper.rb +69 -0
  281. data/spec/support/cli_helper.rb +87 -0
  282. data/spec/support/config_helper.rb +15 -0
  283. data/spec/support/factory_girl.rb +6 -0
  284. data/spec/support/fake_home_dir.rb +55 -0
  285. data/spec/support/features_helper.rb +99 -0
  286. data/spec/support/interact_helper.rb +27 -0
  287. data/spec/support/matchers.rb +16 -0
  288. data/spec/support/mock_commands/mock_restart.rb +16 -0
  289. data/spec/support/mock_commands/mock_start.rb +17 -0
  290. data/spec/support/shared_examples/errors.rb +40 -0
  291. data/spec/support/shared_examples/input.rb +14 -0
  292. data/spec/tunnel/plugin_spec.rb +31 -0
  293. data/spec/tunnel/tunnel_spec.rb +54 -0
  294. metadata +814 -0
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Organization
5
+ describe "Help" do
6
+ let(:global) { {} }
7
+ let(:given) { {} }
8
+
9
+ subject do
10
+ capture_output { Mothership.new.invoke(:help, :command => "org") }
11
+ end
12
+
13
+ it "describes the command" do
14
+ subject
15
+ stdout.rewind
16
+ expect(stdout.readlines.first).to match /Show organization information/
17
+ end
18
+
19
+ it "prints the options" do
20
+ subject
21
+ stdout.rewind
22
+ expect(stdout.readlines.any? {|line| line =~ /Options:/ }).to be_true
23
+
24
+ end
25
+
26
+ context "when the user is not logged in" do
27
+ before do
28
+ capture_output { Mothership.new.invoke(:logout) }
29
+ end
30
+
31
+ it "does not require login" do
32
+ subject
33
+ stdout.rewind
34
+ expect(stdout.readlines.first).to_not match /Please log in first to proceed/
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,116 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Organization
5
+ describe Orgs do
6
+ let(:global) { {:color => false} }
7
+ let(:inputs) { {} }
8
+ let(:given) { {} }
9
+ let(:output) { StringIO.new }
10
+
11
+ let(:client) { build(:client) }
12
+ let(:space) { build(:space) }
13
+ let(:domain) { build(:domain) }
14
+ let!(:org_1) { build(:organization, :name => "bb_second", :spaces => [space], :domains => [domain]) }
15
+ let!(:org_2) { build(:organization, :name => "aa_first", :spaces => [space], :domains => [domain]) }
16
+ let!(:org_3) { build(:organization, :name => "cc_last", :spaces => [space], :domains => [domain]) }
17
+ let(:organizations) { [org_1, org_2, org_3] }
18
+
19
+ before do
20
+ CF::CLI.any_instance.stub(:client) { client }
21
+ CF::CLI.any_instance.stub(:precondition) { nil }
22
+
23
+ client.stub(:organizations).and_return(organizations)
24
+ end
25
+
26
+ subject do
27
+ capture_output { Mothership.new.invoke(:orgs, inputs, given, global) }
28
+ end
29
+
30
+ describe "metadata" do
31
+ let(:command) { Mothership.commands[:orgs] }
32
+
33
+ describe "command" do
34
+ subject { command }
35
+ its(:description) { should eq "List available organizations" }
36
+ it { expect(Mothership::Help.group(:organizations)).to include(subject) }
37
+ end
38
+
39
+ include_examples "inputs must have descriptions"
40
+
41
+ describe "arguments" do
42
+ subject { command.arguments }
43
+ it "has no arguments" do
44
+ should be_empty
45
+ end
46
+ end
47
+ end
48
+
49
+ it "should have the correct first two lines" do
50
+ subject
51
+ stdout.rewind
52
+ expect(stdout.readline).to match /Getting organizations.*OK/
53
+ expect(stdout.readline).to eq "\n"
54
+ end
55
+
56
+ context "when there are no organizations" do
57
+ let(:organizations) { [] }
58
+
59
+ context "and the full flag is given" do
60
+ let(:inputs) { {:full => true} }
61
+
62
+ it "displays yaml-style output with all organization details" do
63
+ CF::Organization::Orgs.any_instance.should_not_receive(:invoke)
64
+ subject
65
+ end
66
+ end
67
+
68
+ context "and the full flag is not given (default is false)" do
69
+ it "should show only the progress" do
70
+ subject
71
+
72
+ stdout.rewind
73
+ expect(stdout.readline).to match /Getting organizations.*OK/
74
+ expect(stdout).to be_eof
75
+ end
76
+ end
77
+ end
78
+
79
+ context "when there are organizations" do
80
+ context "and the full flag is given" do
81
+ let(:inputs) { {:full => true} }
82
+
83
+ it "displays yaml-style output with all organization details" do
84
+ CF::Organization::Orgs.any_instance.should_receive(:invoke).with(:org, :organization => org_2, :full => true)
85
+ CF::Organization::Orgs.any_instance.should_receive(:invoke).with(:org, :organization => org_1, :full => true)
86
+ CF::Organization::Orgs.any_instance.should_receive(:invoke).with(:org, :organization => org_3, :full => true)
87
+ subject
88
+ end
89
+ end
90
+
91
+ context "and the full flag is not given (default is false)" do
92
+
93
+ before do
94
+ org_1.stub(:spaces).and_return([space])
95
+ org_2.stub(:spaces).and_return([space])
96
+ org_3.stub(:spaces).and_return([space])
97
+ end
98
+
99
+ it "displays tabular output with names, spaces and domains" do
100
+ subject
101
+
102
+ stdout.rewind
103
+ stdout.readline
104
+ stdout.readline
105
+
106
+ expect(stdout.readline).to match /name/
107
+ organizations.sort_by(&:name).each do |org|
108
+ expect(stdout.readline).to match /#{org.name}/
109
+ end
110
+ expect(stdout).to be_eof
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,116 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Organization
5
+ describe Rename do
6
+ let(:global) { {:color => false, :quiet => true} }
7
+ let(:inputs) { {} }
8
+ let(:given) { {} }
9
+
10
+ let(:new_name) { "some-new-name" }
11
+ let(:organizations) { [build(:organization)] }
12
+ let(:client) { build(:client) }
13
+
14
+ before do
15
+ CF::CLI.any_instance.stub(:client).and_return(client)
16
+ CF::CLI.any_instance.stub(:precondition).and_return(nil)
17
+ client.stub(:organizations).and_return(organizations)
18
+ end
19
+
20
+ subject { Mothership.new.invoke(:rename_org, inputs, given, global) }
21
+
22
+ describe "metadata" do
23
+ let(:command) { Mothership.commands[:rename_org] }
24
+
25
+ describe "command" do
26
+ subject { command }
27
+ its(:description) { should eq "Rename an organization" }
28
+ it { expect(Mothership::Help.group(:organizations)).to include(subject) }
29
+ end
30
+
31
+ describe "inputs" do
32
+ subject { command.inputs }
33
+
34
+ it "is not missing any descriptions" do
35
+ subject.each do |input, attrs|
36
+ expect(attrs[:description]).to be
37
+ expect(attrs[:description].strip).to_not be_empty
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "arguments" do
43
+ subject { command.arguments }
44
+ it "has the correct argument order" do
45
+ should eq([
46
+ {:type => :optional, :value => nil, :name => :organization},
47
+ {:type => :optional, :value => nil, :name => :name}
48
+ ])
49
+ end
50
+ end
51
+ end
52
+
53
+ context "when there are no organizations" do
54
+ let(:organizations) { [] }
55
+
56
+ context "and an organization is given" do
57
+ let(:given) { {:organization => "some-invalid-organization"} }
58
+ it { expect { subject }.to raise_error(CF::UserError, "Unknown organization 'some-invalid-organization'.") }
59
+ end
60
+
61
+ context "and an organization is not given" do
62
+ it { expect { subject }.to raise_error(CF::UserError, "No organizations.") }
63
+ end
64
+ end
65
+
66
+ context "when there are organizations" do
67
+ let(:renamed_organization) { organizations.first }
68
+
69
+ context "when the defaults are used" do
70
+ it "asks for the organization and new name and renames" do
71
+ should_ask("Rename which organization?", anything) { renamed_organization }
72
+ should_ask("New name") { new_name }
73
+ renamed_organization.should_receive(:name=).with(new_name)
74
+ renamed_organization.should_receive(:update!)
75
+ subject
76
+ end
77
+ end
78
+
79
+ context "when no name is provided, but an organization is" do
80
+ let(:given) { {:organization => renamed_organization.name} }
81
+
82
+ it "asks for the new name and renames" do
83
+ dont_allow_ask("Rename which organization?", anything)
84
+ should_ask("New name") { new_name }
85
+ renamed_organization.should_receive(:name=).with(new_name)
86
+ renamed_organization.should_receive(:update!)
87
+ subject
88
+ end
89
+ end
90
+
91
+ context "when an organization is provided and a name" do
92
+ let(:inputs) { {:organization => renamed_organization, :name => new_name} }
93
+
94
+ it "renames the organization" do
95
+ renamed_organization.should_receive(:update!)
96
+ subject
97
+ end
98
+
99
+ it "displays the progress" do
100
+ mock_with_progress("Renaming to #{new_name}")
101
+ renamed_organization.should_receive(:update!)
102
+
103
+ subject
104
+ end
105
+
106
+ context "and the name already exists" do
107
+ it "fails" do
108
+ renamed_organization.should_receive(:update!) { raise CFoundry::OrganizationNameTaken.new("Bad error", 200) }
109
+ expect { subject }.to raise_error(CFoundry::OrganizationNameTaken)
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,179 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Populators
5
+ describe Organization do
6
+ stub_home_dir_with { "#{SPEC_ROOT}/fixtures/fake_home_dirs/new" }
7
+
8
+ describe "#populate_and_save!" do
9
+ let(:tokens_file_path) { CF::TOKENS_FILE }
10
+ let(:user) { build(:user) }
11
+ let(:client) { build(:client) }
12
+ let(:organizations) do
13
+ [
14
+ build(:organization, :name => "My Org", :guid => "organization-id-1", :users => [user]),
15
+ build(:organization, :name => "Other Org", :guid => "organization-id-2")
16
+ ]
17
+ end
18
+ let(:organization) { organizations.first }
19
+
20
+ let(:input) { {:organization => organization} }
21
+ let(:tokens_yaml) { YAML.load_file(File.expand_path(tokens_file_path)) }
22
+ let(:populator) { populator = CF::Populators::Organization.new(Mothership::Inputs.new(nil, nil, input)) }
23
+
24
+ before do
25
+ client.stub(:current_user).and_return(user)
26
+ client.stub(:organization).and_return(organization)
27
+ client.stub(:current_organization).and_return(organization)
28
+ client.stub(:target).and_return('https://api.some-domain.com')
29
+ described_class.any_instance.stub(:client).and_return(client)
30
+
31
+ write_token_file({:organization => "organization-id-1"})
32
+ end
33
+
34
+ def execute_populate_and_save
35
+ capture_output { populator.populate_and_save! }
36
+ end
37
+
38
+ it "updates the client with the new organization" do
39
+ write_token_file({:organization => "organization-id-2"})
40
+ described_class.any_instance.unstub(:client)
41
+ populator.client.current_organization.guid.should == "organization-id-2"
42
+
43
+ execute_populate_and_save
44
+
45
+ populator.client.current_organization.guid.should == "organization-id-1"
46
+ end
47
+
48
+ it "returns the organization" do
49
+ execute_populate_and_save.should == organization
50
+ end
51
+
52
+ context "with an organization in the input" do
53
+ let(:input) { {:organization => organization} }
54
+ before { write_token_file({:organization => "organization-id-2"}) }
55
+
56
+ it "uses that organization" do
57
+ execute_populate_and_save.should == organization
58
+ end
59
+
60
+ it "should not reprompt for organization" do
61
+ dont_allow_ask("Organization", anything)
62
+ execute_populate_and_save
63
+ end
64
+
65
+ it "sets the organization in the token file" do
66
+ execute_populate_and_save
67
+ expect(tokens_yaml["https://api.some-domain.com"][:organization]).to be == "organization-id-1"
68
+ end
69
+
70
+ it "prints out that it is switching to that organization" do
71
+ execute_populate_and_save
72
+ expect(output).to say("Switching to organization #{organization.name}")
73
+ end
74
+
75
+ context "and a different organization and space in the token file" do
76
+ let(:input) { {:organization => organizations.last} }
77
+
78
+ before do
79
+ write_token_file({:organization => "organization-id-1", :space => "should-be-removed"})
80
+ end
81
+
82
+ it "removes the space from the token file" do
83
+ execute_populate_and_save
84
+ refreshed_tokens = YAML.load_file(File.expand_path(tokens_file_path))
85
+ expect(refreshed_tokens["https://api.some-domain.com"][:space]).to be_nil
86
+ end
87
+
88
+ end
89
+
90
+ context "and the same organization and a space in the token file" do
91
+ before do
92
+ write_token_file({:organization => "organization-id-1", :space => "should-not-be-removed"})
93
+ end
94
+
95
+ it "does not remove the space from the token file" do
96
+ execute_populate_and_save
97
+ expect(tokens_yaml["https://api.some-domain.com"][:space]).to be == "should-not-be-removed"
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ context "without an organization in the input" do
104
+ let(:input) { {} }
105
+
106
+ context "with an organization in the config file" do
107
+ it "should not reprompt for organization" do
108
+ dont_allow_ask("Organization", anything)
109
+ execute_populate_and_save
110
+ end
111
+
112
+ it "sets the organization in the token file" do
113
+ execute_populate_and_save
114
+ expect(tokens_yaml["https://api.some-domain.com"][:organization]).to be == "organization-id-1"
115
+ end
116
+
117
+ context "but that organization doesn't exist anymore (not valid)" do
118
+ before do
119
+ client.stub(:organizations_first_page).and_return({:results => organizations})
120
+ organization.stub(:users).and_raise(CFoundry::APIError)
121
+ end
122
+
123
+ it "asks the user for an organization" do
124
+ should_ask("Organization", anything) { organization }
125
+ execute_populate_and_save
126
+ end
127
+ end
128
+ end
129
+
130
+ context "without an organization in the config file" do
131
+ context "when the user has organizations" do
132
+ before do
133
+ client.stub(:organizations_first_page).and_return({:results => organizations})
134
+ write_token_file({})
135
+ end
136
+
137
+ it "prompts for the organization" do
138
+ should_ask("Organization", anything) { organization }
139
+ execute_populate_and_save
140
+
141
+ expect(output).to say("Switching to organization #{organization.name}")
142
+ end
143
+
144
+ it "sets the organization in the token file" do
145
+ should_ask("Organization", anything) { organization }
146
+
147
+ execute_populate_and_save
148
+ expect(tokens_yaml["https://api.some-domain.com"][:organization]).to be == "organization-id-1"
149
+ end
150
+ end
151
+
152
+ context "when the user has no organizations" do
153
+ before do
154
+ client.stub(:organizations_first_page).and_return({:results => []})
155
+ write_token_file({})
156
+ end
157
+
158
+ it "warns the user they should create one" do
159
+ execute_populate_and_save
160
+ expect(output).to say("There are no organizations. You may want to create one with create-org.")
161
+ end
162
+ end
163
+
164
+ context "when the user has too many organizations" do
165
+ before do
166
+ client.stub(:organizations_first_page).and_return({:results => organizations, :next_page => true})
167
+ write_token_file({})
168
+ end
169
+
170
+ it "tells the user to set their target" do
171
+ expect { execute_populate_and_save }.to raise_error(CF::UserFriendlyError, "Login successful. Too many organizations (>50) to list. Remember to set your target organization using 'target -o [ORGANIZATION]'.")
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end