ncfoundry 4.9.2

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 (268) 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 +41 -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 +62 -0
  36. data/lib/cfoundry/baseclient.rb +220 -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 +14 -0
  41. data/lib/cfoundry/errors.rb +163 -0
  42. data/lib/cfoundry/rest_client.rb +316 -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 +151 -0
  46. data/lib/cfoundry/upload_helpers.rb +222 -0
  47. data/lib/cfoundry/v2/app.rb +313 -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 +112 -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 +13 -0
  57. data/lib/cfoundry/v2/model.rb +213 -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 +145 -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 +31 -0
  77. data/lib/cfoundry/v2/stack.rb +10 -0
  78. data/lib/cfoundry/v2/user.rb +97 -0
  79. data/lib/cfoundry/v2/user_provided_service_instance.rb +16 -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 +6 -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 +153 -0
  157. data/spec/cfoundry/baseclient_spec.rb +284 -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 +367 -0
  161. data/spec/cfoundry/trace_helpers_spec.rb +91 -0
  162. data/spec/cfoundry/uaaclient_spec.rb +421 -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 +472 -0
  179. data/spec/cfoundry/v2/organization_spec.rb +282 -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 +160 -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/v1.yml +189 -0
  267. data/vendor/errors/v2.yml +845 -0
  268. metadata +712 -0
@@ -0,0 +1,472 @@
1
+ require "spec_helper"
2
+
3
+ module CFoundry
4
+ module V2
5
+
6
+ # be careful, there is a TestModel in global scope because of the TestModelBuilder
7
+ class TestModel < CFoundry::V2::Model
8
+ attribute :foo, :string
9
+ to_one :domain
10
+
11
+ def create_endpoint_name
12
+ :odd_endpoint
13
+ end
14
+ end
15
+
16
+ class DefaultTestModel < CFoundry::V2::Model
17
+ attribute :foo, :string
18
+ end
19
+
20
+ describe Model do
21
+ let(:client) { build(:client) }
22
+ let(:guid) { "my-object-guid" }
23
+ let(:manifest) { {:metadata => {:guid => "some-guid-1"}, :entity => {}} }
24
+ let(:model) { TestModel.new(guid, client, manifest) }
25
+
26
+ describe "create" do
27
+ it "uses #create!" do
28
+ expect(model).to receive(:create!).with({})
29
+ model.create
30
+ end
31
+
32
+ it "passes options along to create!" do
33
+ expect(model).to receive(:create!).with(:accepts_incomplete => true)
34
+ model.create(:accepts_incomplete => true)
35
+ end
36
+
37
+ context "without errors" do
38
+ it "returns true" do
39
+ expect(model).to receive(:create!).with({})
40
+ expect(model.create).to eq(true)
41
+ end
42
+ end
43
+
44
+ context "with errors" do
45
+ before do
46
+ allow(model.class).to receive(:model_name) { ActiveModel::Name.new(model, nil, "abstract_model") }
47
+ allow(model).to receive(:create!) { raise CFoundry::APIError.new("HELP") }
48
+ end
49
+
50
+ it "does not raise an exception" do
51
+ expect { model.create }.to_not raise_error
52
+ end
53
+
54
+ it "returns false" do
55
+ expect(model.create).to eq(false)
56
+ end
57
+
58
+ context "without model-specific errors" do
59
+ it "adds generic base error " do
60
+ model.create
61
+ expect(model.errors.full_messages.first).to match(/cloud controller reported an error/i)
62
+ end
63
+ end
64
+
65
+ context "with model-specific errors" do
66
+ it "does not set the generic error on base" do
67
+ model.create
68
+ expect(model.errors.size).to eq(1)
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "#create!" do
75
+ before do
76
+ allow(client.base).to receive(:post) {
77
+ {:metadata => {
78
+ :guid => "123",
79
+ :created_at => "2013-06-10 10:41:15 -0700",
80
+ :updated_at => "2015-06-10 10:41:15 -0700"
81
+ }}
82
+ }
83
+ model.foo = "bar"
84
+ end
85
+
86
+ context "without options" do
87
+ it "posts to the model's create url with appropriate arguments and empty params hash" do
88
+ expect(client.base).to receive(:post).with("v2", :odd_endpoint,
89
+ :content => :json,
90
+ :accept => :json,
91
+ :payload => {:foo => "bar"},
92
+ :params => {}
93
+ ) { {:metadata => {}} }
94
+ model.create!
95
+ end
96
+ end
97
+
98
+ context "with options" do
99
+ it "sends create with appropriate arguments and options" do
100
+ options = {:excellent => "billandted"}
101
+ expect(client.base).to receive(:post).with("v2", :odd_endpoint,
102
+ :content => :json,
103
+ :accept => :json,
104
+ :payload => {:foo => "bar"},
105
+ :params => options
106
+ ) { {:metadata => {}} }
107
+ model.create!(options)
108
+ end
109
+ end
110
+
111
+ it "clears diff" do
112
+ expect(model.diff).to be_present
113
+ model.create!
114
+ expect(model.diff).not_to be_present
115
+ end
116
+
117
+ it "sets manifest from the response" do
118
+ model.create!
119
+ expect(model.manifest).to eq({
120
+ :metadata => {
121
+ :guid => "123",
122
+ :created_at => "2013-06-10 10:41:15 -0700",
123
+ :updated_at => "2015-06-10 10:41:15 -0700"
124
+ }
125
+ })
126
+ end
127
+
128
+ it "sets guid from the response metadata" do
129
+ model.create!
130
+ expect(model.guid).to eq("123")
131
+ end
132
+
133
+ it "sets timestamps from the response metadata" do
134
+ model.create!
135
+
136
+ expect(model.created_at).to eq(DateTime.parse("2013-06-10 10:41:15 -0700"))
137
+ expect(model.updated_at).to eq(DateTime.parse("2015-06-10 10:41:15 -0700"))
138
+ end
139
+ end
140
+
141
+ describe "#update!" do
142
+ before do
143
+ allow(client.base).to receive(:put) {
144
+ {
145
+ :metadata => {
146
+ :guid => guid,
147
+ :created_at => "2013-06-10 10:41:15 -0700",
148
+ :updated_at => "2015-06-12 10:41:15 -0700"
149
+ },
150
+ :entity => {
151
+ :foo => "updated"
152
+ }
153
+ }
154
+ }
155
+ end
156
+
157
+ context "without options" do
158
+ it "updates using the client with the v2 api, its plural model name, object guid, diff object, and empty params hash" do
159
+ model.foo = "bar"
160
+ expect(client.base).to receive(:put).with("v2", :test_models, guid,
161
+ :content => :json,
162
+ :accept => :json,
163
+ :payload => {:foo => "bar"},
164
+ :params => {}
165
+ )
166
+ model.update!
167
+ end
168
+ end
169
+
170
+ context "with options" do
171
+ it "sends update with the object guid, diff object and options" do
172
+ model.foo = "bar"
173
+ options = {:excellent => "billandted"}
174
+ expect(client.base).to receive(:put).with("v2", :test_models, guid,
175
+ :content => :json,
176
+ :accept => :json,
177
+ :payload => {:foo => "bar"},
178
+ :params => options
179
+ )
180
+ model.update!(options)
181
+ end
182
+ end
183
+
184
+ it "updates the updated_at timestamp" do
185
+ model.update!
186
+ expect(model.updated_at).to eq(DateTime.parse("2015-06-12 10:41:15 -0700"))
187
+ end
188
+
189
+ it "reloads it's data from the manifest" do
190
+ model.update!
191
+ expect(model.foo).to eq("updated")
192
+ end
193
+
194
+ it "clears diff" do
195
+ model.foo = "bar"
196
+
197
+ expect(model.diff).to be_present
198
+ model.update!
199
+ expect(model.diff).not_to be_present
200
+ end
201
+ end
202
+
203
+ describe "delete" do
204
+ it "uses #delete!" do
205
+ expect(model).to receive(:delete!).with({}) { true }
206
+ model.delete
207
+ end
208
+
209
+ it "passes options along to delete!" do
210
+ expect(model).to receive(:delete!).with(:recursive => true) { true }
211
+ model.delete(:recursive => true)
212
+ end
213
+
214
+ context "without errors" do
215
+ it "returns true" do
216
+ expect(model).to receive(:delete!).with({}) { true }
217
+ expect(model.delete).to eq(true)
218
+ end
219
+ end
220
+
221
+ context "with errors" do
222
+ before do
223
+ allow(model.class).to receive(:model_name) { ActiveModel::Name.new(model, nil, "abstract_model") }
224
+ allow(model).to receive(:delete!) { raise CFoundry::APIError.new("HELP") }
225
+ end
226
+
227
+ it "does not raise an exception" do
228
+ expect { model.delete }.to_not raise_error
229
+ end
230
+
231
+ it "returns false" do
232
+ expect(model.delete).to eq(false)
233
+ end
234
+
235
+ context "without model-specific errors" do
236
+ it "adds generic base error " do
237
+ model.delete
238
+ expect(model.errors.full_messages.first).to match(/cloud controller reported an error/i)
239
+ end
240
+ end
241
+
242
+ context "with model-specific errors" do
243
+ it "does not set the generic error on base" do
244
+ model.delete
245
+ expect(model.errors.size).to eq(1)
246
+ end
247
+ end
248
+ end
249
+ end
250
+
251
+ describe "#delete!" do
252
+ before { allow(client.base).to receive(:delete) }
253
+
254
+ context "without options" do
255
+ it "deletes using the client with the v2 api, its plural model name, object guid, and empty params hash" do
256
+ expect(client.base).to receive(:delete).with("v2", :test_models, guid, :params => {})
257
+ model.delete!
258
+ end
259
+ end
260
+
261
+ context "with options" do
262
+ it "sends delete with the object guid and options" do
263
+ options = {:excellent => "billandted"}
264
+ expect(client.base).to receive(:delete).with("v2", :test_models, guid, :params => options)
265
+
266
+ model.delete!(options)
267
+ end
268
+ end
269
+
270
+ it "clears its manifest metadata" do
271
+ expect(model.manifest).to have_key(:metadata)
272
+ model.delete!
273
+ expect(model.manifest).not_to have_key(:metadata)
274
+ end
275
+
276
+ it "clears the diff" do
277
+ model.foo = "bar"
278
+ expect(model.diff).to be_present
279
+ model.delete!
280
+ expect(model.diff).not_to be_present
281
+ end
282
+
283
+ it "delete me" do
284
+ begin
285
+ model.delete!
286
+ rescue => ex
287
+ expect(ex.message).not_to match(/\?/)
288
+ end
289
+ end
290
+ end
291
+
292
+ describe "#to_key" do
293
+ context "when persisted" do
294
+ it "returns an enumerable containing the guid" do
295
+ expect(model.to_key).to respond_to(:each)
296
+ expect(model.to_key.first).to eq(guid)
297
+ end
298
+ end
299
+
300
+ context "when not persisted" do
301
+ let(:guid) { nil }
302
+
303
+ it "returns nil" do
304
+ expect(model.to_key).to be_nil
305
+ end
306
+ end
307
+ end
308
+
309
+ describe "#to_param" do
310
+ context "when persisted" do
311
+ it "returns the guid as a string" do
312
+ expect(model.to_param).to be_a(String)
313
+ expect(model.to_param).to eq(guid)
314
+ end
315
+ end
316
+
317
+ context "when not persisted" do
318
+ let(:guid) { nil }
319
+
320
+ it "returns nil" do
321
+ expect(model.to_param).to be_nil
322
+ end
323
+ end
324
+ end
325
+
326
+ describe "#persisted?" do
327
+ context "on a new object" do
328
+ let(:guid) { nil }
329
+ it "returns false" do
330
+ expect(model).not_to be_persisted
331
+ end
332
+ end
333
+
334
+ context "on an object with a guid" do
335
+ it "returns false" do
336
+ expect(model).to be_persisted
337
+ end
338
+ end
339
+
340
+ context "on an object that has been deleted" do
341
+ before do
342
+ allow(client.base).to receive(:delete)
343
+ model.delete
344
+ end
345
+
346
+ it "returns false" do
347
+ expect(model).not_to be_persisted
348
+ end
349
+ end
350
+ end
351
+
352
+ describe "metadata" do
353
+ let(:new_object) { client.test_model }
354
+
355
+ context "when metadata are set" do
356
+ it "has timestamps" do
357
+ expect(new_object.created_at).to be_nil
358
+ expect(new_object.updated_at).to be_nil
359
+ end
360
+ end
361
+
362
+ context "when metadata are not defined" do
363
+ before do
364
+ allow(new_object).to receive(:manifest).with(nil)
365
+ end
366
+
367
+ it "returns nil for timestamps" do
368
+ expect(new_object.updated_at).to be_nil
369
+ expect(new_object.updated_at).to be_nil
370
+ end
371
+ end
372
+ end
373
+
374
+ describe "creating a new object" do
375
+ let(:new_object) { client.test_model }
376
+
377
+ describe "getting attributes" do
378
+ it "does not go to cloud controller" do
379
+ expect {
380
+ new_object.foo
381
+ }.to_not raise_error
382
+ end
383
+
384
+ it "remembers set values" do
385
+ new_object.foo = "bar"
386
+ expect(new_object.foo).to eq("bar")
387
+ end
388
+ end
389
+
390
+ describe "getting associations" do
391
+ describe "to_one associations" do
392
+ it "returns the an empty object of the association's type" do
393
+ expect(new_object.domain.guid).to be_nil
394
+ end
395
+ end
396
+ end
397
+ end
398
+
399
+ describe "first_page" do
400
+ before do
401
+ WebMock.stub_request(:get, /v2\/test_models/).to_return(:body => {
402
+ "prev_url" => nil,
403
+ "next_url" => next_url,
404
+ "resources" => [{:metadata => {:guid => '1234'}}]
405
+ }.to_json)
406
+ end
407
+
408
+ context "when there is a next page" do
409
+ let(:next_url) { "/v2/test_models?&page=2&results-per-page=50" }
410
+ before do
411
+ WebMock.stub_request(:get, /v2\/test_models/).to_return(:body => {
412
+ "prev_url" => nil,
413
+ "next_url" => "/v2/test_models?&page=2&results-per-page=50",
414
+ "resources" => [{:metadata => {:guid => '1234'}}]
415
+ }.to_json)
416
+ end
417
+
418
+ it "has next_page set to true" do
419
+ results = client.test_models_first_page
420
+ expect(results[:next_page]).to be_truthy
421
+ expect(results[:results].length).to eq(1)
422
+ expect(results[:results].first).to be_a TestModel
423
+ end
424
+ end
425
+
426
+ context "when there is no next page" do
427
+ let(:next_url) { nil }
428
+
429
+ it "has next_page set to false" do
430
+ results = client.test_models_first_page
431
+ expect(results[:next_page]).to be_falsey
432
+ end
433
+ end
434
+ end
435
+
436
+ describe '#for_each' do
437
+ before do
438
+ next_url = '/v2/test_models?page=2&q=timestamp%3E2012-11-01T12:00:00Z%3Btimestamp%3C2012-11-01T13:00:00Z&results-per-page=50'
439
+
440
+ WebMock.stub_request(:get, /v2\/test_models\?inline-relations-depth=1/).to_return(:body => {
441
+ 'prev_url' => nil,
442
+ 'next_url' => next_url,
443
+ 'resources' => [{:metadata => {:guid => '1'}}, {:metadata => {:guid => '2'}}]
444
+ }.to_json).times(1)
445
+
446
+ WebMock.stub_request(:get, /#{Regexp.escape(next_url)}/).to_return(:body => {
447
+ 'prev_url' => nil,
448
+ 'next_url' => nil,
449
+ 'resources' => [{:metadata => {:guid => '3'}}]
450
+ }.to_json).times(1)
451
+ end
452
+
453
+ it 'yields each page to the given the block' do
454
+ results = []
455
+ client.test_models_for_each do |test_model|
456
+ results << test_model
457
+ end
458
+ expect(results.map(&:guid)).to eq(%w{1 2 3})
459
+ expect(results.first).to be_a TestModel
460
+ end
461
+ end
462
+
463
+ describe "#create_endpoint_name" do
464
+ let(:default_model) { DefaultTestModel.new(guid, client, manifest) }
465
+
466
+ it "defaults to the plural object name" do
467
+ expect(default_model.create_endpoint_name).to eq(:default_test_models)
468
+ end
469
+ end
470
+ end
471
+ end
472
+ end