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,123 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module Start
5
+ describe Target do
6
+ before do
7
+ stub_client_and_precondition
8
+ end
9
+
10
+ let(:client) { build(:client).tap {|client| client.stub(:apps => [app]) } }
11
+ let(:app) { build(:app) }
12
+
13
+ describe "metadata" do
14
+ let(:command) { Mothership.commands[:target] }
15
+
16
+ describe "command" do
17
+ subject { command }
18
+ its(:description) { should eq "Set or display the target cloud, organization, and space" }
19
+ specify { expect(Mothership::Help.group(:start)).to include(subject) }
20
+ end
21
+
22
+ include_examples "inputs must have descriptions"
23
+
24
+ describe "flags" do
25
+ subject { command.flags }
26
+
27
+ its(["-o"]) { should eq :organization }
28
+ its(["--org"]) { should eq :organization }
29
+ its(["-s"]) { should eq :space }
30
+ end
31
+
32
+ describe "arguments" do
33
+ subject(:arguments) { command.arguments }
34
+ it "have the correct commands" do
35
+ expect(arguments).to eq [{:type => :optional, :value => nil, :name => :url}]
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "running the command" do
41
+ stub_home_dir_with { "#{SPEC_ROOT}/fixtures/fake_home_dirs/new" }
42
+
43
+ context "when the user is authenticated and has an organization" do
44
+ let(:user) { build(:user).tap{ |u| u.stub(:email => "user@example.com") } }
45
+ let(:organization) { build(:organization, :name => "My Org", :guid => "organization-id-1", :users => [user], :spaces => [space]) }
46
+ let(:space) { build(:space, :name => "Staging", :guid => "space-id-2", :developers => [user]) }
47
+
48
+ before do
49
+ client.stub(:logged_in?) { true }
50
+ client.stub(:organizations) { [organization] }
51
+ client.stub(:current_user) { user }
52
+ client.stub(:organization) { organization }
53
+ client.stub(:current_organization) { organization }
54
+ described_class.any_instance.stub(:client) { client }
55
+ end
56
+
57
+ describe "switching the target" do
58
+ let(:target) { "some-valid-target.com" }
59
+ subject { cf ["target", target] }
60
+
61
+ context "when the target is not valid" do
62
+ before { WebMock.stub_request(:get, "https://#{target}/info").to_return(:body => "{}") }
63
+
64
+ it "should still be able to switch to a valid target after that" do
65
+ subject
66
+ end
67
+ end
68
+
69
+ context "when the target is valid but the connection is refused" do
70
+ it "shows a pretty error message" do
71
+ CFoundry::V2::Client.any_instance.stub(:info) { raise CFoundry::TargetRefused, "foo" }
72
+
73
+ subject
74
+ expect(error_output).to say("Target refused connection.")
75
+ end
76
+ end
77
+
78
+ context "when the uri is malformed" do
79
+ it "shows a pretty error message" do
80
+ CFoundry::V2::Client.any_instance.stub(:info) { raise CFoundry::InvalidTarget.new(target) }
81
+
82
+ subject
83
+ expect(error_output).to say("Invalid target URI.")
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "switching the space" do
89
+ def run_command
90
+ cf %W[target -s #{space.name}]
91
+ end
92
+
93
+ it "calls use a PopulateTarget to ensure that an organization and space is set" do
94
+ CF::Populators::Target.should_receive(:new) { double(:target, :populate_and_save! => true) }
95
+ run_command
96
+ end
97
+
98
+ it "prints out the space from the updated client" do
99
+ CF::Populators::Target.any_instance.stub(:populate_and_save!) { true }
100
+ client.stub(:current_space) { space }
101
+
102
+ run_command
103
+ expect(output).to say("space: #{space.name}")
104
+ end
105
+ end
106
+
107
+ describe "displaying the target (no args)" do
108
+ it "prints things nicely" do
109
+ client.stub(:current_space) { space }
110
+ cf %W{target}
111
+ expect(output).to say(<<-STR)
112
+ Target Information (where will apps be pushed):
113
+ CF instance: #{client.target} (API version: 2)
114
+ user: #{user.email}
115
+ target app space: #{space.name} (org: #{organization.name})
116
+ STR
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,98 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module User
5
+ describe Create do
6
+ describe "metadata" do
7
+ let(:command) { Mothership.commands[:create_user] }
8
+
9
+ describe "command" do
10
+ subject { command }
11
+ its(:description) { should eq "Create a user" }
12
+ it { expect(Mothership::Help.group(:admin, :user)).to include(subject) }
13
+ end
14
+
15
+ include_examples "inputs must have descriptions"
16
+
17
+ describe "arguments" do
18
+ subject { command.arguments }
19
+ it "has the correct argument order" do
20
+ should eq([
21
+ {:type => :optional, :value => nil, :name => :email}
22
+ ])
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "running the command" do
28
+ let(:client) { build(:client) }
29
+ let(:org) { build(:organization) }
30
+ let(:user) { build(:user) }
31
+
32
+ before do
33
+ stub_client
34
+ client.stub(:register)
35
+ end
36
+
37
+ subject { cf %W[create-user --#{bool_flag(:force)}] }
38
+
39
+ context "when the user is not logged in" do
40
+ let(:force) { true }
41
+
42
+ before do
43
+ client.stub(:logged_in?) { false }
44
+ end
45
+
46
+ it "tells the user to log in" do
47
+ subject
48
+ expect(stderr.string).to include("Please log in")
49
+ end
50
+ end
51
+
52
+ context "when the user is logged in" do
53
+ let(:force) { false }
54
+ let(:confirmation) { "password1" }
55
+
56
+ before do
57
+ client.stub(:logged_in?) { true }
58
+ stub_ask("Email") { "some-angry-dude@example.com" }
59
+ stub_ask("Password", anything) { "password1" }
60
+ stub_ask("Verify Password", anything) { confirmation }
61
+
62
+ CF::Populators::Organization.stub(:new) { double(:organization, :populate_and_save! => org) }
63
+ client.stub(:register).with("some-angry-dude@example.com", "password1") { user }
64
+ user.stub(:update!)
65
+ end
66
+
67
+ context "when the password does not match its confirmation" do
68
+ let(:confirmation) { "wrong" }
69
+
70
+ it "displays an error message" do
71
+ subject
72
+ expect(stderr.string).to include("Passwords don't match")
73
+ end
74
+ end
75
+
76
+ context "when the password matches its confirmation" do
77
+ it "creates a user" do
78
+ client.should_receive(:register).with("some-angry-dude@example.com", "password1") { user }
79
+ user.stub(:update!)
80
+ subject
81
+ end
82
+
83
+ it "adds the user to the current org" do
84
+ client.stub(:register).and_return(user)
85
+ user.should_receive(:update!)
86
+
87
+ subject
88
+
89
+ user.organizations.should == [org]
90
+ user.managed_organizations.should == [org]
91
+ user.audited_organizations.should == [org]
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ module CF
4
+ module User
5
+ describe "Help" do
6
+ let(:global) { {} }
7
+ let(:given) { {} }
8
+
9
+ subject do
10
+ capture_output { Mothership.new.invoke(:help, :command => "users") }
11
+ end
12
+
13
+ it "describes the command" do
14
+ subject
15
+ stdout.rewind
16
+ expect(stdout.readlines.first).to match /List all users/
17
+ end
18
+
19
+ context "when the user is not logged in" do
20
+ before do
21
+ capture_output { Mothership.new.invoke(:logout) }
22
+ end
23
+
24
+ it "does not require login" do
25
+ subject
26
+ stdout.rewind
27
+ expect(stdout.readlines.first).to_not match /Please log in first to proceed/
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,94 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module User
5
+ describe Passwd do
6
+ describe "metadata" do
7
+ let(:command) { Mothership.commands[:passwd] }
8
+
9
+ describe "command" do
10
+ subject { command }
11
+ its(:description) { should eq "Update the current user's password" }
12
+ it { expect(Mothership::Help.group(:admin, :user)).to include(subject) }
13
+ end
14
+
15
+ include_examples "inputs must have descriptions"
16
+ end
17
+
18
+ describe "#passwd" do
19
+ let(:client) { build(:client) }
20
+ let(:old_password) { "old" }
21
+ let(:new_password) { "password" }
22
+ let(:verify_password) { new_password }
23
+ let(:score) { :strong }
24
+ let(:guid) { random_string("my-object-guid") }
25
+ let(:user) { build(:user) }
26
+
27
+ before do
28
+ stub_client_and_precondition
29
+ client.stub(:logged_in?) { true }
30
+ client.stub(:current_user) { user }
31
+ client.stub(:register)
32
+ client.base.stub(:password_score).with(new_password).and_return(score)
33
+ end
34
+
35
+ subject { cf %W[passwd --password #{old_password} --new-password #{new_password} --verify #{verify_password} --no-force --debug] }
36
+
37
+ context "when the passwords dont match" do
38
+ let(:verify_password) { "other_password" }
39
+
40
+ it { should eq 1 }
41
+
42
+ it "fails" do
43
+ subject
44
+ expect(stderr.string).to include "Passwords do not match."
45
+ end
46
+
47
+ it "doesn't print out the score" do
48
+ subject
49
+ expect(stdout.string).not_to include "strength"
50
+ end
51
+
52
+ it "doesn't log in or register" do
53
+ user.should_not_receive(:change_password!)
54
+ subject
55
+ end
56
+ end
57
+
58
+ context "when the password is good or strong" do
59
+ before do
60
+ user.stub(:change_password!)
61
+ end
62
+
63
+ it { should eq 0 }
64
+
65
+ it "prints out the password score" do
66
+ subject
67
+ expect(stdout.string).to include "Your password strength is: strong"
68
+ end
69
+
70
+ it "changes the password" do
71
+ user.should_receive(:change_password!).with(new_password, old_password)
72
+ subject
73
+ end
74
+ end
75
+
76
+ context "when the password is weak" do
77
+ let(:score) { :weak }
78
+
79
+ it { should eq 1 }
80
+
81
+ it "prints out the password score" do
82
+ subject
83
+ expect(stderr.string).to include "Your password strength is: weak"
84
+ end
85
+
86
+ it "doesn't change the password" do
87
+ user.should_not_receive(:change_password!)
88
+ subject
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,145 @@
1
+ require "spec_helper"
2
+
3
+ module CF
4
+ module User
5
+ describe Register 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[:register] }
14
+
15
+ describe "command" do
16
+ subject { command }
17
+ its(:description) { should eq "Create a user and log in" }
18
+ it { expect(Mothership::Help.group(:admin, :user)).to include(subject) }
19
+ end
20
+
21
+ include_examples "inputs must have descriptions"
22
+
23
+ describe "arguments" do
24
+ subject { command.arguments }
25
+ it "have the correct commands" do
26
+ should eq [
27
+ {:type => :optional, :value => nil, :name => :email}
28
+ ]
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#register" do
34
+ let(:email) { "a@b.com" }
35
+ let(:password) { "password" }
36
+ let(:verify_password) { password }
37
+ let(:force) { false }
38
+ let(:login) { false }
39
+ let(:score) { :strong }
40
+
41
+ before do
42
+ client.stub(:register)
43
+ client.base.stub(:password_score) { score }
44
+ end
45
+
46
+ subject { cf %W[register --email #{email} --password #{password} --verify #{verify_password} --#{bool_flag(:login)} --#{bool_flag(:force)}] }
47
+
48
+ context "when the passwords dont match" do
49
+ let(:verify_password) { "other_password" }
50
+
51
+ it { should eq 1 }
52
+
53
+ it "fails" do
54
+ subject
55
+ expect(error_output).to say("Passwords do not match.")
56
+ end
57
+
58
+ it "doesn't print out the score" do
59
+ subject
60
+ expect(output).to_not say("strength")
61
+ end
62
+
63
+ it "doesn't log in or register" do
64
+ client.should_not_receive(:register)
65
+ dont_allow_invoke
66
+ subject
67
+ end
68
+
69
+ context "and the force flag is passed" do
70
+ let(:force) { true }
71
+
72
+ it "doesn't verify the password" do
73
+ client.should_receive(:register).with(email, password)
74
+ subject
75
+ expect(error_output).to_not say("Passwords do not match.")
76
+ end
77
+ end
78
+ end
79
+
80
+ context "when the password is good or strong" do
81
+ it { should eq 0 }
82
+
83
+ it "prints out the password score" do
84
+ subject
85
+ expect(stdout.string).to include "Your password strength is: strong"
86
+ end
87
+
88
+ it "registers the user" do
89
+ client.should_receive(:register).with(email, password)
90
+ subject
91
+ end
92
+
93
+ context "and the login flag is true" do
94
+ let(:login) { true }
95
+
96
+ it "logs in" do
97
+ described_class.any_instance.should_receive(:invoke).with(:login, :username => email, :password => password)
98
+ subject
99
+ end
100
+ end
101
+
102
+ context "and the login flag is false" do
103
+ it "doesn't log in" do
104
+ described_class.any_instance.should_not_receive(:invoke)
105
+ subject
106
+ end
107
+ end
108
+ end
109
+
110
+ context "when the password is weak" do
111
+ let(:score) { :weak }
112
+ let(:login) { true }
113
+
114
+ it { should eq 1 }
115
+
116
+ it "prints out the password score" do
117
+ subject
118
+ expect(error_output).to say("Your password strength is: weak")
119
+ end
120
+
121
+ it "doesn't register" do
122
+ client.should_not_receive(:register).with(email, password)
123
+ subject
124
+ end
125
+
126
+ it "doesn't log in" do
127
+ dont_allow_invoke :login
128
+ subject
129
+ end
130
+ end
131
+
132
+ context "when arguments are not passed in the command line" do
133
+ subject { cf %W[register --no-force --no-login] }
134
+
135
+ it "asks for the email, password and confirm password" do
136
+ should_ask("Email") { email }
137
+ should_ask("Password", anything) { password }
138
+ should_ask("Confirm Password", anything) { verify_password }
139
+ subject
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end