ncfoundry 4.9.2

Sign up to get free protection for your applications and to get access to all the features.
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