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,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::Route::Unmap do
4
+ before do
5
+ stub_client_and_precondition
6
+ end
7
+
8
+ let(:client) do
9
+ build(:client).tap do |client|
10
+ client.stub(:apps).and_return([app])
11
+ client.stub(:apps_by_name).and_return([app])
12
+ end
13
+ end
14
+
15
+ let(:app){ build(:app, :space => space, :name => "app-name") }
16
+ let(:space) { build(:space, :name => "space-name", :domains => space_domains) }
17
+ let(:domain) { build(:domain, :name => domain_name ) }
18
+ let(:domain_name) { "some-domain.com" }
19
+ let(:host_name) { "some-host" }
20
+ let(:url) { "#{host_name}.#{domain_name}" }
21
+ let(:space_domains) { [domain] }
22
+
23
+ describe 'metadata' do
24
+ let(:command) { Mothership.commands[:delete_service] }
25
+
26
+ describe 'command' do
27
+ subject { command }
28
+ its(:description) { should eq "Delete a service" }
29
+ it { expect(Mothership::Help.group(:services, :manage)).to include(subject) }
30
+ end
31
+
32
+ include_examples 'inputs must have descriptions'
33
+
34
+ describe 'arguments' do
35
+ subject { command.arguments }
36
+ it 'has the correct argument order' do
37
+ should eq([{:type => :optional, :value => nil, :name => :service }])
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when an app and a url are specified" do
43
+ subject { cf %W[unmap #{url} #{app.name}] }
44
+
45
+ context "when the given route is mapped to the given app" do
46
+ let(:app) { build(:app, :space => space, :name => "app-name", :routes => [route]) }
47
+ let(:route) { build(:route, :space => space, :host => host_name, :domain => domain) }
48
+
49
+ it "unmaps the url from the app" do
50
+ app.should_receive(:remove_route).with(route)
51
+ subject
52
+ end
53
+ end
54
+
55
+ context "when the given route is NOT mapped to the given app" do
56
+ it "displays an error" do
57
+ app.stub(:routes).and_return([])
58
+ subject
59
+ expect(error_output).to say("Unknown route")
60
+ end
61
+ end
62
+ end
63
+
64
+ context "when only an app is specified" do
65
+ let(:other_route) { build(:route, :host => "abcd", :domain => domain) }
66
+ let(:route) { build(:route, :host => "efgh", :domain => domain) }
67
+ let(:app) { build(:app, :space => space, :routes => [route, other_route] )}
68
+
69
+ subject { cf %W[unmap --app #{app.name}] }
70
+
71
+ it "asks the user to select from the app's urls" do
72
+ should_ask("Which URL?", anything) do |_, opts|
73
+ expect(opts[:choices]).to eq [other_route, route]
74
+ route
75
+ end
76
+
77
+ app.stub(:remove_route)
78
+
79
+ subject
80
+ end
81
+
82
+ it "unmaps the selected url from the app" do
83
+ stub_ask("Which URL?", anything) { route }
84
+ app.should_receive(:remove_route).with(route)
85
+ subject
86
+ end
87
+ end
88
+
89
+ context "when an app is specified and the --all option is given" do
90
+ let(:other_route) { build(:route, :host => "abcd", :domain => domain) }
91
+ let(:route) { build(:route, :host => "efgh", :domain => domain) }
92
+ let(:app) { build(:app, :routes => [route, other_route]) }
93
+
94
+ subject { cf %W[unmap --all --app #{app.name}] }
95
+
96
+ it "unmaps all routes from the given app" do
97
+ app.should_receive(:remove_route).with(route)
98
+ app.should_receive(:remove_route).with(other_route)
99
+ subject
100
+ end
101
+ end
102
+
103
+ context "when only a url is passed" do
104
+ let(:route) { build(:route, :host => host_name, :domain => domain) }
105
+ before { client.stub(:routes).and_return([route]) }
106
+
107
+ subject { cf %W[unmap #{url}] }
108
+
109
+ it "displays an error message" do
110
+ subject
111
+ expect(error_output).to say("Missing --app.")
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::Service::Bind do
4
+ describe 'metadata' do
5
+ let(:command) { Mothership.commands[:bind_service] }
6
+
7
+ describe 'command' do
8
+ subject { command }
9
+ its(:description) { should eq "Bind a service to an application" }
10
+ it { expect(Mothership::Help.group(:services, :manage)).to include(subject) }
11
+ end
12
+
13
+ include_examples 'inputs must have descriptions'
14
+
15
+ describe 'arguments' do
16
+ subject { command.arguments }
17
+ it 'has the correct argument order' do
18
+ should eq([
19
+ { :type => :optional, :value => nil, :name => :service },
20
+ { :type => :optional, :value => nil, :name => :app }
21
+ ])
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,147 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Service
5
+ describe Create do
6
+ let(:client) { build(:client) }
7
+
8
+ before do
9
+ stub_client_and_precondition
10
+ end
11
+
12
+ describe "metadata" do
13
+ let(:command) { Mothership.commands[:create_service] }
14
+
15
+ describe "command" do
16
+ subject { command }
17
+ its(:description) { should eq "Create a service" }
18
+ it { expect(Mothership::Help.group(:services, :manage)).to include(subject) }
19
+ end
20
+
21
+ include_examples "inputs must have descriptions"
22
+
23
+ describe "arguments" do
24
+ subject { command.arguments }
25
+ it "has the correct argument order" do
26
+ should eq([{:type => :optional, :value => nil, :name => :offering}, {:type => :optional, :value => nil, :name => :name}])
27
+ end
28
+ end
29
+ end
30
+
31
+ context "when there are services" do
32
+ let(:service_plan) { build(:service_plan, :name => "F20") }
33
+ let(:selected_service) { build(:service, :label => "Foo Service", :service_plans => [service_plan]) }
34
+ let(:command) { Mothership.new.invoke(:create_service, params, {}) }
35
+ let(:params) { {} }
36
+
37
+ before do
38
+ client.stub(:services).and_return(services)
39
+ end
40
+
41
+ describe "when there is at least one service" do
42
+ let(:services) { [selected_service] }
43
+
44
+ it "asks for the service" do
45
+ should_ask("What kind?", anything) { selected_service }
46
+ should_ask("Name?", anything) { selected_service.label }
47
+ should_ask("Which plan?", anything) { service_plan }
48
+ CFoundry::V2::ServiceInstance.any_instance.stub(:create!)
49
+
50
+ capture_output { command }
51
+ end
52
+ end
53
+
54
+ describe "when there are more than one services" do
55
+ let(:services) { [selected_service, build(:service), build(:service)] }
56
+
57
+ it "asks for the service" do
58
+ should_ask("What kind?", anything) { selected_service }
59
+ should_ask("Name?", anything) { selected_service.label }
60
+ should_ask("Which plan?", anything) { service_plan }
61
+ CFoundry::V2::ServiceInstance.any_instance.stub(:create!)
62
+
63
+ capture_output { command }
64
+ end
65
+ end
66
+
67
+ describe "when the service plan is specified by an object, not a string" do
68
+ let(:services) { [selected_service] }
69
+ let(:params) { {
70
+ :name => "my-service-name",
71
+ :offering => selected_service,
72
+ :plan => service_plan,
73
+ } }
74
+
75
+ it "creates the specified service" do
76
+ CFoundry::V2::ManagedServiceInstance.any_instance.should_receive(:service_plan=).with(service_plan)
77
+ CFoundry::V2::ManagedServiceInstance.any_instance.should_receive(:create!)
78
+ capture_output { command }
79
+ end
80
+ end
81
+
82
+ describe "when entering command line options" do
83
+ let(:service_plan) { build(:service_plan, :name => "f20") }
84
+ let(:params) { {
85
+ :name => "my-service-name",
86
+ :offering => selected_service,
87
+ :plan => "F20",
88
+ } }
89
+ let(:services) { [selected_service] }
90
+
91
+ it "uses case insensitive match" do
92
+ CFoundry::V2::ManagedServiceInstance.any_instance.should_receive(:service_plan=).with(service_plan)
93
+ CFoundry::V2::ManagedServiceInstance.any_instance.should_receive(:create!)
94
+ capture_output { command }
95
+ end
96
+ end
97
+
98
+ describe "when selecting the user-provided service" do
99
+ let(:services) { [build(:service), build(:service)] }
100
+ let(:user_provided_service) { build(:service, label: "user-provided")}
101
+
102
+ before do
103
+ client.stub(:services).and_return(services)
104
+ end
105
+
106
+ it "asks for an instance name and credentials" do
107
+ should_ask("What kind?", hash_including(choices: include(has_label("user-provided")))) { user_provided_service }
108
+ should_ask("Name?", anything) { "user-provided-service-name-1" }
109
+
110
+ should_ask("What credential parameters should applications use to connect to this service instance?\n(e.g. hostname, port, password)") { "host, port, user name" }
111
+ should_print("'user name' is not a valid key")
112
+ should_ask("What credential parameters should applications use to connect to this service instance?\n(e.g. hostname, port, password)") { "host, port" }
113
+ should_ask("host") { "example.com" }
114
+ should_ask("port") { "8080" }
115
+ mock_with_progress("Creating service user-provided-service-name-1")
116
+
117
+ instance = client.user_provided_service_instance
118
+ client.should_receive(:user_provided_service_instance).and_return(instance)
119
+ instance.should_receive(:create!)
120
+
121
+ capture_output { command }
122
+
123
+ instance.credentials['host'].should == 'example.com'
124
+ instance.credentials['port'].should == '8080'
125
+ end
126
+
127
+ # lame, i know
128
+ context "when invoked from another command" do
129
+ let(:params) { {
130
+ :credentials => {"k" => "v"},
131
+ :name => "service-name",
132
+ :offering => UPDummy.new,
133
+ } }
134
+
135
+ it "creates a user-provided service" do
136
+ instance = client.user_provided_service_instance
137
+ client.should_receive(:user_provided_service_instance).and_return(instance)
138
+ instance.should_receive(:create!)
139
+
140
+ Mothership.new.invoke(:create_service, params, {})
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::Service::Delete do
4
+ describe 'metadata' do
5
+ let(:command) { Mothership.commands[:delete_service] }
6
+
7
+ describe 'command' do
8
+ subject { command }
9
+ its(:description) { should eq "Delete a service" }
10
+ it { expect(Mothership::Help.group(:services, :manage)).to include(subject) }
11
+ end
12
+
13
+ include_examples 'inputs must have descriptions'
14
+
15
+ describe 'arguments' do
16
+ subject { command.arguments }
17
+ it 'has the correct argument order' do
18
+ should eq([{:type => :optional, :value => nil, :name => :service }])
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Service
5
+ describe "Help" do
6
+ let(:global) { {} }
7
+ let(:given) { {} }
8
+
9
+ subject do
10
+ capture_output { Mothership.new.invoke(:help, :command => "service") }
11
+ end
12
+
13
+ it "describes the command" do
14
+ subject
15
+ stdout.rewind
16
+ expect(stdout.readlines.first).to match /Show service 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,103 @@
1
+ require "spec_helper"
2
+
3
+ describe CF::Service::Rename do
4
+ let(:global) { { :color => false, :quiet => true } }
5
+ let(:inputs) { {} }
6
+ let(:given) { {} }
7
+ let(:client) { build(:client) }
8
+ let(:service) {}
9
+ let(:services) { [] }
10
+ let(:new_name) { "some-new-name" }
11
+
12
+ subject { Mothership.new.invoke(:rename_service, inputs, given, global) }
13
+
14
+ before do
15
+ CF::CLI.any_instance.stub(:client).and_return(client)
16
+ client.stub(:service_instances => services)
17
+ client.stub(:service_instances_by_name => services)
18
+ end
19
+
20
+ describe "metadata" do
21
+ let(:command) { Mothership.commands[:rename_service] }
22
+
23
+ describe "command" do
24
+ subject { command }
25
+ its(:description) { should eq "Rename a service" }
26
+ it { expect(Mothership::Help.group(:services, :manage)).to include(subject) }
27
+ end
28
+
29
+ include_examples "inputs must have descriptions"
30
+
31
+ describe "arguments" do
32
+ subject { command.arguments }
33
+ it "has the correct argument order" do
34
+ should eq([
35
+ { :type => :optional, :value => nil, :name => :service },
36
+ { :type => :optional, :value => nil, :name => :name }
37
+ ])
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when there are no services" do
43
+ context "and a service is given" do
44
+ let(:given) { { :service => "some-service" } }
45
+ it { expect { subject }.to raise_error(CF::UserError, "Unknown service 'some-service'.") }
46
+ end
47
+
48
+ context "and a service is not given" do
49
+ it { expect { subject }.to raise_error(CF::UserError, "No services.") }
50
+ end
51
+ end
52
+
53
+ context "when there are services" do
54
+ let(:services) { Array.new(2) { build(:managed_service_instance) } }
55
+ let(:renamed_service) { services.first }
56
+
57
+ context "when the defaults are used" do
58
+ it "asks for the service and new name and renames" do
59
+ should_ask("Rename which service?", anything) { renamed_service }
60
+ should_ask("New name") { new_name }
61
+ renamed_service.should_receive(:name=).with(new_name)
62
+ renamed_service.should_receive(:update!)
63
+ subject
64
+ end
65
+ end
66
+
67
+ context "when no name is provided, but a service is" do
68
+ let(:given) { { :service => renamed_service.name } }
69
+
70
+ it "asks for the new name and renames" do
71
+ dont_allow_ask("Rename which service?", anything)
72
+ should_ask("New name") { new_name }
73
+ renamed_service.should_receive(:name=).with(new_name)
74
+ renamed_service.should_receive(:update!)
75
+ subject
76
+ end
77
+ end
78
+
79
+ context "when a service is provided and a name" do
80
+ let(:inputs) { { :service => renamed_service, :name => new_name } }
81
+
82
+ it "renames the service" do
83
+ renamed_service.should_receive(:update!)
84
+ subject
85
+ end
86
+
87
+ it "displays the progress" do
88
+ mock_with_progress("Renaming to #{new_name}")
89
+ renamed_service.should_receive(:update!)
90
+
91
+ subject
92
+ end
93
+
94
+ context "and the name already exists" do
95
+ it "fails" do
96
+ renamed_service.should_receive(:update!) { raise CFoundry::ServiceInstanceNameTaken.new("Taken", 200) }
97
+ expect { subject }.to raise_error(CFoundry::ServiceInstanceNameTaken)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+