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,81 +0,0 @@
1
- require 'rspec'
2
- require 'spec_helper'
3
- require 'cloudinary'
4
- include Cloudinary
5
-
6
- describe Utils do
7
-
8
- it 'should parse integer range values' do
9
- expect(Utils.instance_eval { norm_range_value("200") }).to eq("200")
10
- end
11
- it "should parse float range values" do
12
- expect(Utils.instance_eval { norm_range_value("200.0") }).to eq("200.0"), "parse a float"
13
- end
14
- it "should parse a percent range value" do
15
- expect(Utils.instance_eval { norm_range_value("20p") }).to eq("20p")
16
- end
17
- describe "json_array_param" do
18
- let (:data) {{:one => 1, :two => 2, "three" => 3}}
19
- let (:data_s) {"{\"one\":1,\"two\":2,\"three\":3}"}
20
- let (:data2) {{:foo => "bar"}}
21
- let (:data2_s) {"{\"foo\":\"bar\"}"}
22
- it "should convert a hash to json array" do
23
- result = Utils.json_array_param(data)
24
- expect(result).to match(/^\[.+\]$/)
25
- end
26
- it "should convert an array of hash to json array" do
27
- result = Utils.json_array_param([data, data2])
28
- expect(result).to eql("[#{data_s},#{data2_s}]")
29
- end
30
- it "should convert a json string to json array string" do
31
- result = Utils.json_array_param(data_s)
32
- expect(result).to eql("[#{data_s}]")
33
- end
34
- it "should accept a JSON array string and return it" do
35
- result = Utils.json_array_param("[#{data_s},#{data2_s}]")
36
- expect(result).to eql("[#{data_s},#{data2_s}]")
37
- end
38
- it "should throw an error if input string is not valid json string" do
39
- expect{Utils.json_array_param("I'm not a JSON object!")}.to raise_error(JSON::ParserError)
40
- end
41
- it "should support a block" do
42
- hash = {:block => "works"}
43
- hash_s = '{"block":"works"}'
44
- result = Utils.json_array_param(data) do |array|
45
- array[0]['foo'] = 'foobar'
46
- array.push(hash)
47
-
48
- end
49
- expect(result).to include(hash_s)
50
- expect(result).to include('foobar')
51
- end
52
- end
53
- describe 'is_remote_url' do
54
- it 'should identify remote URLs correctly' do
55
- [
56
- "ftp://ftp.cloudinary.com/images/old_logo.png",
57
- "http://cloudinary.com/images/old_logo.png",
58
- "https://cloudinary.com/images/old_logo.png",
59
- "s3://s3-us-west-2.amazonaws.com/cloudinary/images/old_logo.png",
60
- "gs://cloudinary/images/old_logo.png",
61
- "data:image/gif;charset=utf8;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
62
- "data:image/gif;param1=value1;param2=value2;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
63
- ].each do |url|
64
- expect(Cloudinary::Utils.is_remote?(url)).to eq(true), url
65
- end
66
- end
67
- end
68
- describe "resource_type per format" do
69
- it "should return the correct resource_type per format" do
70
- format_to_resource_type = {
71
- "jpg" => "image",
72
- "mp4" => "video",
73
- "txt" => "raw",
74
- "mp3" => "video",
75
- }
76
- format_to_resource_type.each do |format, resource_type|
77
- expect(Cloudinary::Utils.resource_type_for_format(format)).to eq(resource_type)
78
- end
79
- end
80
- end
81
- end
data/spec/utils_spec.rb DELETED
@@ -1,1052 +0,0 @@
1
- require 'spec_helper'
2
- require 'cloudinary'
3
-
4
- describe Cloudinary::Utils do
5
-
6
-
7
- before :each do
8
- Cloudinary.reset_config
9
- Cloudinary.config do |config|
10
- # config.cloud_name = "demo"
11
- config.secure_distribution = nil
12
- config.private_cdn = false
13
- config.secure = false
14
- config.cname = nil
15
- config.cdn_subdomain = false
16
- end
17
- end
18
-
19
- let(:cloud_name) { Cloudinary.config.cloud_name }
20
- let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
21
- let(:upload_path) { "#{root_path}/image/upload" }
22
-
23
- it "should allow overriding cloud_name in options" do
24
- expect(["test", { :cloud_name => "test321" }])
25
- .to produce_url("http://res.cloudinary.com/test321/image/upload/test")
26
- .and empty_options
27
- end
28
-
29
- it "should use default secure distribution if secure=true" do
30
- expect(["test", { :secure => true }])
31
- .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
32
- .and empty_options
33
- end
34
-
35
- it "should allow overriding secure distribution if secure=true" do
36
- expect(["test", { :secure => true, :secure_distribution => "something.else.com" }])
37
- .to produce_url("https://something.else.com/#{cloud_name}/image/upload/test")
38
- .and empty_options
39
- end
40
-
41
- it "should take secure distribution from config if secure=true" do
42
- Cloudinary.config.secure_distribution = "config.secure.distribution.com"
43
- expect(["test", { :secure => true }])
44
- .to produce_url("https://config.secure.distribution.com/#{cloud_name}/image/upload/test")
45
- .and empty_options
46
- end
47
-
48
- it "should default to akamai if secure is given with private_cdn and no secure_distribution" do
49
- expect(["test", { :secure => true, :private_cdn => true }])
50
- .to produce_url("https://#{cloud_name}-res.cloudinary.com/image/upload/test")
51
- .and empty_options
52
- end
53
-
54
- it "should not add cloud_name if secure private_cdn and secure non akamai secure_distribution" do
55
- expect(["test", { :secure => true, :private_cdn => true, :secure_distribution => "something.cloudfront.net" }])
56
- .to produce_url("https://something.cloudfront.net/image/upload/test")
57
- .and empty_options
58
- end
59
-
60
- it "should allow overriding private_cdn if private_cdn=true" do
61
- expect(["test", { :private_cdn => true }])
62
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/image/upload/test")
63
- .and empty_options
64
- end
65
-
66
- it "should allow overriding private_cdn if private_cdn=false" do
67
- Cloudinary.config.private_cdn = true
68
- expect(["test", { :private_cdn => false }])
69
- .to produce_url("#{upload_path}/test")
70
- .and empty_options
71
- end
72
-
73
- it "should allow overriding cname if cname=example.com" do
74
- expect(["test", { :cname => "example.com" }])
75
- .to produce_url("http://example.com/#{cloud_name}/image/upload/test")
76
- .and empty_options
77
- end
78
-
79
- it "should allow overriding cname if cname=false" do
80
- Cloudinary.config.cname = "example.com"
81
- expect(["test", { :cname => false }])
82
- .to produce_url("#{upload_path}/test")
83
- .and empty_options
84
- end
85
-
86
- it "should use format from options" do
87
- expect(["test", { :format => :jpg }])
88
- .to produce_url("#{upload_path}/test.jpg")
89
- .and empty_options
90
- end
91
-
92
- it "should support url_suffix in shared distribution" do
93
- expect(["test", { :url_suffix => "hello" }])
94
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/images/test/hello")
95
- .and empty_options
96
- expect(["test", { :url_suffix => "hello", :angle => 0 }])
97
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/images/a_0/test/hello")
98
- .and empty_options
99
- end
100
-
101
- it "should disallow url_suffix in non upload types" do
102
- expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello", :private_cdn => true, :type => :facebook }) }.to raise_error(CloudinaryException)
103
- end
104
-
105
- it "should disallow url_suffix with / or ." do
106
- expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello/world", :private_cdn => true }) }.to raise_error(CloudinaryException)
107
- expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello.world", :private_cdn => true }) }.to raise_error(CloudinaryException)
108
- end
109
-
110
- it "should support url_suffix for private_cdn" do
111
- expect(["test", { :url_suffix => "hello", :private_cdn => true }])
112
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/test/hello")
113
- .and empty_options
114
- expect(["test", { :url_suffix => "hello", :angle => 0, :private_cdn => true }])
115
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/a_0/test/hello")
116
- .and empty_options
117
- end
118
-
119
- it "should put format after url_suffix" do
120
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg" }])
121
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/test/hello.jpg")
122
- .and empty_options
123
- end
124
-
125
- it "should sign a url" do
126
- expected = Cloudinary::Utils.cloudinary_url "some_public_id.jpg",
127
- :cloud_name => "test",
128
- :api_key => "123456789012345",
129
- :api_secret => "AbcdEfghIjklmnopq1234567890",
130
- :type => "authenticated",
131
- :sign_url => true,
132
- :overlay => "text:Helvetica_50:test+text"
133
- expect(expected).to eq("http://res.cloudinary.com/test/image/authenticated/s--j5Z1ILxd--/l_text:Helvetica_50:test+text/some_public_id.jpg")
134
- end
135
-
136
- it "should not sign the url_suffix" do
137
- expected_signture = Cloudinary::Utils.cloudinary_url("test", :format => "jpg", :sign_url => true).match(/s--[0-9A-Za-z_-]{8}--/).to_s
138
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg", :sign_url => true }])
139
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/#{expected_signture}/test/hello.jpg")
140
- .and empty_options
141
-
142
- expected_signture = Cloudinary::Utils.cloudinary_url("test", :format => "jpg", :angle => 0, :sign_url => true).match(/s--[0-9A-Za-z_-]{8}--/).to_s
143
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg", :angle => 0, :sign_url => true }])
144
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/#{expected_signture}/a_0/test/hello.jpg")
145
- .and empty_options
146
- end
147
-
148
- it "should support url_suffix for raw uploads" do
149
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :resource_type => :raw }])
150
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/files/test/hello")
151
- .and empty_options
152
- end
153
-
154
- it "should support url_suffix for videos" do
155
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :resource_type => :video }])
156
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/videos/test/hello")
157
- .and empty_options
158
- end
159
-
160
- it "should support url_suffix for private images" do
161
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :resource_type => :image, :type => :private }])
162
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/private_images/test/hello")
163
- .and empty_options
164
- expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg", :resource_type => :image, :type => :private }])
165
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/private_images/test/hello.jpg")
166
- .and empty_options
167
- end
168
-
169
- it "should support url_suffix for authenticated images" do
170
- expect(["test", { :url_suffix => "hello", :format => "jpg", :resource_type => :image, :type => :authenticated }])
171
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/authenticated_images/test/hello.jpg")
172
- .and empty_options
173
- end
174
-
175
-
176
- describe 'root_path support' do
177
-
178
- it "should allow use_root_path in shared distribution" do
179
- # expect{Cloudinary::Utils.cloudinary_url("test", {:use_root_path=>true})}.to raise_error(CloudinaryException)
180
- expect(["test", { :use_root_path => true, :private_cdn => false }])
181
- .to produce_url("#{root_path}/test")
182
- .and empty_options
183
- expect(["test", { :use_root_path => true, :private_cdn => false, :angle => 0 }])
184
- .to produce_url("#{root_path}/a_0/test")
185
- .and empty_options
186
- end
187
-
188
- it "should support use_root_path for private_cdn" do
189
- expect(["test", { :use_root_path => true, :private_cdn => true }])
190
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/test")
191
- .and empty_options
192
- expect(["test", { :use_root_path => true, :private_cdn => true, :angle => 0 }])
193
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/a_0/test")
194
- .and empty_options
195
- end
196
-
197
- it "should support use_root_path together with url_suffix for private_cdn" do
198
- expect(["test", { :use_root_path => true, :url_suffix => "hello", :private_cdn => true }])
199
- .to produce_url("http://#{cloud_name}-res.cloudinary.com/test/hello")
200
- .and empty_options
201
- end
202
-
203
- it "should disallow use_root_path if not image/upload" do
204
- expect { Cloudinary::Utils.cloudinary_url("test", { :use_root_path => true, :private_cdn => true, :type => :facebook }) }.to raise_error(CloudinaryException)
205
- expect { Cloudinary::Utils.cloudinary_url("test", { :use_root_path => true, :private_cdn => true, :resource_type => :raw }) }.to raise_error(CloudinaryException)
206
- end
207
-
208
- end
209
- describe ":width, :height" do
210
- it "should use width and height from options only if crop is given" do
211
- expect(["test", { :width => 100, :height => 100 }])
212
- .to produce_url("#{upload_path}/test")
213
- .and mutate_options_to({ :width => 100, :height => 100 })
214
- expect(["test", { :width => 100, :height => 100, :crop => :crop }])
215
- .to produce_url("#{upload_path}/c_crop,h_100,w_100/test")
216
- .and mutate_options_to({ :width => 100, :height => 100 })
217
- end
218
-
219
- it "should not pass width and height to html in case of fit, lfill or limit crop" do
220
- expect(["test", { :width => 100, :height => 100, :crop => :limit }])
221
- .to produce_url("#{upload_path}/c_limit,h_100,w_100/test")
222
- .and empty_options
223
- expect(["test", { :width => 100, :height => 100, :crop => :lfill }])
224
- .to produce_url("#{upload_path}/c_lfill,h_100,w_100/test")
225
- .and empty_options
226
- expect(["test", { :width => 100, :height => 100, :crop => :fit }])
227
- .to produce_url("#{upload_path}/c_fit,h_100,w_100/test")
228
- .and empty_options
229
- end
230
-
231
- it "should not pass width and height to html in case angle was used" do
232
- expect(["test", { :width => 100, :height => 100, :crop => :scale, :angle => :auto }])
233
- .to produce_url("#{upload_path}/a_auto,c_scale,h_100,w_100/test")
234
- .and empty_options
235
- end
236
- it "should support size" do
237
- expect(["test", { :size => "10x10", :crop => :crop }])
238
- .to produce_url("#{upload_path}/c_crop,h_10,w_10/test")
239
- .and mutate_options_to({ :width => "10", :height => "10" })
240
- end
241
- it "should support auto width" do
242
- expect(["test", { :width => "auto:20", :crop => :fill }])
243
- .to produce_url("#{upload_path}/c_fill,w_auto:20/test")
244
- expect(["test", { :width => "auto:20:350", :crop => :fill }])
245
- .to produce_url("#{upload_path}/c_fill,w_auto:20:350/test")
246
- expect(["test", { :width => "auto:breakpoints", :crop => :fill }])
247
- .to produce_url("#{upload_path}/c_fill,w_auto:breakpoints/test")
248
- expect(["test", { :width => "auto:breakpoints_100_1900_20_15", :crop => :fill }])
249
- .to produce_url("#{upload_path}/c_fill,w_auto:breakpoints_100_1900_20_15/test")
250
- expect(["test", { :width => "auto:breakpoints:json", :crop => :fill }])
251
- .to produce_url("#{upload_path}/c_fill,w_auto:breakpoints:json/test")
252
- end
253
- it 'should support ih,iw' do
254
- expect(["test", {:width => "iw", :height => "ih", :crop => :crop}])
255
- .to produce_url("#{upload_path}/c_crop,h_ih,w_iw/test")
256
- end
257
- end
258
-
259
- it "should use x, y, radius, prefix, gravity and quality from options" do
260
- expect(["test", { :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => 0.4, :prefix => "a" }])
261
- .to produce_url("#{upload_path}/g_center,p_a,q_0.4,r_3,x_1,y_2/test")
262
- .and empty_options
263
-
264
- expect(["test", { :width => 0.5, :crop => :crop, :gravity => :auto }])
265
- .to produce_url("#{upload_path}/c_crop,g_auto,w_0.5/test")
266
- .and empty_options
267
- end
268
-
269
- describe "gravity" do
270
- it "should support auto" do
271
- expect(["test", {width: 100, height: 100, crop: 'crop', gravity: 'auto'}])
272
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/image/upload/c_crop,g_auto,h_100,w_100/test")
273
- .and mutate_options_to({width: 100, height: 100})
274
- expect(["test", {width: 100, height: 100, crop: 'crop', gravity: 'auto'}])
275
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/image/upload/c_crop,g_auto,h_100,w_100/test")
276
- .and mutate_options_to({width: 100, height: 100})
277
- end
278
- it "should support focal gravity" do
279
- ["adv_face", "adv_faces", "adv_eyes", "face", "faces", "body", "no_faces"].each do |focal|
280
- expect(["test", {width: 100, height: 100, crop: 'crop', gravity: "auto:#{focal}"}])
281
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/image/upload/c_crop,g_auto:#{focal},h_100,w_100/test")
282
- .and mutate_options_to({width: 100, height: 100})
283
- end
284
- end
285
- it "should support auto level with thumb cropping" do
286
- [0, 10, 100].each do |level|
287
- expect(["test", {width: 100, height: 100, crop: 'thumb', gravity: "auto:#{level}"}])
288
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/image/upload/c_thumb,g_auto:#{level},h_100,w_100/test")
289
- .and mutate_options_to({width: 100, height: 100})
290
- expect(["test", {width: 100, height: 100, crop: 'thumb', gravity: "auto:adv_faces:#{level}"}])
291
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/image/upload/c_thumb,g_auto:adv_faces:#{level},h_100,w_100/test")
292
- .and mutate_options_to({width: 100, height: 100})
293
- end
294
- end
295
- it "should support custom_no_override" do
296
- expect(["test", {width: 100, height: 100, crop: 'crop', gravity: "auto:custom_no_override"}])
297
- .to produce_url("http://res.cloudinary.com/#{cloud_name}/image/upload/c_crop,g_auto:custom_no_override,h_100,w_100/test")
298
- .and mutate_options_to({width: 100, height: 100})
299
- end
300
- end
301
-
302
- describe ":quality" do
303
- it "support a percent value" do
304
- expect(["test", { :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => 80, :prefix => "a" }])
305
- .to produce_url("#{upload_path}/g_center,p_a,q_80,r_3,x_1,y_2/test")
306
-
307
- expect(["test", { :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => "80:444", :prefix => "a" }])
308
- .to produce_url("#{upload_path}/g_center,p_a,q_80:444,r_3,x_1,y_2/test")
309
- end
310
- it "should support auto value" do
311
-
312
- expect(["test", { :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => "auto", :prefix => "a" }])
313
- .to produce_url("#{upload_path}/g_center,p_a,q_auto,r_3,x_1,y_2/test")
314
-
315
- expect(["test", { :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => "auto:good", :prefix => "a" }])
316
- .to produce_url("#{upload_path}/g_center,p_a,q_auto:good,r_3,x_1,y_2/test")
317
-
318
- end
319
- end
320
-
321
- describe ":transformation" do
322
- it "should support named transformation" do
323
- expect(["test", { :transformation => "blip" }])
324
- .to produce_url("#{upload_path}/t_blip/test")
325
- .and empty_options
326
- end
327
-
328
- it "should support array of named transformation" do
329
- expect(["test", { :transformation => ["blip", "blop"] }])
330
- .to produce_url("#{upload_path}/t_blip.blop/test")
331
- .and empty_options
332
- end
333
-
334
- it "should support base transformation" do
335
- expect(["test", { :transformation => { :x => 100, :y => 100, :crop => :fill }, :crop => :crop, :width => 100 }])
336
- .to produce_url("#{upload_path}/c_fill,x_100,y_100/c_crop,w_100/test")
337
- .and mutate_options_to({ :width => 100 })
338
- end
339
-
340
- it "should support array of base transformation" do
341
- expect(["test", { :transformation => [{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }], :crop => :crop, :width => 100 }])
342
- .to produce_url("#{upload_path}/c_fill,w_200,x_100,y_100/r_10/c_crop,w_100/test")
343
- .and mutate_options_to({ :width => 100 })
344
- end
345
-
346
- it "should support array of transformation" do
347
- result = Cloudinary::Utils.generate_transformation_string([{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }])
348
- expect(result).to eq("c_fill,w_200,x_100,y_100/r_10")
349
- end
350
-
351
- it "should not include empty transformation" do
352
- expect(["test", { :transformation => [{}, { :x => 100, :y => 100, :crop => :fill }, {}] }])
353
- .to produce_url("#{upload_path}/c_fill,x_100,y_100/test")
354
- .and empty_options
355
- end
356
-
357
- describe "should support and translate arithmetic operators" do
358
- it "should support * / + - ^" do
359
- t = [{:width => 'initial_width * 2 / 3 ^ 2', :height => 'initial_height + 2 - 3', :crop => 'scale'}]
360
- expected_trans = "c_scale,h_ih_add_2_sub_3,w_iw_mul_2_div_3_pow_2"
361
- expect(Cloudinary::Utils.cloudinary_url('sample', :transformation => t)).to eq("#{upload_path}/#{expected_trans}/sample")
362
- end
363
- end
364
- end
365
-
366
-
367
- it "should use type from options" do
368
- expect(["test", { :type => :facebook }])
369
- .to produce_url("#{root_path}/image/facebook/test")
370
- .and empty_options
371
- end
372
-
373
- it "should use resource_type from options" do
374
- expect(["test", { :resource_type => :raw }])
375
- .to produce_url("#{root_path}/raw/upload/test")
376
- .and empty_options
377
- end
378
-
379
- it "should ignore http links only if type is not given or is asset" do
380
- expect(["http://test", { :type => nil }])
381
- .to produce_url("http://test")
382
- .and empty_options
383
- expect(["http://test", { :type => :asset }])
384
- .to produce_url("http://test")
385
- .and empty_options
386
- expect(["http://test", { :type => :fetch }])
387
- .to produce_url("#{root_path}/image/fetch/http://test")
388
- .and empty_options
389
- end
390
-
391
- it "should use allow absolute links to /images" do
392
- expect(["/images/test", {}])
393
- .to produce_url("#{upload_path}/test")
394
- .and empty_options
395
- end
396
-
397
- it "should use ignore absolute links not to /images" do
398
- expect(["/js/test", {}])
399
- .to produce_url("/js/test")
400
- .and empty_options
401
- end
402
-
403
- it "should escape fetch urls" do
404
- expect(["http://blah.com/hello?a=b", { :type => :fetch }])
405
- .to produce_url("#{root_path}/image/fetch/http://blah.com/hello%3Fa%3Db")
406
- .and empty_options
407
- end
408
-
409
- it "should should escape http urls" do
410
- expect(["http://www.youtube.com/watch?v=d9NF2edxy-M", { :type => :youtube }])
411
- .to produce_url("#{root_path}/image/youtube/http://www.youtube.com/watch%3Fv%3Dd9NF2edxy-M")
412
- .and empty_options
413
- end
414
-
415
- it "should support background" do
416
- expect(["test", { :background => "red" }])
417
- .to produce_url("#{upload_path}/b_red/test")
418
- .and empty_options
419
- expect(["test", { :background => "#112233" }])
420
- .to produce_url("#{upload_path}/b_rgb:112233/test")
421
- .and empty_options
422
- end
423
-
424
- it "should support default_image" do
425
- expect(["test", { :default_image => "default" }])
426
- .to produce_url("#{upload_path}/d_default/test")
427
- .and empty_options
428
- end
429
-
430
- it "should support angle" do
431
- expect(["test", { :angle => "55" }])
432
- .to produce_url("#{upload_path}/a_55/test")
433
- .and empty_options
434
- expect(["test", { :angle => ["auto", "55"] }])
435
- .to produce_url("#{upload_path}/a_auto.55/test")
436
- .and empty_options
437
- end
438
-
439
- it "should process the radius correctly when given valid values" do
440
- valid_radius_test_values = [
441
- [10, 'r_10'],
442
- ['10', 'r_10'],
443
- ['$v', 'r_$v'],
444
- [[10, 20, 30], 'r_10:20:30'],
445
- [[10, 20, '$v'], 'r_10:20:$v'],
446
- [[10, 20, '$v', 40], 'r_10:20:$v:40'],
447
- [['10:20'], 'r_10:20'],
448
- [['10:20:$v:40'], 'r_10:20:$v:40']
449
- ]
450
- valid_radius_test_values.each do |options, expected|
451
- expect(["test", { :transformation => { :radius => options } }])
452
- .to produce_url("#{root_path}/image/upload/#{expected}/test") .and empty_options
453
- end
454
- end
455
-
456
- it "should throw an error when the radius is given invalid values" do
457
- invalid_radius_test_values = [
458
- [],
459
- [10,20,30,40,50]
460
- ]
461
- invalid_radius_test_values.each do |options|
462
- expect{Cloudinary::Utils.cloudinary_url("test", {:transformation => {:radius => options}})}
463
- .to raise_error(CloudinaryException)
464
- end
465
- end
466
-
467
- it "should support format for fetch urls" do
468
- expect(["http://cloudinary.com/images/logo.png", { :format => "jpg", :type => :fetch }])
469
- .to produce_url("#{root_path}/image/fetch/f_jpg/http://cloudinary.com/images/logo.png")
470
- .and empty_options
471
- end
472
-
473
- it "should support effect" do
474
- expect(["test", { :effect => "sepia" }])
475
- .to produce_url("#{upload_path}/e_sepia/test")
476
- .and empty_options
477
- end
478
-
479
- it "should support effect with hash param" do
480
- expect(["test", { :effect => { "sepia" => -10 } }])
481
- .to produce_url("#{upload_path}/e_sepia:-10/test")
482
- .and empty_options
483
- end
484
-
485
- it "should support effect with array param" do
486
- expect(["test", { :effect => ["sepia", 10] }])
487
- .to produce_url("#{upload_path}/e_sepia:10/test")
488
- .and empty_options
489
- end
490
-
491
- it "should support blur effect with ocr gravity" do
492
- expect(["test", { :effect => ["blur_region", 5000], :gravity => "ocr_text" }])
493
- .to produce_url("#{upload_path}/e_blur_region:5000,g_ocr_text/test")
494
- .and empty_options
495
- end
496
-
497
- it "should support artistic effect" do
498
- expect(["test", { :effect => "art:incognito"}])
499
- .to produce_url("#{upload_path}/e_art:incognito/test")
500
- .and empty_options
501
- end
502
-
503
- it "should support keyframe_interval" do
504
- expect(["test", { :keyframe_interval => 10 }])
505
- .to produce_url("#{upload_path}/ki_10/test")
506
- .and empty_options
507
- end
508
-
509
- it "should support streaming_profile" do
510
- expect(["test", { :streaming_profile => "some-profile" }])
511
- .to produce_url("#{upload_path}/sp_some-profile/test")
512
- .and empty_options
513
- end
514
-
515
- shared_examples "a signed url" do |specific_options = {}, specific_transformation = ""|
516
- let(:expected_transformation) do
517
- (specific_transformation.blank? || specific_transformation.match(/\/$/)) ? specific_transformation : "#{specific_transformation}/"
518
- end
519
- let! (:authenticated_image) do
520
- Cloudinary::Uploader.upload "http://res.cloudinary.com/demo/image/upload/sample.jpg",
521
- :type => 'authenticated',
522
- :tags => TEST_TAG
523
- end
524
- let(:options) { { :version => authenticated_image['version'], :sign_url => true, :type => :authenticated }.merge(specific_options) }
525
- let(:authenticated_path) { "#{root_path}/image/authenticated" }
526
-
527
- it "should correctly sign URL with version" do
528
- expect(["#{authenticated_image['public_id']}.jpg", options])
529
- .to produce_url(%r"#{authenticated_path}/s--[\w-]+--/#{expected_transformation}v#{authenticated_image['version']}/#{authenticated_image['public_id']}.jpg")
530
- .and empty_options
531
- end
532
- it "should correctly sign URL with transformation and version" do
533
- options[:transformation] = { :crop => "crop", :width => 10, :height => 20 }
534
- expect(["#{authenticated_image['public_id']}.jpg", options])
535
- .to produce_url(%r"#{authenticated_path}/s--[\w-]+--/c_crop,h_20,w_10/#{expected_transformation}v#{authenticated_image['version']}/#{authenticated_image['public_id']}.jpg")
536
- .and empty_options
537
- end
538
- it "should correctly sign URL with transformation" do
539
- options[:transformation] = { :crop => "crop", :width => 10, :height => 20 }
540
- expect(["#{authenticated_image['public_id']}.jpg", options])
541
- .to produce_url(%r"#{authenticated_path}/s--[\w-]+--/c_crop,h_20,w_10/#{expected_transformation}v#{authenticated_image['version']}/#{authenticated_image['public_id']}.jpg")
542
- .and empty_options
543
- .and be_served_by_cloudinary
544
- end
545
- it "should correctly sign fetch URL" do
546
- options[:type] = :fetch
547
- expect(["http://res.cloudinary.com/demo/sample.png", options])
548
- .to produce_url(%r"^#{root_path}/image/fetch/s--[\w-]+--/#{expected_transformation}v#{authenticated_image['version']}/http://res.cloudinary.com/demo/sample.png$")
549
- .and empty_options
550
- end
551
- end
552
-
553
-
554
- { 'overlay' => :l, :underlay => :u }.each do |param, letter|
555
- describe param do
556
- let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
557
- let(:layers_options) { [
558
- # [name, options, result]
559
- ["string", "text:hello", "text:hello"],
560
- ["public_id", { "public_id" => "logo" }, "logo"],
561
- ["public_id with folder", { "public_id" => "folder/logo" }, "folder:logo"],
562
- ["private", { "public_id" => "logo", "type" => "private" }, "private:logo"],
563
- ["format", { "public_id" => "logo", "format" => "png" }, "logo.png"],
564
- ["video", { "resource_type" => "video", "public_id" => "cat" }, "video:cat"],
565
- ] }
566
- it "should support #{param}" do
567
- layers_options.each do |name, options, result|
568
- expect(["test", { param => options }]).to produce_url("#{upload_path}/#{letter}_#{result}/test").and empty_options
569
- end
570
- end
571
-
572
- it "should not pass width/height to html for #{param}" do
573
- expect(["test", { param => "text:hello", :height => 100, :width => 100 }])
574
- .to produce_url("#{upload_path}/h_100,#{letter}_text:hello,w_100/test")
575
- .and empty_options
576
- end
577
- end
578
- end
579
-
580
- describe "text" do
581
-
582
- text_layer = "Hello World, /Nice to meet you?"
583
- text_encoded = "Hello%20World%252C%20%252FNice%20to%20meet%20you%3F"
584
-
585
- before :all do
586
- Cloudinary::Uploader.text(text_layer, {
587
- :public_id => "test_text",
588
- :overwrite => true,
589
- :font_family => "Arial",
590
- :font_size => "18",
591
- :tags => TEST_TAG
592
- })
593
- srt = Tempfile.new(['test_subtitles', '.srt'])
594
- srt.write <<-END
595
- 1
596
- 00:00:10,500 --> 00:00:13,000
597
- Hello World, Nice to meet you?
598
-
599
- END
600
- srt.rewind
601
- Cloudinary::Uploader.upload srt, :public_id => 'subtitles.srt', :resource_type => 'raw', :overwrite => true, :tags => TEST_TAG
602
- srt.unlink
603
- end
604
-
605
- include_context "cleanup"
606
-
607
- { 'overlay' => 'l' }.each do |param, short| # 'underlay' => 'u' behaves the same as overlay
608
- describe param do
609
- let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
610
- # [name, options, result]
611
- layers_options= [
612
- ["string", "text:test_text:hello", "text:test_text:hello"],
613
- ["explicit layer parameter", "text:test_text:#{text_encoded}", "text:test_text:#{text_encoded}"],
614
- ["text parameter", { :public_id => "test_text", :text => text_layer }, "text:test_text:#{text_encoded}"],
615
- ["text with font family and size parameters", { :text => text_layer, :font_family => "Arial", :font_size => "18" }, "text:Arial_18:#{text_encoded}"],
616
- ["text with text style parameter", { :text => text_layer, :font_family => "Arial", :font_size => "18", :font_weight => "bold", :font_style => "italic", :letter_spacing => 4, :line_spacing => 2 }, "text:Arial_18_bold_italic_letter_spacing_4_line_spacing_2:#{text_encoded}"],
617
- ["text with antialiasing and font hinting", { :text => "Hello World, Nice to meet you?", :font_family => "Arial", :font_size => "18", :font_antialiasing => "best", :font_hinting => "medium"}, "text:Arial_18_antialias_best_hinting_medium:Hello%20World%252C%20Nice%20to%20meet%20you%3F"],
618
- ["text with text style parameter (explicit)", "text:Arial_18_antialias_best_hinting_medium:Hello%20World%252C%20Nice%20to%20meet%20you%3F", "text:Arial_18_antialias_best_hinting_medium:Hello%20World%252C%20Nice%20to%20meet%20you%3F"],
619
- ["subtitles", { :resource_type => "subtitles", :public_id => "subtitles.srt" }, "subtitles:subtitles.srt"],
620
- ["subtitles with font family and size", { :resource_type => "subtitles", :public_id => "subtitles.srt", :font_family => "Arial", :font_size => "40" }, "subtitles:Arial_40:subtitles.srt"],
621
- ["image of type fetch", { :public_id => "http://res.cloudinary.com/demo/image/upload/ci", :type => "fetch" }, "fetch:aHR0cDovL3Jlcy5jbG91ZGluYXJ5LmNvbS9kZW1vL2ltYWdlL3VwbG9hZC9jaQ=="]
622
- ]
623
- layers_options.each do |name, options, result|
624
- it "should support #{name}" do
625
- expect(["sample.jpg", { param => options }]).to produce_url("#{upload_path}/#{short}_#{result}/sample.jpg").and empty_options
626
- # expect("#{upload_path}/#{short}_#{result}/sample.jpg").to be_served_by_cloudinary
627
- end
628
- unless options.is_a? String || param == 'underlay'
629
- op = Hash.new
630
- op[param] = options
631
- it_behaves_like "a signed url", op, "#{short}_#{result}"
632
- end
633
- end
634
-
635
- it "should not pass width/height to html for #{param}" do
636
- expect(["test", { param => "text:test_text", :height => 100, :width => 100 }])
637
- .to produce_url("#{upload_path}/h_100,#{short}_text:test_text,w_100/test")
638
- .and empty_options
639
-
640
- end
641
- end
642
- end
643
- end
644
-
645
-
646
- it "should use ssl_detected if secure is not given as parameter and not set to true in configuration" do
647
- expect(["test", { :ssl_detected => true }])
648
- .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
649
- .and empty_options
650
- end
651
-
652
- it "should use secure if given over ssl_detected and configuration" do
653
- Cloudinary.config.secure = true
654
- expect(["test", { :ssl_detected => true, :secure => false }])
655
- .to produce_url("#{upload_path}/test")
656
- .and empty_options
657
- end
658
-
659
- it "should use secure: true from configuration over ssl_detected" do
660
- Cloudinary.config.secure = true
661
- expect(["test", { :ssl_detected => false }])
662
- .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
663
- .and empty_options
664
- end
665
-
666
- it "should support extenal cname" do
667
- expect(["test", { :cname => "hello.com" }])
668
- .to produce_url("http://hello.com/#{cloud_name}/image/upload/test")
669
- .and empty_options
670
- end
671
-
672
- it "should support extenal cname with cdn_subdomain on" do
673
- expect(["test", { :cname => "hello.com", :private_cdn => true, :cdn_subdomain => true}])
674
- .to produce_url("http://a2.hello.com/image/upload/test")
675
- .and empty_options
676
- end
677
-
678
- it "should support cdn_subdomain with secure on if using shared_domain" do
679
- expect(["test", { :secure => true, :cdn_subdomain => true }])
680
- .to produce_url("https://res-2.cloudinary.com/#{cloud_name}/image/upload/test")
681
- .and empty_options
682
- end
683
-
684
- it "should support secure_cdn_subdomain false override with secure" do
685
- expect(["test", { :secure => true, :cdn_subdomain => true, :secure_cdn_subdomain => false }])
686
- .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
687
- .and empty_options
688
- end
689
-
690
- it "should support secure_cdn_subdomain true override with secure" do
691
- expect(["test", { :secure => true, :cdn_subdomain => true, :secure_cdn_subdomain => true, :private_cdn => true }])
692
- .to produce_url("https://#{cloud_name}-res-2.cloudinary.com/image/upload/test")
693
- .and empty_options
694
- end
695
-
696
- it "should support string param" do
697
- expect(["test", { "effect" => { "sepia" => 10 } }])
698
- .to produce_url("#{upload_path}/e_sepia:10/test")
699
- .and empty_options
700
- end
701
-
702
- it "should support border" do
703
- expect(["test", { "border" => { :width => 5 } }])
704
- .to produce_url("#{upload_path}/bo_5px_solid_black/test")
705
- .and empty_options
706
- expect(["test", { "border" => { :width => 5, :color => "#ffaabbdd" } }])
707
- .to produce_url("#{upload_path}/bo_5px_solid_rgb:ffaabbdd/test")
708
- .and empty_options
709
- expect(["test", { "border" => "1px_solid_blue" }])
710
- .to produce_url("#{upload_path}/bo_1px_solid_blue/test")
711
- .and empty_options
712
- expect(["test", { "border" => "2" }]).to produce_url("#{upload_path}/test").and mutate_options_to({ :border => "2" })
713
- end
714
-
715
- it "should support flags" do
716
- expect(["test", { "flags" => "abc" }])
717
- .to produce_url("#{upload_path}/fl_abc/test")
718
- .and empty_options
719
- expect(["test", { "flags" => ["abc", "def"] }])
720
- .to produce_url("#{upload_path}/fl_abc.def/test")
721
- .and empty_options
722
- end
723
-
724
- it "should support aspect ratio" do
725
- expect(["test", { "aspect_ratio" => "1.0" }])
726
- .to produce_url("#{upload_path}/ar_1.0/test")
727
- .and empty_options
728
- expect(["test", { "aspect_ratio" => "3:2" }])
729
- .to produce_url("#{upload_path}/ar_3:2/test")
730
- .and empty_options
731
- end
732
-
733
- it "build_upload_params should not destroy options" do
734
- options = { :width => 100, :crop => :scale }
735
- expect(Cloudinary::Uploader.build_upload_params(options)[:transformation]).to eq("c_scale,w_100")
736
- expect(options.length).to eq(2)
737
- end
738
-
739
- it "build_upload_params canonize booleans" do
740
- options = { :backup => true, :use_filename => false, :colors => :true,
741
- :image_metadata => :false, :invalidate => 1 }
742
- params = Cloudinary::Uploader.build_upload_params(options)
743
- expect(Cloudinary::Api.only(params, *options.keys))
744
- .to eq(:backup => 1,
745
- :use_filename => 0,
746
- :colors => 1,
747
- :image_metadata => 0,
748
- :invalidate => 1
749
- )
750
- options = { :colors => "true", :exif => "false", :eager_async => "1" }
751
- params = Cloudinary::Uploader.build_upload_params(options)
752
- expect(Cloudinary::Api.only(params, *options.keys))
753
- .to eq(:exif => 0, :colors => 1, :eager_async => 1)
754
- expect(Cloudinary::Uploader.build_upload_params(:backup => nil)[:backup]).to be_nil
755
- expect(Cloudinary::Uploader.build_upload_params({})[:backup]).to be_nil
756
- end
757
-
758
- it "should add version if public_id contains /" do
759
- expect(["folder/test", {}])
760
- .to produce_url("#{upload_path}/v1/folder/test")
761
- .and empty_options
762
- expect(["folder/test", { :version => 123 }])
763
- .to produce_url("#{upload_path}/v123/folder/test")
764
- .and empty_options
765
- end
766
-
767
- it "should not add version if public_id contains version already" do
768
- expect(["v1234/test", {}])
769
- .to produce_url("#{upload_path}/v1234/test")
770
- .and empty_options
771
- end
772
-
773
- it "should default force_version to True if no value is given" do
774
- expect(["folder/test", {}])
775
- .to produce_url("#{upload_path}/v1/folder/test")
776
- .and empty_options
777
- end
778
-
779
- it "should exclude the version if resource is stored in a folder and force_version is False" do
780
- expect(["folder/test", {:force_version => false}])
781
- .to produce_url("#{upload_path}/folder/test")
782
- .and empty_options
783
- end
784
-
785
- it "should include the version if given explicitly regardless of force_verison (without folder)" do
786
- expect(["test", {:force_version => false, :version => 12345}])
787
- .to produce_url("#{upload_path}/v12345/test")
788
- .and empty_options
789
- end
790
-
791
- it "should include the version if given explicitly regardless of force_verison (with folder)" do
792
- expect(["folder/test", {:force_version => false, :version => 12345}])
793
- .to produce_url("#{upload_path}/v12345/folder/test")
794
- .and empty_options
795
- end
796
-
797
- it "should use the force_version option if set in the global config" do
798
- Cloudinary.config(:force_version => false)
799
- expect(["folder/test", {}])
800
- .to produce_url("#{upload_path}/folder/test")
801
- .and empty_options
802
- end
803
-
804
- it "should ignore the global force_version config if version is set explicitly in the options" do
805
- Cloudinary.config(:force_version => false)
806
- expect(["folder/test", {:version => 12345}])
807
- .to produce_url("#{upload_path}/v12345/folder/test")
808
- .and empty_options
809
- end
810
-
811
- it "should override global config option if force_version is given within options" do
812
- Cloudinary.config(:force_version => false)
813
- expect(["folder/test", {:force_version => true}])
814
- .to produce_url("#{upload_path}/v1/folder/test")
815
- .and empty_options
816
- end
817
-
818
- it "should allow to shorted image/upload urls" do
819
- expect(["test", { :shorten => true }])
820
- .to produce_url("#{root_path}/iu/test")
821
- .and empty_options
822
- end
823
-
824
- it "should allow to use folders in PreloadedFile" do
825
- signature = Cloudinary::Utils.api_sign_request({ :public_id => "folder/file", :version => "1234" }, Cloudinary.config.api_secret)
826
- preloaded = Cloudinary::PreloadedFile.new("image/upload/v1234/folder/file.jpg#" + signature)
827
- expect(preloaded).to be_valid
828
- [
829
- [:filename, 'folder/file.jpg'],
830
- [:version, '1234'],
831
- [:public_id, 'folder/file'],
832
- [:signature, signature],
833
- [:resource_type, 'image'],
834
- [:type, 'upload'],
835
- [:format, 'jpg']
836
- ].each do |attr,value|
837
- expect(preloaded.send(attr)).to eq(value)
838
- end
839
- end
840
-
841
- it "should escape public_ids" do
842
- [
843
- ["a b", "a%20b"],
844
- ["a+b", "a%2Bb"],
845
- ["a%20b", "a%20b"],
846
- ["a-b", "a-b"],
847
- ["a??b", "a%3F%3Fb"],
848
- ["parentheses(interject)", "parentheses%28interject%29"]
849
- ].each do
850
- |source, target|
851
- expect(Cloudinary::Utils.cloudinary_url(source)).to eq("#{upload_path}/#{target}")
852
- end
853
- end
854
-
855
-
856
- describe ":sign_url" do
857
- it_behaves_like "a signed url"
858
- end
859
-
860
- describe ":sign_version (deprecated)" do
861
- it_behaves_like "a signed url", :sign_version => true
862
- end
863
-
864
- it "should correctly sign_request" do
865
- params = Cloudinary::Utils.sign_request(
866
- {
867
- :public_id => "folder/file",
868
- :version => "1234" },
869
- {
870
- :cloud_name => "demo",
871
- :api_key => "1234",
872
- :api_secret => "b"
873
- }
874
- )
875
- expect(params).to include(:signature => "7a3349cbb373e4812118d625047ede50b90e7b67")
876
- end
877
-
878
- it "should support responsive width" do
879
- expect(["test", { :width => 100, :height => 100, :crop => :crop, :responsive_width => true }])
880
- .to produce_url("#{upload_path}/c_crop,h_100,w_100/c_limit,w_auto/test")
881
- .and mutate_options_to({ :responsive => true })
882
- Cloudinary.config.responsive_width_transformation = { :width => :auto, :crop => :pad }
883
- expect(["test", { :width => 100, :height => 100, :crop => :crop, :responsive_width => true }])
884
- .to produce_url("#{upload_path}/c_crop,h_100,w_100/c_pad,w_auto/test")
885
- .and mutate_options_to({ :responsive => true })
886
- end
887
-
888
- it "should correctly encode double arrays" do
889
- expect(Cloudinary::Utils.encode_double_array([1, 2, 3, 4])).to eq("1,2,3,4")
890
- expect(Cloudinary::Utils.encode_double_array([[1, 2, 3, 4], [5, 6, 7, 8]])).to eq("1,2,3,4|5,6,7,8")
891
- end
892
-
893
- describe ":if" do
894
- describe 'with literal condition string' do
895
- it "should include the if parameter as the first component in the transformation string" do
896
- expect(["sample", { if: "w_lt_200", crop: "fill", height: 120, width: 80 }])
897
- .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/sample")
898
- expect(["sample", { crop: "fill", height: 120, if: "w_lt_200", width: 80 }])
899
- .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/sample")
900
-
901
- end
902
- it "should allow multiple conditions when chaining transformations " do
903
- expect(["sample", transformation: [{ if: "w_lt_200", crop: "fill", height: 120, width: 80 },
904
- { if: "w_gt_400", crop: "fit", width: 150, height: 150 },
905
- { effect: "sepia" }]])
906
- .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/if_w_gt_400,c_fit,h_150,w_150/e_sepia/sample")
907
- end
908
- it "should allow multiple tags condition" do
909
- expect(["sample", transformation: [{ if: "!tag1:tag2:tag3!_in_tags", crop: "fill", height: 120, width: 80 },
910
- { if: "else", crop: "fit", width: 150, height: 150 },
911
- { effect: "sepia" }]])
912
- .to produce_url("#{upload_path}/if_!tag1:tag2:tag3!_in_tags,c_fill,h_120,w_80/if_else,c_fit,h_150,w_150/e_sepia/sample")
913
- end
914
-
915
- describe "including spaces and operators" do
916
- it "should translate operators" do
917
- expect(["sample", { if: "w < 200", crop: "fill", height: 120, width: 80 }])
918
- .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/sample")
919
- end
920
- end
921
-
922
- describe 'if end' do
923
- it "should include the if_end as the last parameter in its component" do
924
- expect(["sample", transformation: [{ if: "w_lt_200" },
925
- { crop: "fill", height: 120, width: 80, effect: "sharpen" },
926
- { effect: "brightness:50" },
927
- { effect: "shadow", color: "red" },
928
- { if: "end" }]])
929
- .to produce_url("#{upload_path}/if_w_lt_200/c_fill,e_sharpen,h_120,w_80/e_brightness:50/co_red,e_shadow/if_end/sample")
930
- end
931
- it "should support if_else with transformation parameters" do
932
- expect(["sample", transformation: [{ if: "w_lt_200", crop: "fill", height: 120, width: 80 },
933
- { if: "else", crop: "fill", height: 90, width: 100 }]])
934
- .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/if_else,c_fill,h_90,w_100/sample")
935
- end
936
- it "if_else should be without any transformation parameters" do
937
- expect(["sample", transformation: [{ if: "w_lt_200" },
938
- { crop: "fill", height: 120, width: 80 },
939
- { if: "else" },
940
- { crop: "fill", height: 90, width: 100 }]])
941
- .to produce_url("#{upload_path}/if_w_lt_200/c_fill,h_120,w_80/if_else/c_fill,h_90,w_100/sample")
942
- end
943
- end
944
- it "should support and translate operators: '=', '!=', '<', '>', '<=', '>=', '&&', '||'" do
945
-
946
- all_operators =
947
- 'if_' +
948
- 'w_eq_0_and' +
949
- '_w_ne_0_or' +
950
- '_h_lt_0_and' +
951
- '_ar_gt_0_and' +
952
- '_pc_lte_0_and' +
953
- '_fc_gte_0' +
954
- ',e_grayscale'
955
-
956
- expect( ["sample",
957
- :if =>"width = 0 && w != 0 || height < 0 and aspect_ratio > 0 and page_count <= 0 and face_count >= 0",
958
- :effect =>"grayscale"])
959
- .to produce_url("#{upload_path}/#{all_operators}/sample")
960
- end
961
- end
962
-
963
- describe "variables" do
964
- it "array should define a set of variables" do
965
- options = {
966
- :if => "face_count > 2",
967
- :variables => [ ["$z", 5], ["$foo", "$z * 2"] ],
968
- :crop => "scale", :width => "$foo * 200"
969
- }
970
- t = Cloudinary::Utils.generate_transformation_string options
971
- expect(t).to eq("if_fc_gt_2,$z_5,$foo_$z_mul_2,c_scale,w_$foo_mul_200")
972
- end
973
- it "'$key' should define a variable" do
974
- options = { :transformation => [
975
- {"$foo" => 10 },
976
- {:if => "face_count > 2"},
977
- {:crop => "scale", :width => "$foo * 200 / face_count"},
978
- {:if => "end"}
979
- ] }
980
- t = Cloudinary::Utils.generate_transformation_string options
981
- expect(t).to eq("$foo_10/if_fc_gt_2/c_scale,w_$foo_mul_200_div_fc/if_end")
982
- end
983
- it "should support text values" do
984
- expect( ["sample", :effect => "$efname:100", "$efname" => "!blur!"]).to produce_url "#{upload_path}/$efname_!blur!,e_$efname:100/sample"
985
-
986
- end
987
- it "should support string interpolation" do
988
- expect( ["sample", :crop => "scale", :overlay => {:text => "$(start)Hello $(name)$(ext), $(no ) $( no)$(end)", :font_family => "Arial", :font_size => "18"} ]).to produce_url "#{upload_path}/c_scale,l_text:Arial_18:$(start)Hello%20$(name)$(ext)%252C%20%24%28no%20%29%20%24%28%20no%29$(end)/sample"
989
-
990
- end
991
- end
992
-
993
- describe "context" do
994
- it 'should escape pipe and backslash characters' do
995
- context = {"caption" => "different = caption", "alt2" => "alt|alternative"}
996
- result = Cloudinary::Utils.encode_context(context)
997
- expect(result).to eq("caption=different \\= caption|alt2=alt\\|alternative")
998
- .or eq("alt2=alt\\|alternative|caption=different \\= caption")
999
-
1000
- end
1001
- it 'should support symbols' do
1002
- context = {:symbol_key => "string_value", "string_key" => :symbol_value}
1003
- result = Cloudinary::Utils.encode_context(context)
1004
- expect(result).to eq("string_key=symbol_value|symbol_key=string_value")
1005
- .or eq("symbol_key=string_value|string_key=symbol_value")
1006
- end
1007
- end
1008
-
1009
- describe "customFunction" do
1010
- custom_function_wasm = {
1011
- :function_type => 'wasm',
1012
- :source => 'blur.wasm'
1013
- }
1014
- custom_function_wasm_str = 'wasm:blur.wasm'
1015
-
1016
- custom_function_remote = {
1017
- :function_type => 'remote',
1018
- :source => 'https://df34ra4a.execute-api.us-west-2.amazonaws.com/default/cloudinaryFunction'
1019
- }
1020
- custom_function_remote_str = 'remote:aHR0cHM6Ly9kZjM0cmE0YS5leGVjdXRlLWFwaS51cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9kZWZhdWx0L2Nsb3VkaW5hcnlGdW5jdGlvbg=='
1021
-
1022
- it 'should accept a string value' do
1023
- actual = Cloudinary::Utils.generate_transformation_string :custom_function => custom_function_wasm_str
1024
- expect( actual).to eq("fn_#{custom_function_wasm_str}")
1025
- end
1026
- it 'should accept a hash of options' do
1027
- actual = Cloudinary::Utils.generate_transformation_string :custom_function => custom_function_wasm
1028
- expect( actual).to eq("fn_#{custom_function_wasm_str}")
1029
- end
1030
- it 'should base64 encoded URL for a remote function' do
1031
- actual = Cloudinary::Utils.generate_transformation_string :custom_function => custom_function_remote
1032
- expect( actual).to eq("fn_#{custom_function_remote_str}")
1033
-
1034
- end
1035
-
1036
- it 'should accept a string value' do
1037
- actual = Cloudinary::Utils.generate_transformation_string :custom_pre_function => custom_function_wasm_str
1038
- expect( actual).to eq("fn_pre:#{custom_function_wasm_str}")
1039
- end
1040
- it 'should accept a hash of options' do
1041
- actual = Cloudinary::Utils.generate_transformation_string :custom_pre_function => custom_function_wasm
1042
- expect( actual).to eq("fn_pre:#{custom_function_wasm_str}")
1043
- end
1044
- it 'should base64 encoded URL for a remote function' do
1045
- actual = Cloudinary::Utils.generate_transformation_string :custom_pre_function => custom_function_remote
1046
- expect( actual).to eq("fn_pre:#{custom_function_remote_str}")
1047
-
1048
- end
1049
-
1050
- end
1051
- end
1052
- end