cloudinary 1.13.0 → 1.13.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/cloudinary.gemspec +1 -2
  4. data/lib/active_storage/service/cloudinary_service.rb +0 -1
  5. data/lib/cloudinary/utils.rb +1 -1
  6. data/lib/cloudinary/version.rb +1 -1
  7. metadata +3 -185
  8. data/spec/access_control_spec.rb +0 -102
  9. data/spec/active_storage/Gemfile +0 -12
  10. data/spec/active_storage/application_system_test_case.rb +0 -5
  11. data/spec/active_storage/database/create_users_migration.rb +0 -9
  12. data/spec/active_storage/database/setup.rb +0 -7
  13. data/spec/active_storage/dummy/Rakefile +0 -5
  14. data/spec/active_storage/dummy/app/assets/config/manifest.js +0 -3
  15. data/spec/active_storage/dummy/app/assets/javascripts/application.js +0 -13
  16. data/spec/active_storage/dummy/app/assets/stylesheets/application.css +0 -15
  17. data/spec/active_storage/dummy/app/controllers/application_controller.rb +0 -5
  18. data/spec/active_storage/dummy/app/helpers/application_helper.rb +0 -4
  19. data/spec/active_storage/dummy/app/jobs/application_job.rb +0 -4
  20. data/spec/active_storage/dummy/app/models/application_record.rb +0 -5
  21. data/spec/active_storage/dummy/app/views/layouts/application.html.erb +0 -14
  22. data/spec/active_storage/dummy/bin/bundle +0 -5
  23. data/spec/active_storage/dummy/bin/rails +0 -6
  24. data/spec/active_storage/dummy/bin/rake +0 -6
  25. data/spec/active_storage/dummy/bin/yarn +0 -11
  26. data/spec/active_storage/dummy/config.ru +0 -7
  27. data/spec/active_storage/dummy/config/application.rb +0 -22
  28. data/spec/active_storage/dummy/config/boot.rb +0 -7
  29. data/spec/active_storage/dummy/config/database.yml +0 -25
  30. data/spec/active_storage/dummy/config/environment.rb +0 -7
  31. data/spec/active_storage/dummy/config/environments/development.rb +0 -52
  32. data/spec/active_storage/dummy/config/environments/production.rb +0 -83
  33. data/spec/active_storage/dummy/config/environments/test.rb +0 -38
  34. data/spec/active_storage/dummy/config/initializers/application_controller_renderer.rb +0 -7
  35. data/spec/active_storage/dummy/config/initializers/assets.rb +0 -16
  36. data/spec/active_storage/dummy/config/initializers/backtrace_silencers.rb +0 -8
  37. data/spec/active_storage/dummy/config/initializers/cookies_serializer.rb +0 -7
  38. data/spec/active_storage/dummy/config/initializers/filter_parameter_logging.rb +0 -6
  39. data/spec/active_storage/dummy/config/initializers/inflections.rb +0 -17
  40. data/spec/active_storage/dummy/config/initializers/mime_types.rb +0 -5
  41. data/spec/active_storage/dummy/config/initializers/wrap_parameters.rb +0 -16
  42. data/spec/active_storage/dummy/config/routes.rb +0 -4
  43. data/spec/active_storage/dummy/config/secrets.yml +0 -32
  44. data/spec/active_storage/dummy/config/spring.rb +0 -8
  45. data/spec/active_storage/dummy/config/storage.yml +0 -3
  46. data/spec/active_storage/dummy/config/webpacker.yml +0 -72
  47. data/spec/active_storage/dummy/package.json +0 -5
  48. data/spec/active_storage/dummy/public/404.html +0 -67
  49. data/spec/active_storage/dummy/public/422.html +0 -67
  50. data/spec/active_storage/dummy/public/500.html +0 -66
  51. data/spec/active_storage/dummy/public/apple-touch-icon-precomposed.png +0 -0
  52. data/spec/active_storage/dummy/public/apple-touch-icon.png +0 -0
  53. data/spec/active_storage/dummy/public/favicon.ico +0 -0
  54. data/spec/active_storage/fixtures/files/colors.bmp +0 -0
  55. data/spec/active_storage/fixtures/files/empty_file.txt +0 -0
  56. data/spec/active_storage/fixtures/files/favicon.ico +0 -0
  57. data/spec/active_storage/fixtures/files/icon.psd +0 -0
  58. data/spec/active_storage/fixtures/files/icon.svg +0 -13
  59. data/spec/active_storage/fixtures/files/image.gif +0 -0
  60. data/spec/active_storage/fixtures/files/racecar.jpg +0 -0
  61. data/spec/active_storage/fixtures/files/racecar.tif +0 -0
  62. data/spec/active_storage/fixtures/files/racecar_rotated.jpg +0 -0
  63. data/spec/active_storage/fixtures/files/report.pdf +0 -0
  64. data/spec/active_storage/fixtures/files/rotated_video.mp4 +0 -0
  65. data/spec/active_storage/fixtures/files/video.mp4 +0 -0
  66. data/spec/active_storage/fixtures/files/video_with_rectangular_samples.mp4 +0 -0
  67. data/spec/active_storage/fixtures/files/video_with_undefined_display_aspect_ratio.mp4 +0 -0
  68. data/spec/active_storage/fixtures/files/video_without_video_stream.mp4 +0 -0
  69. data/spec/active_storage/service/cloudinary_service_spec.rb +0 -107
  70. data/spec/active_storage/service/configurations.yml +0 -4
  71. data/spec/active_storage/test_helper.rb +0 -43
  72. data/spec/api_spec.rb +0 -623
  73. data/spec/archive_spec.rb +0 -145
  74. data/spec/auth_token_spec.rb +0 -77
  75. data/spec/cache_spec.rb +0 -109
  76. data/spec/cloudinary_helper_spec.rb +0 -327
  77. data/spec/cloudinary_spec.rb +0 -56
  78. data/spec/data/sync_static/app/assets/javascripts/1.coffee +0 -1
  79. data/spec/data/sync_static/app/assets/javascripts/1.js +0 -1
  80. data/spec/data/sync_static/app/assets/stylesheets/1.css +0 -3
  81. data/spec/docx.docx +0 -0
  82. data/spec/favicon.ico +0 -0
  83. data/spec/image_spec.rb +0 -107
  84. data/spec/logo.png +0 -0
  85. data/spec/movie.mp4 +0 -0
  86. data/spec/rake_spec.rb +0 -160
  87. data/spec/sample_asset_file.tsv +0 -4
  88. data/spec/search_spec.rb +0 -109
  89. data/spec/spec_helper.rb +0 -273
  90. data/spec/storage_spec.rb +0 -44
  91. data/spec/streaminig_profiles_api_spec.rb +0 -74
  92. data/spec/support/helpers/temp_file_helpers.rb +0 -22
  93. data/spec/support/shared_contexts/rake.rb +0 -19
  94. data/spec/uploader_spec.rb +0 -409
  95. data/spec/utils_methods_spec.rb +0 -81
  96. data/spec/utils_spec.rb +0 -1052
  97. data/spec/video_tag_spec.rb +0 -253
  98. data/spec/video_url_spec.rb +0 -185
@@ -1,4 +0,0 @@
1
- cloudinary:
2
- service: Cloudinary
3
- tags:
4
- - ActiveStorageTestTag
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
- ENV['RAILS_ENV'] ||= 'test'
3
- require_relative './dummy/config/environment'
4
-
5
- require "bundler/setup"
6
- require "active_support"
7
- require "rails"
8
- require "active_model/railtie"
9
- require "active_job/railtie"
10
- require "active_record/railtie"
11
- require "action_controller/railtie"
12
- require "action_view/railtie"
13
- require "active_storage/engine"
14
- require "net/http"
15
- require "active_support/core_ext/securerandom"
16
- require "active_storage/database/setup"
17
-
18
- begin
19
- require "byebug"
20
- rescue LoadError
21
- end
22
-
23
- require "active_job"
24
- ActiveJob::Base.queue_adapter = :test
25
- ActiveJob::Base.logger = ActiveSupport::Logger.new(nil)
26
-
27
-
28
- require "yaml"
29
- SERVICE_CONFIGURATIONS = begin
30
- erb = ERB.new(Pathname.new(File.expand_path("service/configurations.yml", __dir__)).read)
31
- configuration = YAML.load(erb.result) || {}
32
- configuration.deep_symbolize_keys
33
- rescue Errno::ENOENT
34
- puts "Missing service configuration file in test/service/configurations.yml"
35
- {}
36
- end
37
-
38
- ActiveStorage.logger = ActiveSupport::Logger.new(nil)
39
- ActiveStorage.verifier = ActiveSupport::MessageVerifier.new("Testing")
40
-
41
- require "global_id"
42
- GlobalID.app = "ActiveStorageExampleApp"
43
- ActiveRecord::Base.send :include, GlobalID::Identification
data/spec/api_spec.rb DELETED
@@ -1,623 +0,0 @@
1
- require 'spec_helper'
2
- require 'cloudinary'
3
-
4
- describe Cloudinary::Api do
5
- break puts("Please setup environment for api test to run") if Cloudinary.config.api_secret.blank?
6
- include_context "cleanup", TIMESTAMP_TAG
7
- TEST_WIDTH = rand(1000)
8
- TEST_TRANSFOMATION = "c_scale,w_#{TEST_WIDTH}"
9
- prefix = "api_test_#{SUFFIX}"
10
- test_id_1 = "#{prefix}_1"
11
- test_id_2 = "#{prefix}_2"
12
- test_id_3 = "#{prefix}_3"
13
- test_key = "test_key_#{SUFFIX}"
14
- before(:all) do
15
-
16
- @api = Cloudinary::Api
17
- Cloudinary::Uploader.upload(TEST_IMG, :public_id => test_id_1, :tags => [TEST_TAG, TIMESTAMP_TAG], :context => "key=value", :eager =>[:width =>TEST_WIDTH, :crop =>:scale])
18
- Cloudinary::Uploader.upload(TEST_IMG, :public_id => test_id_2, :tags => [TEST_TAG, TIMESTAMP_TAG], :context => "key=value", :eager =>[:width =>TEST_WIDTH, :crop =>:scale])
19
- Cloudinary::Uploader.upload(TEST_IMG, :public_id => test_id_3, :tags => [TEST_TAG, TIMESTAMP_TAG], :context => "key=value", :eager =>[:width =>TEST_WIDTH, :crop =>:scale])
20
- Cloudinary::Uploader.upload(TEST_IMG, :public_id => test_id_1, :tags => [TEST_TAG, TIMESTAMP_TAG], :context => "#{test_key}=test", :eager =>[:width =>TEST_WIDTH, :crop =>:scale])
21
- Cloudinary::Uploader.upload(TEST_IMG, :public_id => test_id_3, :tags => [TEST_TAG, TIMESTAMP_TAG], :context => "#{test_key}=tasty", :eager =>[:width =>TEST_WIDTH, :crop =>:scale])
22
- end
23
-
24
- after(:all) do
25
- # in addition to "cleanup" context
26
- unless Cloudinary.config.keep_test_products
27
- up = Cloudinary::Api.upload_presets max_results: 500
28
- up["presets"].each do |u|
29
- tags = u["settings"]["tags"]
30
- name = u["name"]
31
- if tags =~ /.*#{TIMESTAMP_TAG}.*/
32
- Cloudinary::Api.delete_upload_preset(name)
33
- end
34
- end
35
- end
36
- end
37
-
38
- it "should allow using derived_next_cursor when listing details of a single resource" do
39
- expected = {
40
- [:payload, :derived_next_cursor] => "b16b8bd80426df43a107f26b0348"
41
- }
42
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
43
- @api.resource("test", {"derived_next_cursor" => "b16b8bd80426df43a107f26b0348"})
44
- end
45
-
46
- it "should allow listing resource_types" do
47
- expect(@api.resource_types()["resource_types"]).to include("image")
48
- end
49
-
50
- it "should allow listing resources" do
51
- resource = @api.resources()["resources"].find{|resource| resource["public_id"] == test_id_1
52
- }
53
- expect(resource).not_to be_blank
54
- expect(resource["type"]).to eq("upload")
55
- end
56
-
57
- it "should allow listing resources with cursor" do
58
- result = @api.resources(:max_results=>1)
59
- expect(result["resources"]).not_to be_blank
60
- expect(result["resources"].length).to eq(1)
61
- expect(result["next_cursor"]).not_to be_blank
62
- result2 = @api.resources(:max_results=>1, :next_cursor=>result["next_cursor"])
63
- expect(result2["resources"]).not_to be_blank
64
- expect(result2["resources"].length).to eq(1)
65
- expect(result2["resources"][0]["public_id"]).not_to eq(result["resources"][0]["public_id"] )
66
- end
67
-
68
- it "should allow listing resources by type" do
69
- resource = @api.resources(:type=>"upload", :tags=>true)["resources"].find{|resource| resource["public_id"] == test_id_1
70
- }
71
- expect(resource).not_to be_blank
72
- expect(resource["tags"]).to match_array([TEST_TAG, TIMESTAMP_TAG])
73
- end
74
-
75
- it "should allow listing resources by prefix" do
76
- resources = @api.resources(:type =>"upload", :prefix => prefix, :tags => true, :context => true)["resources"]
77
- expect(resources.map{|resource| resource["public_id"]}).to include(test_id_1, test_id_2)
78
- expect(resources.map{|resource| resource["tags"]}.flatten).to include(TEST_TAG, TIMESTAMP_TAG)
79
- expect(resources.map{|resource| resource["context"]}).to include({"custom" => {"key" => "value"}})
80
- end
81
-
82
- it "should allow listing resources by tag" do
83
- resources = @api.resources_by_tag(TEST_TAG, :tags => true, :context => true)["resources"]
84
- expect(resources.find{|resource| resource["public_id"] == test_id_1
85
- }).not_to be_blank
86
- expect(resources.map{|resource| resource["tags"]}.flatten).to include(TEST_TAG, TIMESTAMP_TAG)
87
- expect(resources.map{|resource| resource["context"]}).to include({"custom" => {"key" => "value"}})
88
- end
89
-
90
- it "should allow listing resources by context" do
91
- resources = @api.resources_by_context(test_key)["resources"]
92
- expect(resources.count).to eq(2)
93
- resources = @api.resources_by_context(test_key,'test')["resources"]
94
- expect(resources.count).to eq(1)
95
- end
96
-
97
- it "should allow listing resources by public ids" do
98
- resources = @api.resources_by_ids([test_id_1, test_id_2], :tags => true, :context => true)["resources"]
99
- expect(resources.length).to eq(2)
100
- expect(resources.find{|resource| resource["public_id"] == test_id_1
101
- }).not_to be_blank
102
- expect(resources.map{|resource| resource["tags"]}.flatten).to include(TEST_TAG, TIMESTAMP_TAG)
103
- expect(resources.map{|resource| resource["context"]}).to include({"custom" => {"key" => "value"}})
104
- end
105
-
106
- it "should allow listing resources by start date", :start_at => true do
107
- start_at = Time.now
108
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :start_at] => start_at, [:payload, :direction] => "asc"}))
109
- @api.resources(:type=>"upload", :start_at=>start_at, :direction => "asc")
110
- end
111
-
112
- describe ":direction" do
113
-
114
- it "should accept a string 'desc' and 'asc'" do
115
- expected = {
116
- :url => /.*\/resources\/image\/tags\/#{TIMESTAMP_TAG}/,
117
- [:payload, :direction] => "asc"
118
- }
119
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
120
-
121
- @api.resources_by_tag(TIMESTAMP_TAG, :type=>"upload", :direction => "asc")
122
- end
123
- it "should accept an integer of '1' or '-1'" do
124
- expected = {
125
- :url => /.*\/resources\/image\/tags\/#{TIMESTAMP_TAG}/,
126
- [:payload, :direction] => "-1"
127
- }
128
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
129
- @api.resources_by_tag(TIMESTAMP_TAG, :type=>"upload", :direction => "-1")
130
- end
131
- end
132
-
133
- it "should allow get resource metadata" do
134
- resource = @api.resource(test_id_1)
135
- expect(resource).not_to be_blank
136
- expect(resource["public_id"]).to eq(test_id_1)
137
- expect(resource["bytes"]).to eq(3381)
138
- expect(resource["derived"].length).to eq(1)
139
- end
140
-
141
- it "should support the quality_analysis parameter" do
142
- resource = @api.resource(test_id_1, :quality_analysis => true)
143
- expect(resource).not_to be_blank
144
- expect(resource).to have_key("quality_analysis")
145
- expect(resource["quality_analysis"]).to have_key("focus")
146
- end
147
-
148
- it "should support the cinemagraph_analysis parameter" do
149
- expected = {
150
- [:payload, :cinemagraph_analysis] => true,
151
- [:method] => :get
152
- }
153
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
154
- @api.resource(test_id_1, :cinemagraph_analysis => true)
155
- end
156
-
157
- it "should allow deleting derived resource" do
158
- derived_resource_id = "derived_id"
159
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :derived_resource_ids] => derived_resource_id}))
160
- @api.delete_derived_resources(derived_resource_id)
161
- end
162
-
163
- it "should allow deleting derived resources by transformations" do
164
- public_id = "public_id"
165
- transformations = "c_crop,w_100"
166
- expect(RestClient::Request).to receive(:execute).with(
167
- deep_hash_value( {[:payload, :public_ids] => public_id,
168
- [:payload, :transformations] => "c_crop,w_100"}))
169
- @api.delete_derived_by_transformation(public_id, "c_crop,w_100")
170
-
171
- transformations = {:crop => "crop", :width => 100}
172
- expect(RestClient::Request).to receive(:execute).with(
173
- deep_hash_value( {[:payload, :public_ids] => public_id,
174
- [:payload, :transformations] => "c_crop,w_100"}))
175
- @api.delete_derived_by_transformation(public_id, transformations)
176
-
177
- transformations = [{:crop => "crop", :width => 100}, {:crop => "scale", :width => 300}]
178
- expect(RestClient::Request).to receive(:execute).with(
179
- deep_hash_value( {[:payload, :public_ids] => public_id,
180
- [:payload, :transformations] => "c_crop,w_100|c_scale,w_300"}))
181
- @api.delete_derived_by_transformation(public_id, transformations)
182
-
183
- end
184
-
185
- it "should allow deleting multiple resources and comma inclusive public IDs", :focus => true do
186
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :public_ids] => ["apit_test", "test_id_2", "api_test3"]}))
187
- @api.delete_resources(["apit_test", "test_id_2", "api_test3"])
188
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :public_ids] => "apit_test,test_id_2,api_test3"}))
189
- @api.delete_resources("apit_test,test_id_2,api_test3")
190
- end
191
-
192
- it "should allow deleting resource transformations" do
193
- resource = Cloudinary::Uploader.upload(TEST_IMG, :eager => [{:width=>101,:crop=>:scale}, {:width=>200,:crop=>:crop}])
194
- public_id = resource["public_id"]
195
- expect(resource).not_to be_blank
196
- derived = resource["eager"].map{|d| d["transformation"]}
197
- expect(derived).to include("c_scale,w_101", "c_crop,w_200")
198
- @api.delete_resources([public_id], :transformations => "c_crop,w_200")
199
- resource = @api.resource(public_id)
200
- derived = resource["derived"].map{|d| d["transformation"]}
201
- expect(derived).not_to include("c_crop,w_200")
202
- expect(derived).to include("c_scale,w_101")
203
- end
204
-
205
- it "should allow deleting resources by prefix" do
206
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :prefix] => "api_test_by"}))
207
- @api.delete_resources_by_prefix("api_test_by")
208
- end
209
-
210
- it "should allow deleting resources by tags" do
211
- expect(RestClient::Request).to receive(:execute).with(hash_including( :url => /.*\/tags\/api_test_tag_for_delete$/))
212
- @api.delete_resources_by_tag("api_test_tag_for_delete")
213
- end
214
-
215
- it "should allow listing tags" do
216
- tags = @api.tags(:max_results => 500)["tags"]
217
- expect(tags).to include(TEST_TAG)
218
- end
219
-
220
- it "should allow listing tag by prefix" do
221
- tags = @api.tags(:prefix=> TEST_TAG)["tags"]
222
- expect(tags).to include(TIMESTAMP_TAG)
223
- tags = @api.tags(:prefix=>"api_test_no_such_tag")["tags"]
224
- expect(tags).to be_blank
225
- end
226
-
227
- describe 'transformations' do
228
- it "should allow listing transformations" do
229
- transformations = @api.transformations()["transformations"]
230
- t0 = transformations[0]
231
- expect(t0).not_to be_empty
232
- expect(t0).to have_key("used")
233
- end
234
-
235
- it "should allow getting transformation metadata" do
236
- transformation = @api.transformation(TEST_TRANSFOMATION)
237
- expect(transformation).not_to be_blank
238
- expect(transformation["info"]).to eq(["crop" => "scale", "width" => TEST_WIDTH])
239
- transformation = @api.transformation("crop" => "scale", "width" => TEST_WIDTH)
240
- expect(transformation).not_to be_blank
241
- expect(transformation["info"]).to eq(["crop" => "scale", "width" => TEST_WIDTH])
242
- end
243
-
244
- it "should allow updating transformation allowed_for_strict" do
245
- @api.update_transformation(TEST_TRANSFOMATION, :allowed_for_strict => true)
246
- transformation = @api.transformation(TEST_TRANSFOMATION)
247
- expect(transformation).not_to be_blank
248
- expect(transformation["allowed_for_strict"]).to eq(true)
249
- @api.update_transformation(TEST_TRANSFOMATION, :allowed_for_strict => false)
250
- transformation = @api.transformation(TEST_TRANSFOMATION)
251
- expect(transformation).not_to be_blank
252
- expect(transformation["allowed_for_strict"]).to eq(false)
253
- end
254
-
255
- it "should fetch two different derived images using next_cursor" do
256
- result = @api.transformation(TEST_TRANSFOMATION, :max_results=>1)
257
- expect(result["derived"]).not_to be_blank
258
- expect(result["derived"].length).to eq(1)
259
- expect(result["next_cursor"]).not_to be_blank
260
- result2 = @api.transformation(TEST_TRANSFOMATION, :max_results=>1, :next_cursor=>result["next_cursor"])
261
- expect(result2["derived"]).not_to be_blank
262
- expect(result2["derived"].length).to eq(1)
263
- expect(result2["derived"][0]["id"]).not_to eq(result["derived"][0]["id"] )
264
- end
265
-
266
- describe "named transformations" do
267
- it "should allow creating named transformation" do
268
- public_id = "api_test_transformation_#{Time.now.to_i}"
269
- @api.create_transformation(public_id, "crop" => "scale", "width" => 102)
270
- transformation = @api.transformation(public_id)
271
- expect(transformation).not_to be_blank
272
- expect(transformation["allowed_for_strict"]).to eq(true)
273
- expect(transformation["info"]).to eq(["crop" => "scale", "width" => 102])
274
- expect(transformation["used"]).to eq(false)
275
- end
276
-
277
- it "should allow deleting named transformation" do
278
- public_id = "api_test_transformation_#{Time.now.to_i}"
279
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( :url => /.*\/transformations\/#{public_id}/, :method => :delete))
280
- @api.delete_transformation(public_id)
281
- end
282
-
283
- it "should allow unsafe update of named transformation" do
284
- public_id = "api_test_transformation_#{Time.now.to_i}"
285
- expected = {
286
- :url => /.*\/transformations\/#{public_id}$/,
287
- :method => :put,
288
- [:payload, :unsafe_update] => "c_scale,w_103"}
289
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
290
- @api.update_transformation(public_id, :unsafe_update => { "crop" => "scale", "width" => 103 })
291
- end
292
-
293
- it "should allow listing of named transformations" do
294
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :named ]=> true))
295
- @api.transformations :named => true
296
- end
297
-
298
- end
299
- it "should allow deleting implicit transformation" do
300
- @api.transformation(TEST_TRANSFOMATION)
301
- @api.delete_transformation(TEST_TRANSFOMATION)
302
- expect { @api.transformation(TEST_TRANSFOMATION) }.to raise_error(Cloudinary::Api::NotFound)
303
- end
304
- end
305
-
306
- it "should allow creating upload_presets" do
307
- expected = {:url => /.*\/upload_presets$/,
308
- [:payload, :name] => "new_preset",
309
- [:payload, :folder] => "some_folder"}
310
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
311
-
312
- @api.create_upload_preset(:name => "new_preset", :folder => "some_folder", :tags => [TEST_TAG, TIMESTAMP_TAG])
313
- end
314
-
315
- describe "upload_presets" do
316
- it 'should not accept parameters' do
317
- expected = {
318
- :url => /.*\/upload_presets/,
319
- [:payload, :next_cursor] => 1234567,
320
- [:payload, :max_results] => 10
321
- }
322
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
323
- @api.upload_presets :next_cursor => 1234567, :max_results => 10
324
-
325
- end
326
- end
327
- it "should allow getting a single upload_preset", :upload_preset => true do
328
- result = @api.create_upload_preset(:unsigned => true, :folder => "folder", :width => 100, :crop => :scale, :tags => ["a","b","c", TEST_TAG, TIMESTAMP_TAG], :context => {:a => "b", :c => "d"})
329
- name = result["name"]
330
- preset = @api.upload_preset(name)
331
- expect(preset["name"]).to eq(name)
332
- expect(preset["unsigned"]).to eq(true)
333
- expect(preset["settings"]["folder"]).to eq("folder")
334
- expect(preset["settings"]["transformation"]).to eq([{"width" => 100, "crop" => "scale"}])
335
- expect(preset["settings"]["context"]).to eq({"a" => "b", "c" => "d"})
336
- expect(preset["settings"]["tags"]).to eq(["a","b","c", TEST_TAG, TIMESTAMP_TAG])
337
- end
338
-
339
- it "should allow deleting upload_presets", :upload_preset => true do
340
- id = "#{prefix}_upload_preset"
341
- @api.create_upload_preset(:name => id, :folder => "folder", :tags => [TEST_TAG, TIMESTAMP_TAG])
342
- preset = @api.upload_preset(id)
343
- @api.delete_upload_preset(id)
344
- expect{preset = @api.upload_preset(id)}.to raise_error(Cloudinary::Api::NotFound)
345
- end
346
-
347
- it "should allow updating upload_presets", :upload_preset => true do
348
- name = @api.create_upload_preset(:folder => "folder", :tags => [TEST_TAG, TIMESTAMP_TAG])["name"]
349
- preset = @api.upload_preset(name)
350
- @api.update_upload_preset(name, preset["settings"].merge(:colors => true, :unsigned => true, :disallow_public_id => true))
351
- preset = @api.upload_preset(name)
352
- expect(preset["name"]).to eq(name)
353
- expect(preset["unsigned"]).to eq(true)
354
- expect(preset["settings"]).to eq({"folder" => "folder", "colors" => true, "disallow_public_id" => true, "tags" => [TEST_TAG, TIMESTAMP_TAG]})
355
- end
356
-
357
- # this test must be last because it deletes (potentially) all dependent transformations which some tests rely on. Excluded by default.
358
- skip "should allow deleting all resources", :delete_all=>true do
359
- Cloudinary::Uploader.upload(TEST_IMG, :public_id=>"api_test5", :eager=>[:width=>101,:crop=>:scale], :tags => [TEST_TAG, TIMESTAMP_TAG])
360
- resource = @api.resource("api_test5")
361
- expect(resource).not_to be_blank
362
- expect(resource["derived"].length).to eq(1)
363
- @api.delete_all_resources(:keep_original => true)
364
- resource = @api.resource("api_test5")
365
- expect(resource).not_to be_blank
366
- expect(resource["derived"].length).to eq(0)
367
- end
368
-
369
- it "should support setting manual moderation status" do
370
- result = Cloudinary::Uploader.upload(TEST_IMG, {:moderation => :manual, :tags => [TEST_TAG, TIMESTAMP_TAG]})
371
- expect(result["moderation"][0]["status"]).to eq("pending")
372
- expect(result["moderation"][0]["kind"]).to eq("manual")
373
- api_result = Cloudinary::Api.update(result["public_id"], {:moderation_status => :approved})
374
- expect(api_result["moderation"][0]["status"]).to eq("approved")
375
- expect(api_result["moderation"][0]["kind"]).to eq("manual")
376
- end
377
-
378
- it "should support requesting raw conversion" do
379
- result = Cloudinary::Uploader.upload(TEST_RAW, :resource_type => :raw, :tags => [TEST_TAG, TIMESTAMP_TAG])
380
- expect{Cloudinary::Api.update(result["public_id"], {:resource_type => :raw, :raw_convert => :illegal})}.to raise_error(Cloudinary::Api::BadRequest, /^Illegal value|not a valid/)
381
- end
382
-
383
- it "should support requesting categorization" do
384
- result = Cloudinary::Uploader.upload(TEST_IMG, :tags => [TEST_TAG, TIMESTAMP_TAG])
385
- expect{Cloudinary::Api.update(result["public_id"], {:categorization => :illegal})}.to raise_error(Cloudinary::Api::BadRequest, /^Illegal value/)
386
- end
387
-
388
- it "should support requesting detection with server notification", :focus => true do
389
- expected = {
390
- [:payload, :detection] => "adv_face",
391
- [:payload, :notification_url] => "http://example.com"
392
- }
393
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
394
- Cloudinary::Api.update("public_id", {:detection => "adv_face", :notification_url => "http://example.com"})
395
- end
396
-
397
- it "should support requesting auto_tagging" do
398
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :auto_tagging] => 0.5))
399
- Cloudinary::Api.update("public_id", {:auto_tagging => 0.5})
400
- end
401
-
402
- it "should support quality_override" do
403
- ['auto:advanced', 'auto:best', '80:420', 'none'].each do |q|
404
- expected = {[:payload, :quality_override] => q}
405
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
406
- Cloudinary::Api.update Pathname.new(TEST_IMG), :quality_override => q
407
- end
408
- end
409
-
410
- it "should support listing by moderation kind and value" do
411
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value([:url] => /.*manual\/approved$/, [:payload, :max_results] => 1000))
412
- Cloudinary::Api.resources_by_moderation(:manual, :approved, :max_results => 1000)
413
- end
414
-
415
- describe 'folders' do
416
- it 'should create folder' do
417
- expected = {
418
- [:url] => /.*\/folders\/#{UNIQUE_TEST_FOLDER}$/,
419
- [:method] => :post
420
- }
421
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
422
- @api.create_folder(UNIQUE_TEST_FOLDER)
423
- end
424
- it "should support listing folders" do
425
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:url] => /.*\/folders$/, [:method] => :get))
426
- Cloudinary::Api.root_folders
427
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:url] => /.*\/folders\/test_folder1$/, [:method] => :get))
428
- Cloudinary::Api.subfolders("test_folder1")
429
- end
430
- it "should URL escape the folder name" do
431
- expected = {
432
- [:url] => %r".*\/folders\/sub%5Efolder%20test$"
433
- }
434
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
435
- Cloudinary::Api.subfolders("sub^folder test")
436
- end
437
- it "should throw if folder is missing" do
438
- expect{Cloudinary::Api.subfolders("I_do_not_exist")}.to raise_error(Cloudinary::Api::NotFound)
439
- end
440
- it 'should include max_results and next_cursor for root_folders call' do
441
- expected = {
442
- [:payload, :max_results] => 3,
443
- [:payload, :next_cursor] => NEXT_CURSOR,
444
- }
445
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
446
- @api.root_folders :max_results => 3, :next_cursor => NEXT_CURSOR
447
- end
448
- it 'should include max_results and next_cursor for subfolders call' do
449
- expected = {
450
- [:payload, :max_results] => 3,
451
- [:payload, :next_cursor] => NEXT_CURSOR,
452
- }
453
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
454
- @api.subfolders GENERIC_FOLDER_NAME, :max_results => 3, :next_cursor => NEXT_CURSOR
455
- end
456
- it "should support deleting a folder" do
457
- expected = {
458
- :url => %r"/folders/#{GENERIC_FOLDER_NAME}$",
459
- :method => :delete
460
- }
461
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
462
- @api.delete_folder(GENERIC_FOLDER_NAME)
463
- end
464
- end
465
-
466
- describe '.restore' do
467
- it 'should restore a deleted resource' do
468
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :public_ids] => "api_test_restore", [:url] => /.*\/restore$/))
469
- Cloudinary::Api.restore("api_test_restore")
470
- end
471
- end
472
-
473
- describe 'create_upload_mapping' do
474
- mapping = "api_test_upload_mapping#{rand(100000)}"
475
- it 'should create mapping' do
476
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :template] => "http://cloudinary.com"))
477
- Cloudinary::Api.create_upload_mapping(mapping, :template =>"http://cloudinary.com")
478
- expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :template] => "http://res.cloudinary.com"))
479
- Cloudinary::Api.update_upload_mapping(mapping, "template" =>"http://res.cloudinary.com")
480
- end
481
- end
482
-
483
- describe "access_mode" do
484
- i = 0
485
-
486
- publicId = ""
487
- access_mode_tag = ''
488
- before(:each) do
489
- i += 1
490
- access_mode_tag = TEST_TAG + "access_mode" + i.to_s
491
- result = Cloudinary::Uploader.upload TEST_IMG, access_mode: "authenticated", tags: [TEST_TAG, TIMESTAMP_TAG, access_mode_tag]
492
- publicId = result["public_id"]
493
- expect(result["access_mode"]).to eq("authenticated")
494
- end
495
-
496
- it "should update access mode by ids" do
497
- result = Cloudinary::Api.update_resources_access_mode_by_ids "public", [publicId]
498
-
499
- expect(result["updated"]).to be_an_instance_of(Array)
500
- expect(result["updated"].length).to eq(1)
501
- resource = result["updated"][0]
502
- expect(resource["public_id"]).to eq(publicId)
503
- expect(resource["access_mode"]).to eq('public')
504
- end
505
- it "should update access mode by prefix" do
506
- result = Cloudinary::Api.update_resources_access_mode_by_prefix "public", publicId[0..-3]
507
-
508
- expect(result["updated"]).to be_an_instance_of(Array)
509
- expect(result["updated"].length).to eq(1)
510
- resource = result["updated"][0]
511
- expect(resource["public_id"]).to eq(publicId)
512
- expect(resource["access_mode"]).to eq('public')
513
- end
514
- it "should update access mode by tag" do
515
- result = Cloudinary::Api.update_resources_access_mode_by_tag "public", access_mode_tag
516
-
517
- expect(result["updated"]).to be_an_instance_of(Array)
518
- expect(result["updated"].length).to eq(1)
519
- resource = result["updated"][0]
520
- expect(resource["public_id"]).to eq(publicId)
521
- expect(resource["access_mode"]).to eq('public')
522
- end
523
- end
524
-
525
- context "resource of type authenticated" do
526
- i = 0
527
- bytes = nil
528
- publicId = ""
529
- publish_resource_tag = "publish_resource_tag"
530
- before(:each) do
531
- i += 1
532
- result = Cloudinary::Uploader.upload TEST_IMG, type: "authenticated", tags: [TEST_TAG, TIMESTAMP_TAG, publish_resource_tag], transformation: {width: 100*i, crop: "scale"}
533
- publicId = result["public_id"]
534
- expect(result["type"]).to eq("authenticated")
535
- end
536
-
537
- it "should publish resources by ids" do
538
- result = Cloudinary::Api.publish_by_ids( [publicId])
539
-
540
- expect(result["published"]).to be_an_instance_of(Array)
541
- expect(result["published"].length).to eq(1)
542
-
543
- resource = result["published"][0]
544
-
545
- expect(resource["public_id"]).to eq(publicId)
546
- expect(resource["type"]).to eq('upload')
547
-
548
- bytes = resource["bytes"]
549
- end
550
- it "should publish resources by prefix and overwrite" do
551
- result = Cloudinary::Api.publish_by_prefix(publicId[0..-3], overwrite: true)
552
-
553
- expect(result["published"]).to be_an_instance_of(Array)
554
- expect(result["published"].length).to eq(1)
555
-
556
- resource = result["published"][0]
557
-
558
- expect(resource["public_id"]).to eq(publicId)
559
- expect(resource["bytes"]).not_to eq(bytes)
560
- expect(resource["type"]).to eq('upload')
561
-
562
- bytes = resource["bytes"]
563
- end
564
- it "should publish resources by tag and overwrite" do
565
- result = Cloudinary::Api.publish_by_tag(publish_resource_tag, overwrite: true)
566
-
567
- expect(result["published"]).to be_an_instance_of(Array)
568
- expect(result["published"].length).to eq(1)
569
-
570
- resource = result["published"][0]
571
-
572
- expect(resource["public_id"]).to eq(publicId)
573
- expect(resource["bytes"]).not_to eq(bytes)
574
- expect(resource["type"]).to eq('upload')
575
-
576
- bytes = resource["bytes"]
577
- end
578
- end
579
- describe "json breakpoints" do
580
- it "should retrieve breakpoints as json array" do
581
- bp = Cloudinary::Api.get_breakpoints(test_id_1, srcset: {min_width:10, max_width:2000, bytes_step: 10, max_images: 20})
582
- expect(bp).to be_truthy
583
- end
584
- end
585
- end
586
-
587
- describe Cloudinary::Api::Response do
588
- let(:api_response) { described_class.new }
589
-
590
- shared_examples 'a Hash' do
591
- it 'inherits from Hash' do
592
- expect(api_response).to be_a Hash
593
- end
594
- end
595
-
596
- context 'when there is no argument given on instantiation' do
597
- it 'does not raise an error' do
598
- expect { api_response }.to_not raise_error
599
- end
600
-
601
- it_behaves_like 'a Hash'
602
- end
603
-
604
- context 'when the response is nil' do
605
- it 'does not raise an error' do
606
- expect { described_class.new nil }.to_not raise_error
607
- end
608
-
609
- it_behaves_like 'a Hash'
610
- end
611
-
612
- context 'when the response is present' do
613
- let(:body) { { 'foo' => 'bar' } }
614
- let(:http_response) { double code: 200, body: body.to_json, headers: { x_featureratelimit_reset: Time.new.to_s } }
615
- let(:api_response) { described_class.new http_response }
616
-
617
- it 'sets the instantiated self as the parsed response which is a Hash' do
618
- expect(api_response).to eq body
619
- end
620
-
621
- it_behaves_like 'a Hash'
622
- end
623
- end