new_cfoundry 4.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (269) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +2 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +11 -0
  8. data/Checkfile +2 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE +987 -0
  11. data/NOTICE +10 -0
  12. data/README.md +9 -0
  13. data/Rakefile +14 -0
  14. data/VERSION +1 -0
  15. data/cfoundry.gemspec +40 -0
  16. data/config/locales/en.yml +168 -0
  17. data/lib/cc_api_stub/app_usage_events.rb +11 -0
  18. data/lib/cc_api_stub/applications.rb +57 -0
  19. data/lib/cc_api_stub/domains.rb +32 -0
  20. data/lib/cc_api_stub/events.rb +11 -0
  21. data/lib/cc_api_stub/frameworks.rb +22 -0
  22. data/lib/cc_api_stub/helper.rb +148 -0
  23. data/lib/cc_api_stub/login.rb +21 -0
  24. data/lib/cc_api_stub/organization_users.rb +27 -0
  25. data/lib/cc_api_stub/organizations.rb +82 -0
  26. data/lib/cc_api_stub/routes.rb +26 -0
  27. data/lib/cc_api_stub/runtimes.rb +22 -0
  28. data/lib/cc_api_stub/service_bindings.rb +22 -0
  29. data/lib/cc_api_stub/service_instances.rb +22 -0
  30. data/lib/cc_api_stub/services.rb +21 -0
  31. data/lib/cc_api_stub/space_users.rb +27 -0
  32. data/lib/cc_api_stub/spaces.rb +58 -0
  33. data/lib/cc_api_stub/users.rb +85 -0
  34. data/lib/cc_api_stub.rb +20 -0
  35. data/lib/cfoundry/auth_token.rb +63 -0
  36. data/lib/cfoundry/baseclient.rb +216 -0
  37. data/lib/cfoundry/chatty_hash.rb +46 -0
  38. data/lib/cfoundry/client.rb +42 -0
  39. data/lib/cfoundry/concerns/login_helpers.rb +14 -0
  40. data/lib/cfoundry/concerns/proxy_options.rb +17 -0
  41. data/lib/cfoundry/errors.rb +163 -0
  42. data/lib/cfoundry/rest_client.rb +317 -0
  43. data/lib/cfoundry/test_support.rb +3 -0
  44. data/lib/cfoundry/trace_helpers.rb +64 -0
  45. data/lib/cfoundry/uaaclient.rb +160 -0
  46. data/lib/cfoundry/upload_helpers.rb +222 -0
  47. data/lib/cfoundry/v2/app.rb +303 -0
  48. data/lib/cfoundry/v2/app_event.rb +13 -0
  49. data/lib/cfoundry/v2/app_instance.rb +74 -0
  50. data/lib/cfoundry/v2/app_usage_event.rb +14 -0
  51. data/lib/cfoundry/v2/base.rb +108 -0
  52. data/lib/cfoundry/v2/client.rb +104 -0
  53. data/lib/cfoundry/v2/domain.rb +20 -0
  54. data/lib/cfoundry/v2/event.rb +17 -0
  55. data/lib/cfoundry/v2/helper.rb +11 -0
  56. data/lib/cfoundry/v2/managed_service_instance.rb +12 -0
  57. data/lib/cfoundry/v2/model.rb +211 -0
  58. data/lib/cfoundry/v2/model_magic/attribute.rb +49 -0
  59. data/lib/cfoundry/v2/model_magic/client_extensions.rb +170 -0
  60. data/lib/cfoundry/v2/model_magic/has_summary.rb +49 -0
  61. data/lib/cfoundry/v2/model_magic/query_multi_value_helper.rb +21 -0
  62. data/lib/cfoundry/v2/model_magic/query_value_helper.rb +33 -0
  63. data/lib/cfoundry/v2/model_magic/queryable_by.rb +39 -0
  64. data/lib/cfoundry/v2/model_magic/to_many.rb +138 -0
  65. data/lib/cfoundry/v2/model_magic/to_one.rb +81 -0
  66. data/lib/cfoundry/v2/model_magic.rb +134 -0
  67. data/lib/cfoundry/v2/organization.rb +44 -0
  68. data/lib/cfoundry/v2/quota_definition.rb +12 -0
  69. data/lib/cfoundry/v2/route.rb +25 -0
  70. data/lib/cfoundry/v2/service.rb +22 -0
  71. data/lib/cfoundry/v2/service_auth_token.rb +9 -0
  72. data/lib/cfoundry/v2/service_binding.rb +10 -0
  73. data/lib/cfoundry/v2/service_broker.rb +12 -0
  74. data/lib/cfoundry/v2/service_instance.rb +14 -0
  75. data/lib/cfoundry/v2/service_plan.rb +16 -0
  76. data/lib/cfoundry/v2/space.rb +30 -0
  77. data/lib/cfoundry/v2/stack.rb +10 -0
  78. data/lib/cfoundry/v2/user.rb +93 -0
  79. data/lib/cfoundry/v2/user_provided_service_instance.rb +15 -0
  80. data/lib/cfoundry/validator.rb +41 -0
  81. data/lib/cfoundry/version.rb +4 -0
  82. data/lib/cfoundry/zip.rb +56 -0
  83. data/lib/cfoundry.rb +5 -0
  84. data/release_notes/release_1_5_3.md +177 -0
  85. data/release_notes/release_2.3.1.md +14 -0
  86. data/release_notes/release_2.3.3.md +38 -0
  87. data/release_notes/release_2.3.4.md +16 -0
  88. data/release_notes/release_2.3.5.md +14 -0
  89. data/release_notes/release_2.3.6.md +14 -0
  90. data/release_notes/release_2.3.6.rc1.md +29 -0
  91. data/release_notes/release_2.3.6.rc2.md +19 -0
  92. data/release_notes/release_2.3.7.rc1.md +14 -0
  93. data/release_notes/release_2.4.0.md +41 -0
  94. data/release_notes/release_2.4.1.rc1.md +58 -0
  95. data/release_notes/release_3.0.0.md +21 -0
  96. data/release_notes/release_3.0.1.md +16 -0
  97. data/release_notes/release_3.0.2.rc1.md +19 -0
  98. data/release_notes/release_4.0.0.md +19 -0
  99. data/release_notes/release_4.0.1.md +14 -0
  100. data/release_notes/release_4.0.2.rc1.md +14 -0
  101. data/release_notes/release_4.0.2.rc2.md +11 -0
  102. data/release_notes/release_4.0.2.rc3.md +11 -0
  103. data/release_notes/release_4.0.2.rc4.md +19 -0
  104. data/release_notes/release_4.0.2.rc5.md +14 -0
  105. data/release_notes/release_4.0.3.md +19 -0
  106. data/release_notes/release_4.0.4.rc1.md +14 -0
  107. data/release_notes/release_4.0.4.rc2.md +14 -0
  108. data/release_notes/release_4.1.0.md +19 -0
  109. data/release_notes/release_4.2.0.rc.md +24 -0
  110. data/release_notes/release_4.3.0.md +22 -0
  111. data/release_notes/release_4.3.1.md +14 -0
  112. data/release_notes/release_4.3.10.md +14 -0
  113. data/release_notes/release_4.3.11.md +14 -0
  114. data/release_notes/release_4.3.12.md +14 -0
  115. data/release_notes/release_4.3.2.rc1.md +21 -0
  116. data/release_notes/release_4.3.3.md +24 -0
  117. data/release_notes/release_4.3.4.md +11 -0
  118. data/release_notes/release_4.3.4.rc1.md +24 -0
  119. data/release_notes/release_4.3.5.md +36 -0
  120. data/release_notes/release_4.3.5.rc1.md +21 -0
  121. data/release_notes/release_4.3.6.md +14 -0
  122. data/release_notes/release_4.3.7.md +50 -0
  123. data/release_notes/release_4.3.8.md +19 -0
  124. data/release_notes/release_4.3.9.md +14 -0
  125. data/release_notes/release_4.4.0.md +16 -0
  126. data/release_notes/release_4.5.1.md +11 -0
  127. data/release_notes/release_4.5.2.md +14 -0
  128. data/release_notes/release_4.5.3.md +29 -0
  129. data/release_notes/release_4.6.0.md +24 -0
  130. data/release_notes/release_4.6.1.md +14 -0
  131. data/release_notes/release_4.6.2.md +16 -0
  132. data/release_notes/release_4.6.3.rc1.md +14 -0
  133. data/release_notes/release_4.6.3.rc2.md +14 -0
  134. data/release_notes/release_4.6.3.rc3.md +17 -0
  135. data/release_notes/release_4.7.0.md +11 -0
  136. data/release_notes/release_4.7.1.md +14 -0
  137. data/release_notes/release_4.7.1.rc.1.md +14 -0
  138. data/release_notes/release_4.7.1.rc1.md +19 -0
  139. data/script/gpp +3 -0
  140. data/spec/cc_api_stub/app_usage_events_spec.rb +12 -0
  141. data/spec/cc_api_stub/applications_spec.rb +69 -0
  142. data/spec/cc_api_stub/domains_spec.rb +40 -0
  143. data/spec/cc_api_stub/events_spec.rb +12 -0
  144. data/spec/cc_api_stub/frameworks_spec.rb +19 -0
  145. data/spec/cc_api_stub/login_spec.rb +20 -0
  146. data/spec/cc_api_stub/organization_users_spec.rb +35 -0
  147. data/spec/cc_api_stub/organizations_spec.rb +118 -0
  148. data/spec/cc_api_stub/routes_spec.rb +19 -0
  149. data/spec/cc_api_stub/runtimes_spec.rb +19 -0
  150. data/spec/cc_api_stub/service_bindings_spec.rb +13 -0
  151. data/spec/cc_api_stub/service_instances_spec.rb +19 -0
  152. data/spec/cc_api_stub/services_spec.rb +11 -0
  153. data/spec/cc_api_stub/space_users_spec.rb +35 -0
  154. data/spec/cc_api_stub/spaces_spec.rb +38 -0
  155. data/spec/cc_api_stub/users_spec.rb +107 -0
  156. data/spec/cfoundry/auth_token_spec.rb +154 -0
  157. data/spec/cfoundry/baseclient_spec.rb +298 -0
  158. data/spec/cfoundry/client_spec.rb +13 -0
  159. data/spec/cfoundry/errors_spec.rb +117 -0
  160. data/spec/cfoundry/rest_client_spec.rb +349 -0
  161. data/spec/cfoundry/trace_helpers_spec.rb +91 -0
  162. data/spec/cfoundry/uaaclient_spec.rb +435 -0
  163. data/spec/cfoundry/upload_helpers_spec.rb +182 -0
  164. data/spec/cfoundry/v2/app_event_spec.rb +97 -0
  165. data/spec/cfoundry/v2/app_instance_spec.rb +31 -0
  166. data/spec/cfoundry/v2/app_spec.rb +354 -0
  167. data/spec/cfoundry/v2/app_usage_event_spec.rb +15 -0
  168. data/spec/cfoundry/v2/base_spec.rb +375 -0
  169. data/spec/cfoundry/v2/client_spec.rb +121 -0
  170. data/spec/cfoundry/v2/domain_spec.rb +63 -0
  171. data/spec/cfoundry/v2/event_spec.rb +15 -0
  172. data/spec/cfoundry/v2/managed_service_instance_spec.rb +149 -0
  173. data/spec/cfoundry/v2/model_magic/attribute_spec.rb +123 -0
  174. data/spec/cfoundry/v2/model_magic/has_summary_spec.rb +17 -0
  175. data/spec/cfoundry/v2/model_magic/to_many_spec.rb +53 -0
  176. data/spec/cfoundry/v2/model_magic/to_one_spec.rb +106 -0
  177. data/spec/cfoundry/v2/model_magic_spec.rb +43 -0
  178. data/spec/cfoundry/v2/model_spec.rb +434 -0
  179. data/spec/cfoundry/v2/organization_spec.rb +135 -0
  180. data/spec/cfoundry/v2/quota_definition_spec.rb +50 -0
  181. data/spec/cfoundry/v2/route_spec.rb +42 -0
  182. data/spec/cfoundry/v2/service_plan_spec.rb +53 -0
  183. data/spec/cfoundry/v2/service_spec.rb +58 -0
  184. data/spec/cfoundry/v2/space_spec.rb +13 -0
  185. data/spec/cfoundry/v2/user_provided_service_instance_spec.rb +57 -0
  186. data/spec/cfoundry/v2/user_spec.rb +206 -0
  187. data/spec/cfoundry/validator_spec.rb +94 -0
  188. data/spec/factories/app_events_factory.rb +7 -0
  189. data/spec/factories/app_usage_events_factory.rb +32 -0
  190. data/spec/factories/apps_factory.rb +11 -0
  191. data/spec/factories/clients_factory.rb +7 -0
  192. data/spec/factories/domains_factory.rb +10 -0
  193. data/spec/factories/events_factory.rb +50 -0
  194. data/spec/factories/organizations_factory.rb +12 -0
  195. data/spec/factories/quota_definitions_factory.rb +8 -0
  196. data/spec/factories/routes_factory.rb +10 -0
  197. data/spec/factories/service_instances_factory.rb +10 -0
  198. data/spec/factories/service_plans_factory.rb +10 -0
  199. data/spec/factories/services_factory.rb +10 -0
  200. data/spec/factories/spaces_factory.rb +10 -0
  201. data/spec/factories/user_provided_service_instances_factory.rb +10 -0
  202. data/spec/factories/users_factory.rb +10 -0
  203. data/spec/fixtures/apps/with_cfignore/.cfignore +4 -0
  204. data/spec/fixtures/apps/with_cfignore/.hidden_file +1 -0
  205. data/spec/fixtures/apps/with_cfignore/ambiguous_ignored +0 -0
  206. data/spec/fixtures/apps/with_cfignore/ignored_dir/file_in_ignored_dir.txt +1 -0
  207. data/spec/fixtures/apps/with_cfignore/ignored_file.txt +1 -0
  208. data/spec/fixtures/apps/with_cfignore/non_ignored_dir/file_in_non_ignored_dir.txt +1 -0
  209. data/spec/fixtures/apps/with_cfignore/non_ignored_dir/ignored_file.txt +1 -0
  210. data/spec/fixtures/apps/with_cfignore/non_ignored_dir/toplevel_ignored.txt +0 -0
  211. data/spec/fixtures/apps/with_cfignore/non_ignored_file.txt +1 -0
  212. data/spec/fixtures/apps/with_cfignore/toplevel_ignored.txt +0 -0
  213. data/spec/fixtures/apps/with_dotfiles/.dotfile +1 -0
  214. data/spec/fixtures/apps/with_dotfiles/xyz +1 -0
  215. data/spec/fixtures/apps/with_external_symlink/foo +1 -0
  216. data/spec/fixtures/apps/with_ignored_external_symlink/.cfignore +1 -0
  217. data/spec/fixtures/apps/with_ignored_external_symlink/foo +1 -0
  218. data/spec/fixtures/apps/with_nested_directories/foo/bar/baz/fizz +0 -0
  219. data/spec/fixtures/apps/with_nested_directories/xyz +0 -0
  220. data/spec/fixtures/empty_file +0 -0
  221. data/spec/fixtures/fake_cc_app_usage_events.json +152 -0
  222. data/spec/fixtures/fake_cc_application.json +20 -0
  223. data/spec/fixtures/fake_cc_application_summary.json +56 -0
  224. data/spec/fixtures/fake_cc_created_application.json +11 -0
  225. data/spec/fixtures/fake_cc_created_domain.json +15 -0
  226. data/spec/fixtures/fake_cc_created_organization.json +11 -0
  227. data/spec/fixtures/fake_cc_created_route.json +13 -0
  228. data/spec/fixtures/fake_cc_created_service_instance.json +11 -0
  229. data/spec/fixtures/fake_cc_created_space.json +11 -0
  230. data/spec/fixtures/fake_cc_created_user.json +11 -0
  231. data/spec/fixtures/fake_cc_domain.json +55 -0
  232. data/spec/fixtures/fake_cc_domain_spaces.json +27 -0
  233. data/spec/fixtures/fake_cc_empty_search.json +7 -0
  234. data/spec/fixtures/fake_cc_events.json +419 -0
  235. data/spec/fixtures/fake_cc_frameworks.json +20 -0
  236. data/spec/fixtures/fake_cc_managed_service_instance.json +83 -0
  237. data/spec/fixtures/fake_cc_organization.json +161 -0
  238. data/spec/fixtures/fake_cc_organization_domains.json +59 -0
  239. data/spec/fixtures/fake_cc_organization_search.json +37 -0
  240. data/spec/fixtures/fake_cc_organization_spaces.json +99 -0
  241. data/spec/fixtures/fake_cc_organization_summary.json +20 -0
  242. data/spec/fixtures/fake_cc_organization_users.json +81 -0
  243. data/spec/fixtures/fake_cc_route.json +16 -0
  244. data/spec/fixtures/fake_cc_runtimes.json +20 -0
  245. data/spec/fixtures/fake_cc_service_binding.json +22 -0
  246. data/spec/fixtures/fake_cc_service_bindings.json +24 -0
  247. data/spec/fixtures/fake_cc_service_instance.json +83 -0
  248. data/spec/fixtures/fake_cc_service_instances.json +72 -0
  249. data/spec/fixtures/fake_cc_services.json +160 -0
  250. data/spec/fixtures/fake_cc_space.json +45 -0
  251. data/spec/fixtures/fake_cc_space_apps.json +49 -0
  252. data/spec/fixtures/fake_cc_space_summary.json +84 -0
  253. data/spec/fixtures/fake_cc_spaces.json +92 -0
  254. data/spec/fixtures/fake_cc_stats.json +29 -0
  255. data/spec/fixtures/fake_cc_user.json +139 -0
  256. data/spec/fixtures/fake_cc_user_organizations.json +92 -0
  257. data/spec/fixtures/fake_cc_user_provided_service_instance.json +51 -0
  258. data/spec/fixtures/fake_cc_user_with_managers.json +85 -0
  259. data/spec/integration/client_spec.rb +38 -0
  260. data/spec/spec_helper.rb +22 -0
  261. data/spec/support/factory_girl.rb +6 -0
  262. data/spec/support/shared_examples/cc_api_stub_request_examples.rb +79 -0
  263. data/spec/support/shared_examples/client_login_examples.rb +46 -0
  264. data/spec/support/shared_examples/model_summary_examples.rb +34 -0
  265. data/spec/support/test_model_builder.rb +10 -0
  266. data/vendor/errors/README.md +4 -0
  267. data/vendor/errors/v1.yml +189 -0
  268. data/vendor/errors/v2.yml +384 -0
  269. metadata +693 -0
@@ -0,0 +1,97 @@
1
+ require "spec_helper"
2
+
3
+ module CFoundry
4
+ module V2
5
+ describe AppEvent do
6
+ let(:app) { build(:app) }
7
+ let(:app_event) { build(:app_event, :app => app) }
8
+
9
+ it "has an app" do
10
+ expect(app_event.app).to eq(app)
11
+ end
12
+
13
+ describe "#instance_guid" do
14
+ it "has an instance guid" do
15
+ app_event.instance_guid = "foo"
16
+ expect(app_event.instance_guid).to eq("foo")
17
+ end
18
+
19
+ context "when an invalid value is assigned" do
20
+ it "raises a Mismatch exception" do
21
+ expect {
22
+ app_event.instance_guid = 123
23
+ }.to raise_error(Mismatch)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "#instance_index" do
29
+ it "has an instance index" do
30
+ app_event.instance_index = 123
31
+ expect(app_event.instance_index).to eq(123)
32
+ end
33
+
34
+ context "when an invalid value is assigned" do
35
+ it "raises a Mismatch exception" do
36
+ expect {
37
+ app_event.instance_index = "wrong"
38
+ }.to raise_error(Mismatch)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "#exit_status" do
44
+ it "has an instance index" do
45
+ app_event.exit_status = 123
46
+ expect(app_event.exit_status).to eq(123)
47
+ end
48
+
49
+ context "when an invalid value is assigned" do
50
+ it "raises a Mismatch exception" do
51
+ expect {
52
+ app_event.exit_status = "wrong"
53
+ }.to raise_error(Mismatch)
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "#exit_description" do
59
+ before do
60
+ stub_request(:get, /v2\/app_events\/.*/).to_return(:body => {:entity => {}}.to_json)
61
+ end
62
+
63
+ it "defaults to an empty string" do
64
+ expect(app_event.exit_description).to eq("")
65
+ end
66
+
67
+ it "has an instance guid" do
68
+ app_event.exit_description = "foo"
69
+ expect(app_event.exit_description).to eq("foo")
70
+ end
71
+
72
+ context "when an invalid value is assigned" do
73
+ it "raises a Mismatch exception" do
74
+ expect {
75
+ app_event.exit_description = 123
76
+ }.to raise_error(Mismatch)
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "#timestamp" do
82
+ it "has a timestamp" do
83
+ app_event.timestamp = "2013-04-23 12:43:23 +0000"
84
+ expect(app_event.timestamp).to eq("2013-04-23 12:43:23 +0000")
85
+ end
86
+
87
+ context "when an invalid value is assigned" do
88
+ it "raises a Mismatch exception" do
89
+ expect {
90
+ app_event.timestamp = 42
91
+ }.to raise_error(Mismatch)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module CFoundry::V2
4
+ describe AppInstance do
5
+ let(:client) { double }
6
+ let(:guid) { 'a snowflake' }
7
+ let(:name) { 'test-app' }
8
+ let(:instance_json) {
9
+ {
10
+ :state => "RUNNING",
11
+ :since => 1383588787.1809542,
12
+ :debug_ip => nil,
13
+ :debug_port => nil,
14
+ :console_ip => nil,
15
+ :console_port => nil
16
+ }
17
+ }
18
+ describe '.for_app' do
19
+ before do
20
+ instances_json = {:"0" => instance_json}
21
+ client.stub_chain(:base, :instances).and_return instances_json
22
+ end
23
+
24
+ it 'returns instances' do
25
+ instances = AppInstance.for_app(name, guid, client)
26
+ expect(instances.count).to eq 1
27
+ expect(instances.first.inspect).to eq "#<App::Instance '#{name}' \#0>"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,354 @@
1
+ require "spec_helper"
2
+
3
+ module CFoundry
4
+ module V2
5
+ describe App do
6
+ let(:client) { build(:client) }
7
+
8
+ subject { build(:app, :client => client, :name => 'foo-app') }
9
+
10
+ describe "#events" do
11
+ let(:events) { [build(:app_event)] }
12
+
13
+ it "has events" do
14
+ subject.events = events
15
+ expect(subject.events).to eq(events)
16
+ end
17
+
18
+ context "when an invalid value is assigned" do
19
+ it "raises a Mismatch exception" do
20
+ expect {
21
+ subject.events = [build(:organization)]
22
+ }.to raise_error(CFoundry::Mismatch)
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "environment" do
28
+ let(:app) { build(:app, :env => {"FOO" => "1"}) }
29
+
30
+ it "returns a hash-like object" do
31
+ expect(app.env["FOO"]).to eq "1"
32
+ end
33
+
34
+ describe "converting keys and values to strings" do
35
+ let(:app) { build(:app, :env => {:FOO => 1}) }
36
+
37
+ it "converts keys and values to strings" do
38
+ expect(app.env.to_hash).to eq("FOO" => "1")
39
+ end
40
+ end
41
+
42
+ context "when changes are made to the hash-like object" do
43
+ it "reflects the changes in .env" do
44
+ expect {
45
+ app.env["BAR"] = "2"
46
+ }.to change { app.env.to_hash }.from("FOO" => "1").to("FOO" => "1", "BAR" => "2")
47
+ end
48
+ end
49
+
50
+ context "when the env is set to something else" do
51
+ it "reflects the changes in .env" do
52
+ expect {
53
+ app.env = {"BAR" => "2"}
54
+ }.to change { app.env.to_hash }.from("FOO" => "1").to("BAR" => "2")
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "#summarize!" do
60
+ let(:app) { build(:app) }
61
+
62
+ it "assigns :instances as #total_instances" do
63
+ allow(app).to receive(:summary) { {:instances => 4} }
64
+
65
+ app.summarize!
66
+
67
+ expect(app.total_instances).to eq(4)
68
+ end
69
+ end
70
+
71
+ shared_examples_for "something may stage the app" do
72
+ subject { build(:app, :client => client) }
73
+ let(:response) { {:body => '{ "foo": "bar" }'} }
74
+
75
+ before do
76
+ allow(client.base).to receive(:put).with("v2", "apps", subject.guid, anything) do
77
+ response
78
+ end
79
+ end
80
+
81
+ it "sends the PUT request" do
82
+ expect(client.base).to receive(:put).with(
83
+ "v2", "apps", subject.guid,
84
+ hash_including(
85
+ :return_response => true)) do
86
+ response
87
+ end
88
+
89
+ update
90
+ end
91
+
92
+ context "and a block is given" do
93
+ let(:response) do
94
+ { :headers => { "x-app-staging-log" => "http://app/staging/log" },
95
+ :body => "{}"
96
+ }
97
+ end
98
+
99
+ it "yields the URL for the logs" do
100
+ yielded_url = nil
101
+ update do |url|
102
+ yielded_url = url
103
+ end
104
+
105
+ expect(yielded_url).to eq "http://app/staging/log"
106
+ end
107
+
108
+ context "and no staging header is returned" do
109
+ let(:response) do
110
+ { :headers => {},
111
+ :body => "{}"
112
+ }
113
+ end
114
+
115
+ it "yields nil" do
116
+ yielded_url = :something
117
+ update do |url|
118
+ yielded_url = url
119
+ end
120
+
121
+ expect(yielded_url).to be_nil
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ describe "#start!" do
128
+ it_should_behave_like "something may stage the app" do
129
+ def update(&blk)
130
+ subject.start!(&blk)
131
+ end
132
+ end
133
+ end
134
+
135
+ describe "#restart!" do
136
+ it_should_behave_like "something may stage the app" do
137
+ def update(&blk)
138
+ subject.restart!(&blk)
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "#update!" do
144
+ describe "changes" do
145
+ subject { build(:app, :client => client) }
146
+ let(:response) { {:body => {"foo" => "bar"}.to_json} }
147
+
148
+ before do
149
+ allow(client.base).to receive(:put).with("v2", "apps", subject.guid, anything) do
150
+ response
151
+ end
152
+ end
153
+
154
+ it "applies the changes from the response JSON" do
155
+ expect {
156
+ subject.update!
157
+ }.to change { subject.manifest }.to(:foo => "bar")
158
+ end
159
+ end
160
+
161
+ it_should_behave_like "something may stage the app" do
162
+ def update(&blk)
163
+ subject.update!(&blk)
164
+ end
165
+ end
166
+ end
167
+
168
+ describe "#stream_update_log" do
169
+ let(:base_url) { "http://example.com/log" }
170
+
171
+ def mock_log(url = anything)
172
+ expect(client).to receive(:stream_url).with(url) { |_, &blk|
173
+ blk.call(yield)
174
+ }.ordered
175
+ end
176
+
177
+ def stub_log(url = anything)
178
+ allow(client).to receive(:stream_url).with(url) do |_, blk|
179
+ blk.call(yield)
180
+ end.ordered
181
+ end
182
+
183
+ it "yields chunks from the response to the block" do
184
+ mock_log { "a" }
185
+ mock_log { "b" }
186
+ mock_log { raise CFoundry::NotFound }
187
+
188
+ chunks = []
189
+ subject.stream_update_log(base_url) do |chunk|
190
+ chunks << chunk
191
+ end
192
+
193
+ expect(chunks).to eq(%w(a b))
194
+ end
195
+
196
+ it "retries when the connection times out" do
197
+ mock_log { raise ::Timeout::Error }
198
+ mock_log { "a" }
199
+ mock_log { raise ::Timeout::Error }
200
+ mock_log { "b" }
201
+ mock_log { raise ::Timeout::Error }
202
+ mock_log { raise CFoundry::NotFound }
203
+
204
+ chunks = []
205
+ subject.stream_update_log(base_url) do |chunk|
206
+ chunks << chunk
207
+ end
208
+
209
+ expect(chunks).to eq(%w(a b))
210
+ end
211
+
212
+ it "tracks the offset to stream from" do
213
+ url = "#{base_url}&tail&tail_offset="
214
+
215
+ mock_log("#{url}0") { "a" }
216
+ mock_log("#{url}1") { raise ::Timeout::Error }
217
+ mock_log("#{url}1") { "b" }
218
+ mock_log("#{url}2") { raise CFoundry::NotFound }
219
+
220
+ chunks = []
221
+ subject.stream_update_log(base_url) do |chunk|
222
+ chunks << chunk
223
+ end
224
+
225
+ expect(chunks).to eq(%w(a b))
226
+ end
227
+
228
+ it "stops when the endpoint disappears" do
229
+ mock_log { "a" }
230
+ mock_log { "b" }
231
+ mock_log { raise CFoundry::NotFound }
232
+ stub_log { "c" }
233
+
234
+ chunks = []
235
+ subject.stream_update_log(base_url) do |chunk|
236
+ chunks << chunk
237
+ end
238
+
239
+ expect(chunks).to eq(%w(a b))
240
+ end
241
+ end
242
+
243
+ describe "delete!" do
244
+ it "defaults to recursive" do
245
+ expect(client.base).to receive(:delete).with("v2", :apps, subject.guid, {:params => {:recursive => true}})
246
+
247
+ subject.delete!
248
+ end
249
+ end
250
+
251
+ it "accepts and ignores an options hash" do
252
+ expect(client.base).to receive(:delete).with("v2", :apps, subject.guid, {:params => {:recursive => true}})
253
+
254
+ subject.delete!(:recursive => false)
255
+ end
256
+
257
+ describe "#health" do
258
+ describe "when staging failed for an app" do
259
+ it "returns 'STAGING FAILED' as state" do
260
+ allow(AppInstance).to receive(:for_app) { raise CFoundry::StagingError }
261
+ allow(subject).to receive(:state) { "STARTED" }
262
+
263
+ expect(subject.health).to eq("STAGING FAILED")
264
+ end
265
+ end
266
+ end
267
+
268
+ describe "#percent_running" do
269
+ before do
270
+ allow(subject).to receive(:state) { "STARTED" }
271
+ subject.total_instances = instances.count
272
+ allow(AppInstance).to receive(:for_app).with(subject.name, subject.guid, client) { instances }
273
+ end
274
+
275
+ let(:instances) do
276
+ (1..3).map { double(AppInstance, state: "RUNNING") }
277
+ end
278
+
279
+ it "returns the percent of instances running as an integer" do
280
+ expect(subject.percent_running).to eq(100)
281
+ end
282
+
283
+ context "when half the instances are running" do
284
+ let(:instances) { [double(AppInstance, state: "RUNNING"), double(AppInstance, state: "STOPPED")] }
285
+
286
+ it "returns 50" do
287
+ expect(subject.percent_running).to eq(50)
288
+ end
289
+ end
290
+
291
+ context "when staging has failed" do
292
+ before { allow(AppInstance).to receive(:for_app) { raise CFoundry::StagingError } }
293
+
294
+ it "returns 0" do
295
+ expect(subject.percent_running).to eq(0)
296
+ end
297
+ end
298
+ end
299
+
300
+ describe "#host" do
301
+ let(:route) { build(:route, :host => "my-host") }
302
+ let(:app) { build(:app) }
303
+
304
+ context "when at least one route exists" do
305
+ it "returns the host that the user has specified" do
306
+ allow(app).to receive(:routes).and_return([route])
307
+ expect(app.host).to eq("my-host")
308
+ end
309
+ end
310
+
311
+ context "when no routes exists" do
312
+ it "returns the host that the user has specified" do
313
+ allow(app).to receive(:routes).and_return([])
314
+ expect(app.host).to be_nil
315
+ end
316
+ end
317
+ end
318
+
319
+ describe "#domain" do
320
+ let(:domain) { build(:domain, :name => "my-domain") }
321
+ let(:route) { build(:route, :domain => domain) }
322
+ let(:app) { build(:app) }
323
+
324
+ context "when at least one route exists" do
325
+ it "returns the domain that the user has specified" do
326
+ allow(app).to receive(:routes).and_return([route])
327
+ expect(app.domain).to eq("my-domain")
328
+ end
329
+ end
330
+
331
+ context "when no routes exists" do
332
+ it "returns the domain that the user has specified" do
333
+ allow(app).to receive(:routes).and_return([])
334
+ expect(app.domain).to be_nil
335
+ end
336
+ end
337
+ end
338
+
339
+ describe "#uri" do
340
+ context "when there are one or more routes" do
341
+ let(:domain) { build(:domain, :name => "example.com") }
342
+ let(:route) { build(:route, :host => "my-host", :domain => domain) }
343
+ let(:other_route) { build(:route, :host => "other-host", :domain => domain) }
344
+ let(:app) { build(:app) }
345
+
346
+ it "return the first one" do
347
+ allow(app).to receive(:routes).and_return([route, other_route])
348
+ expect(app.uri).to eq("#{route.host}.#{route.domain.name}")
349
+ end
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ module CFoundry
4
+ module V2
5
+ describe AppUsageEvent do
6
+ let(:app_usage_event) { build(:app_usage_event, state: 'STOPPED') }
7
+
8
+ describe "#state" do
9
+ it "returns the state" do
10
+ expect(app_usage_event.state).to eq('STOPPED')
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end