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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/cloudinary.gemspec +1 -2
- data/lib/active_storage/service/cloudinary_service.rb +0 -1
- data/lib/cloudinary/utils.rb +1 -1
- data/lib/cloudinary/version.rb +1 -1
- metadata +3 -185
- data/spec/access_control_spec.rb +0 -102
- data/spec/active_storage/Gemfile +0 -12
- data/spec/active_storage/application_system_test_case.rb +0 -5
- data/spec/active_storage/database/create_users_migration.rb +0 -9
- data/spec/active_storage/database/setup.rb +0 -7
- data/spec/active_storage/dummy/Rakefile +0 -5
- data/spec/active_storage/dummy/app/assets/config/manifest.js +0 -3
- data/spec/active_storage/dummy/app/assets/javascripts/application.js +0 -13
- data/spec/active_storage/dummy/app/assets/stylesheets/application.css +0 -15
- data/spec/active_storage/dummy/app/controllers/application_controller.rb +0 -5
- data/spec/active_storage/dummy/app/helpers/application_helper.rb +0 -4
- data/spec/active_storage/dummy/app/jobs/application_job.rb +0 -4
- data/spec/active_storage/dummy/app/models/application_record.rb +0 -5
- data/spec/active_storage/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/active_storage/dummy/bin/bundle +0 -5
- data/spec/active_storage/dummy/bin/rails +0 -6
- data/spec/active_storage/dummy/bin/rake +0 -6
- data/spec/active_storage/dummy/bin/yarn +0 -11
- data/spec/active_storage/dummy/config.ru +0 -7
- data/spec/active_storage/dummy/config/application.rb +0 -22
- data/spec/active_storage/dummy/config/boot.rb +0 -7
- data/spec/active_storage/dummy/config/database.yml +0 -25
- data/spec/active_storage/dummy/config/environment.rb +0 -7
- data/spec/active_storage/dummy/config/environments/development.rb +0 -52
- data/spec/active_storage/dummy/config/environments/production.rb +0 -83
- data/spec/active_storage/dummy/config/environments/test.rb +0 -38
- data/spec/active_storage/dummy/config/initializers/application_controller_renderer.rb +0 -7
- data/spec/active_storage/dummy/config/initializers/assets.rb +0 -16
- data/spec/active_storage/dummy/config/initializers/backtrace_silencers.rb +0 -8
- data/spec/active_storage/dummy/config/initializers/cookies_serializer.rb +0 -7
- data/spec/active_storage/dummy/config/initializers/filter_parameter_logging.rb +0 -6
- data/spec/active_storage/dummy/config/initializers/inflections.rb +0 -17
- data/spec/active_storage/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/active_storage/dummy/config/initializers/wrap_parameters.rb +0 -16
- data/spec/active_storage/dummy/config/routes.rb +0 -4
- data/spec/active_storage/dummy/config/secrets.yml +0 -32
- data/spec/active_storage/dummy/config/spring.rb +0 -8
- data/spec/active_storage/dummy/config/storage.yml +0 -3
- data/spec/active_storage/dummy/config/webpacker.yml +0 -72
- data/spec/active_storage/dummy/package.json +0 -5
- data/spec/active_storage/dummy/public/404.html +0 -67
- data/spec/active_storage/dummy/public/422.html +0 -67
- data/spec/active_storage/dummy/public/500.html +0 -66
- data/spec/active_storage/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/active_storage/dummy/public/apple-touch-icon.png +0 -0
- data/spec/active_storage/dummy/public/favicon.ico +0 -0
- data/spec/active_storage/fixtures/files/colors.bmp +0 -0
- data/spec/active_storage/fixtures/files/empty_file.txt +0 -0
- data/spec/active_storage/fixtures/files/favicon.ico +0 -0
- data/spec/active_storage/fixtures/files/icon.psd +0 -0
- data/spec/active_storage/fixtures/files/icon.svg +0 -13
- data/spec/active_storage/fixtures/files/image.gif +0 -0
- data/spec/active_storage/fixtures/files/racecar.jpg +0 -0
- data/spec/active_storage/fixtures/files/racecar.tif +0 -0
- data/spec/active_storage/fixtures/files/racecar_rotated.jpg +0 -0
- data/spec/active_storage/fixtures/files/report.pdf +0 -0
- data/spec/active_storage/fixtures/files/rotated_video.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video_with_rectangular_samples.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video_with_undefined_display_aspect_ratio.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video_without_video_stream.mp4 +0 -0
- data/spec/active_storage/service/cloudinary_service_spec.rb +0 -107
- data/spec/active_storage/service/configurations.yml +0 -4
- data/spec/active_storage/test_helper.rb +0 -43
- data/spec/api_spec.rb +0 -623
- data/spec/archive_spec.rb +0 -145
- data/spec/auth_token_spec.rb +0 -77
- data/spec/cache_spec.rb +0 -109
- data/spec/cloudinary_helper_spec.rb +0 -327
- data/spec/cloudinary_spec.rb +0 -56
- data/spec/data/sync_static/app/assets/javascripts/1.coffee +0 -1
- data/spec/data/sync_static/app/assets/javascripts/1.js +0 -1
- data/spec/data/sync_static/app/assets/stylesheets/1.css +0 -3
- data/spec/docx.docx +0 -0
- data/spec/favicon.ico +0 -0
- data/spec/image_spec.rb +0 -107
- data/spec/logo.png +0 -0
- data/spec/movie.mp4 +0 -0
- data/spec/rake_spec.rb +0 -160
- data/spec/sample_asset_file.tsv +0 -4
- data/spec/search_spec.rb +0 -109
- data/spec/spec_helper.rb +0 -273
- data/spec/storage_spec.rb +0 -44
- data/spec/streaminig_profiles_api_spec.rb +0 -74
- data/spec/support/helpers/temp_file_helpers.rb +0 -22
- data/spec/support/shared_contexts/rake.rb +0 -19
- data/spec/uploader_spec.rb +0 -409
- data/spec/utils_methods_spec.rb +0 -81
- data/spec/utils_spec.rb +0 -1052
- data/spec/video_tag_spec.rb +0 -253
- data/spec/video_url_spec.rb +0 -185
data/spec/spec_helper.rb
DELETED
@@ -1,273 +0,0 @@
|
|
1
|
-
SUFFIX = ENV['TRAVIS_JOB_ID'] || rand(999999999).to_s
|
2
|
-
|
3
|
-
require 'rspec'
|
4
|
-
require 'rexml/parsers/ultralightparser'
|
5
|
-
require 'nokogiri'
|
6
|
-
require 'rspec/version'
|
7
|
-
require 'rest_client'
|
8
|
-
require 'active_storage/test_helper' if RUBY_VERSION >= '2.2.2'
|
9
|
-
require 'cloudinary'
|
10
|
-
|
11
|
-
Cloudinary.config.enhance_image_tag = true
|
12
|
-
|
13
|
-
DUMMY_CLOUD = "test123"
|
14
|
-
TEST_IMAGE_URL = "http://cloudinary.com/images/old_logo.png"
|
15
|
-
TEST_IMG = "spec/logo.png"
|
16
|
-
TEST_VIDEO = "spec/movie.mp4"
|
17
|
-
TEST_RAW = "spec/docx.docx"
|
18
|
-
TEST_IMG_W = 241
|
19
|
-
TEST_IMG_H = 51
|
20
|
-
TEST_TAG = 'cloudinary_gem_test'
|
21
|
-
TIMESTAMP_TAG = "#{TEST_TAG}_#{SUFFIX}_#{RUBY_VERSION}_#{ defined? Rails::version ? Rails::version : 'no_rails'}"
|
22
|
-
UNIQUE_TEST_FOLDER = "#{TEST_TAG}_#{SUFFIX}_folder"
|
23
|
-
NEXT_CURSOR = "db27cfb02b3f69cb39049969c23ca430c6d33d5a3a7c3ad1d870c54e1a54ee0faa5acdd9f6d288666986001711759d10"
|
24
|
-
GENERIC_FOLDER_NAME = "some_folder"
|
25
|
-
|
26
|
-
# Auth token
|
27
|
-
KEY = "00112233FF99"
|
28
|
-
ALT_KEY = "CCBB2233FF00"
|
29
|
-
CACHE_KEY = "some_key" + SUFFIX
|
30
|
-
|
31
|
-
module ResponsiveTest
|
32
|
-
TRANSFORMATION = {:angle => 45, :crop => "scale"}
|
33
|
-
FORMAT = "png"
|
34
|
-
IMAGE_BP_VALUES = [206, 50]
|
35
|
-
BREAKPOINTS = [100, 200, 300, 399]
|
36
|
-
|
37
|
-
end
|
38
|
-
Dir[File.join(File.dirname(__FILE__), '/support/**/*.rb')].each {|f| require f}
|
39
|
-
|
40
|
-
module RSpec
|
41
|
-
def self.project_root
|
42
|
-
File.join(File.dirname(__FILE__), '..')
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
47
|
-
RSpec.configure do |config|
|
48
|
-
unless RSpec::Version::STRING.match( /^3/)
|
49
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
50
|
-
end
|
51
|
-
config.run_all_when_everything_filtered = true
|
52
|
-
config.filter_run_excluding :delete_all => true
|
53
|
-
end
|
54
|
-
|
55
|
-
RSpec.shared_context "cleanup" do |tag|
|
56
|
-
tag ||= TEST_TAG
|
57
|
-
after :all do
|
58
|
-
Cloudinary::Api.delete_resources_by_tag(tag) unless Cloudinary.config.keep_test_products
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
module Cloudinary
|
63
|
-
def self.reset_config
|
64
|
-
@@config = nil
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
CALLS_SERVER_WITH_PARAMETERS = "calls server with parameters"
|
71
|
-
RSpec.shared_examples CALLS_SERVER_WITH_PARAMETERS do |expected|
|
72
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
73
|
-
end
|
74
|
-
|
75
|
-
# Create a regexp with the given +tag+ name.
|
76
|
-
def html_tag_matcher( tag)
|
77
|
-
/<#{tag}([\s]+([-[:word:]]+)[\s]*\=\s*\"([^\"]*)\")*\s*>.*<\s*\/#{tag}\s*>/
|
78
|
-
end
|
79
|
-
|
80
|
-
# Represents an HTML tag
|
81
|
-
class TestTag
|
82
|
-
attr_accessor :element
|
83
|
-
# Creates a new +TestTag+ from a given +element+ string
|
84
|
-
def initialize(element)
|
85
|
-
@html_string = element
|
86
|
-
@element = valid_tag(element) unless element.is_a? Array
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
def name
|
91
|
-
@element.name
|
92
|
-
end
|
93
|
-
|
94
|
-
def attributes
|
95
|
-
@element.attributes
|
96
|
-
end
|
97
|
-
|
98
|
-
def children
|
99
|
-
@element.children
|
100
|
-
end
|
101
|
-
# Parses a given +tag+ in string format
|
102
|
-
def valid_tag(tag)
|
103
|
-
parser = Nokogiri::HTML::Document.parse( tag)
|
104
|
-
# Parsed code will be strctured as either html>body>tag or html>head>tag
|
105
|
-
parser.children[1].children[0].children[0]
|
106
|
-
end
|
107
|
-
|
108
|
-
# Returns attribute named +symbol_or_string+
|
109
|
-
def [](symbol_or_string)
|
110
|
-
begin
|
111
|
-
attributes[symbol_or_string.to_s].value
|
112
|
-
rescue
|
113
|
-
nil
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def method_missing(symbol, *args)
|
118
|
-
if (m = /children_by_(\w+)/.match(symbol.to_s)) and !args.empty?
|
119
|
-
return unless children
|
120
|
-
children.select{ |c| c[m[1]] == args[0]}
|
121
|
-
else
|
122
|
-
super
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def ==(other)
|
127
|
-
case other
|
128
|
-
when String
|
129
|
-
@text == other
|
130
|
-
else
|
131
|
-
other.respond_to?( :text) &&
|
132
|
-
other.respond_to?( :name) &&
|
133
|
-
other.respond_to?( :attributes) &&
|
134
|
-
other.respond_to?( :children) &&
|
135
|
-
@text == other.text &&
|
136
|
-
@name == other.name &&
|
137
|
-
@attributes == other.attributes &&
|
138
|
-
@children == other.children
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
RSpec::Matchers.define :produce_url do |expected_url|
|
144
|
-
match do |params|
|
145
|
-
public_id, options = params
|
146
|
-
actual_options = options.clone
|
147
|
-
@url = Cloudinary::Utils.cloudinary_url(public_id, actual_options)
|
148
|
-
values_match? expected_url, @url
|
149
|
-
end
|
150
|
-
failure_message do |actual|
|
151
|
-
"expected #{actual} to\nproduce: #{expected_url}\nbut got: #{@url}"
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
RSpec::Matchers.define :mutate_options_to do |expected_options|
|
156
|
-
match do |params|
|
157
|
-
public_id, options = params
|
158
|
-
options = options.clone
|
159
|
-
Cloudinary::Utils.cloudinary_url(public_id, options)
|
160
|
-
@actual = options
|
161
|
-
values_match? expected_options, @actual
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
RSpec::Matchers.define :empty_options do
|
166
|
-
match do |params|
|
167
|
-
public_id, options = params
|
168
|
-
options = options.clone
|
169
|
-
Cloudinary::Utils.cloudinary_url(public_id, options)
|
170
|
-
options.empty?
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
# Verify that the given URL can be served by Cloudinary by fetching the resource from the server
|
175
|
-
RSpec::Matchers.define :be_served_by_cloudinary do
|
176
|
-
match do |url|
|
177
|
-
if url.is_a? Array
|
178
|
-
url, options = url
|
179
|
-
url = Cloudinary::Utils.cloudinary_url(url, options.clone)
|
180
|
-
if Cloudinary.config.upload_prefix
|
181
|
-
res_prefix_uri = URI.parse(Cloudinary.config.upload_prefix)
|
182
|
-
res_prefix_uri.path = '/res'
|
183
|
-
url.gsub!(/https?:\/\/res.cloudinary.com/, res_prefix_uri.to_s)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
code = 0
|
187
|
-
@url = url
|
188
|
-
RestClient.get @url do |response, request, result|
|
189
|
-
@result = result
|
190
|
-
code = response.code
|
191
|
-
end
|
192
|
-
values_match? 200, code
|
193
|
-
end
|
194
|
-
|
195
|
-
failure_message do |actual|
|
196
|
-
if @result
|
197
|
-
"Couldn't serve #{actual}. #{@result["status"]}: #{@result["x-cld-error"]}"
|
198
|
-
else
|
199
|
-
"Couldn't serve #{actual}."
|
200
|
-
end
|
201
|
-
end
|
202
|
-
failure_message_when_negated do |actual|
|
203
|
-
if @result
|
204
|
-
"Expected #{@url} not to be served by cloudinary. #{@result["status"]}: #{@result["x-cld-error"]}"
|
205
|
-
else
|
206
|
-
"Expected #{@url} not to be served by cloudinary."
|
207
|
-
end
|
208
|
-
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
def deep_fetch(hash, path)
|
213
|
-
Array(path).reduce(hash) { |h, key| h && h.fetch(key, nil) }
|
214
|
-
end
|
215
|
-
|
216
|
-
# Matches deep values in the actual Hash, disregarding other keys and values.
|
217
|
-
# @example
|
218
|
-
# expect( {:foo => { :bar => 'foobar'}}).to have_deep_hash_values_of( [:foo, :bar] => 'foobar')
|
219
|
-
# expect( foo_instance).to receive(:bar_method).with(deep_hash_values_of([:foo, :bar] => 'foobar'))
|
220
|
-
RSpec::Matchers.define :deep_hash_value do |expected|
|
221
|
-
match do |actual|
|
222
|
-
expected.all? do |path, value|
|
223
|
-
Cloudinary.values_match? value, deep_fetch(actual, path)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
RSpec::Matchers.alias_matcher :have_deep_hash_values_of, :deep_hash_value
|
229
|
-
|
230
|
-
module Cloudinary
|
231
|
-
# @api private
|
232
|
-
def self.values_match?(expected, actual)
|
233
|
-
if Hash === actual
|
234
|
-
return hashes_match?(expected, actual) if Hash === expected
|
235
|
-
elsif Array === expected && Enumerable === actual && !(Struct === actual)
|
236
|
-
return arrays_match?(expected, actual.to_a)
|
237
|
-
elsif Regexp === expected
|
238
|
-
return expected.match actual.to_s
|
239
|
-
end
|
240
|
-
|
241
|
-
|
242
|
-
return true if actual == expected
|
243
|
-
|
244
|
-
begin
|
245
|
-
expected === actual
|
246
|
-
rescue ArgumentError
|
247
|
-
# Some objects, like 0-arg lambdas on 1.9+, raise
|
248
|
-
# ArgumentError for `expected === actual`.
|
249
|
-
false
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
# @private
|
254
|
-
def self.arrays_match?(expected_list, actual_list)
|
255
|
-
return false if expected_list.size != actual_list.size
|
256
|
-
|
257
|
-
expected_list.zip(actual_list).all? do |expected, actual|
|
258
|
-
values_match?(expected, actual)
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
# @private
|
263
|
-
def self.hashes_match?(expected_hash, actual_hash)
|
264
|
-
return false if expected_hash.size != actual_hash.size
|
265
|
-
|
266
|
-
expected_hash.all? do |expected_key, expected_value|
|
267
|
-
actual_value = actual_hash.fetch(expected_key) { return false }
|
268
|
-
values_match?(expected_value, actual_value)
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
private_class_method :arrays_match?, :hashes_match?
|
273
|
-
end
|
data/spec/storage_spec.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'cloudinary'
|
3
|
-
|
4
|
-
module CarrierWave
|
5
|
-
module Storage
|
6
|
-
class Abstract
|
7
|
-
def initialize(uploader)
|
8
|
-
@uploader = uploader
|
9
|
-
end
|
10
|
-
|
11
|
-
attr_accessor :uploader
|
12
|
-
end
|
13
|
-
end
|
14
|
-
class SanitizedFile; end
|
15
|
-
end
|
16
|
-
|
17
|
-
RSpec.describe Cloudinary::CarrierWave::Storage do
|
18
|
-
describe '#store_cloudinary_identifier' do
|
19
|
-
let(:column) { 'example_field' }
|
20
|
-
let(:model) { double :model, _mounter: mount, write_attribute: true }
|
21
|
-
let(:mount) { double :mount, serialization_column: column }
|
22
|
-
let(:storage) { Cloudinary::CarrierWave::Storage.new(uploader) }
|
23
|
-
let(:store_identifier) { storage.store_cloudinary_identifier('1', 'test.png') }
|
24
|
-
let(:uploader) { double :uploader, model: model, mounted_as: :example, use_extended_identifier?: false }
|
25
|
-
|
26
|
-
describe 'when the ORM is Neo4j 5 and above' do
|
27
|
-
before { stub_const('Neo4j::VERSION', '5.0') }
|
28
|
-
|
29
|
-
subject! { store_identifier }
|
30
|
-
|
31
|
-
it 'writes the name to the datastore without triggering validations' do
|
32
|
-
expect(model).to have_received(:write_attribute).with(column, 'v1/test.png')
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe 'when the ORM is Neo4j 4' do
|
37
|
-
before { stub_const('Neo4j::VERSION', '4.0') }
|
38
|
-
|
39
|
-
it 'raises an unsupported exception' do
|
40
|
-
expect { store_identifier }.to raise_error(CloudinaryException)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'cloudinary'
|
3
|
-
|
4
|
-
describe Cloudinary::Api do
|
5
|
-
PREDEFINED_PROFILES = %w(4k full_hd hd sd full_hd_wifi full_hd_lean hd_lean)
|
6
|
-
break puts('Please setup environment for api test to run') if Cloudinary.config.api_secret.blank?
|
7
|
-
include_context 'cleanup', TIMESTAMP_TAG
|
8
|
-
|
9
|
-
prefix = TEST_TAG + "_#{Time.now.to_i}"
|
10
|
-
test_id_1 = "#{prefix}_1"
|
11
|
-
test_id_2 = "#{prefix}_2"
|
12
|
-
test_id_3 = "#{prefix}_3"
|
13
|
-
before(:all) do
|
14
|
-
|
15
|
-
@api = Cloudinary::Api
|
16
|
-
end
|
17
|
-
|
18
|
-
describe 'create_streaming_profile' do
|
19
|
-
it 'should create a streaming profile with representations' do
|
20
|
-
result = @api.create_streaming_profile test_id_1, :representations =>
|
21
|
-
[{:transformation => {:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}}]
|
22
|
-
expect(result).not_to be_blank
|
23
|
-
end
|
24
|
-
it 'should create a streaming profile with an array of transformation' do
|
25
|
-
result = @api.create_streaming_profile test_id_1 + 'a', :representations =>
|
26
|
-
[{:transformation => [{:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}]}]
|
27
|
-
expect(result).not_to be_blank
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe 'list_streaming_profile' do
|
32
|
-
it 'should list streaming profile' do
|
33
|
-
result = @api.list_streaming_profiles
|
34
|
-
expect(result).to have_key('data')
|
35
|
-
expect(result['data'].map{|p| p['name']}).to include(*PREDEFINED_PROFILES)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe 'delete_streaming_profile' do
|
40
|
-
it 'should delete a streaming profile' do
|
41
|
-
result = @api.create_streaming_profile test_id_2, :representations =>
|
42
|
-
[{:transformation => {:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}}]
|
43
|
-
expect(result).not_to be_blank
|
44
|
-
result = @api.delete_streaming_profile test_id_2
|
45
|
-
expect(result).to have_key('message')
|
46
|
-
expect(result['message']).to eq('deleted')
|
47
|
-
result = @api.list_streaming_profiles
|
48
|
-
expect(result['data'].map{|p| p['name']}).not_to include(test_id_2)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe 'get_streaming_profile' do
|
53
|
-
it 'should get a specific streaming profile' do
|
54
|
-
result = @api.get_streaming_profile(PREDEFINED_PROFILES[1])
|
55
|
-
expect(result['data'].keys).to include('name', 'display_name', 'representations')
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe 'update_streaming_profile' do
|
60
|
-
it 'should create a streaming profile with representations' do
|
61
|
-
result = @api.create_streaming_profile test_id_3, :representations =>
|
62
|
-
[{:transformation => {:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}}]
|
63
|
-
expect(result).not_to be_blank
|
64
|
-
result = @api.update_streaming_profile test_id_3, :representations =>
|
65
|
-
[{:transformation => {:crop => 'scale', :width => '1000', :height => '1000', :bit_rate => '4m'}}]
|
66
|
-
expect(result).not_to be_blank
|
67
|
-
result = @api.get_streaming_profile(test_id_3)
|
68
|
-
result = result['data']
|
69
|
-
expect(result['representations'].length).to eq(1)
|
70
|
-
# Notice transformation is always returned as an array; numeric values represented as numbers, not strings
|
71
|
-
expect(result['representations'][0]).to eq({'transformation' => ['crop' => 'scale', 'width' => 1000, 'height' => 1000, 'bit_rate' => '4m']})
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Helpers
|
2
|
-
module TempFileHelpers
|
3
|
-
def clean_up_temp_files!
|
4
|
-
FileUtils.remove_entry temp_root
|
5
|
-
end
|
6
|
-
|
7
|
-
def temp_root
|
8
|
-
@temp_root ||= Dir.mktmpdir 'test_root'
|
9
|
-
end
|
10
|
-
|
11
|
-
def copy_root_to_temp(source)
|
12
|
-
source = File.join(RSpec.project_root, source) unless Pathname.new(source).directory?
|
13
|
-
FileUtils.copy_entry source, temp_root
|
14
|
-
end
|
15
|
-
|
16
|
-
def copy_file_to_temp(source, dest)
|
17
|
-
dest_path = File.join(temp_root, dest)
|
18
|
-
FileUtils.mkdir_p(File.dirname(dest_path))
|
19
|
-
FileUtils.copy_entry(File.join(RSpec.project_root, source), dest_path)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require "rake"
|
2
|
-
|
3
|
-
# From https://robots.thoughtbot.com/test-rake-tasks-like-a-boss
|
4
|
-
shared_context "rake" do
|
5
|
-
let(:rake) { Rake::Application.new }
|
6
|
-
let(:task_name) { self.class.top_level_description }
|
7
|
-
let(:task_path) { "lib/tasks/#{task_name.split(":").first}" }
|
8
|
-
subject { rake[task_name] }
|
9
|
-
|
10
|
-
def loaded_files_excluding_current_rake_file
|
11
|
-
$".reject {|file| file == Pathname.new(RSpec.project_root).join("#{task_path}.rake").to_s }
|
12
|
-
end
|
13
|
-
|
14
|
-
before do
|
15
|
-
Rake.application = rake
|
16
|
-
Rake.application.rake_require(task_path, [RSpec.project_root], loaded_files_excluding_current_rake_file)
|
17
|
-
Rake::Task.define_task(:environment)
|
18
|
-
end
|
19
|
-
end
|
data/spec/uploader_spec.rb
DELETED
@@ -1,409 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'cloudinary'
|
3
|
-
|
4
|
-
RSpec.configure do |c|
|
5
|
-
c.filter_run_excluding :large => true
|
6
|
-
end
|
7
|
-
|
8
|
-
describe Cloudinary::Uploader do
|
9
|
-
break puts("Please setup environment for api test to run") if Cloudinary.config.api_secret.blank?
|
10
|
-
include_context "cleanup", TIMESTAMP_TAG
|
11
|
-
|
12
|
-
it "should successfully upload file" do
|
13
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
14
|
-
expect(result["width"]).to eq(TEST_IMG_W)
|
15
|
-
expect(result["height"]).to eq(TEST_IMG_H)
|
16
|
-
expected_signature = Cloudinary::Utils.api_sign_request({:public_id=>result["public_id"], :version=>result["version"]}, Cloudinary.config.api_secret)
|
17
|
-
expect(result["signature"]).to eq(expected_signature)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should successfully upload a file from pathname", :pathname => true do
|
21
|
-
result = Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :tags => [TEST_TAG, TIMESTAMP_TAG])
|
22
|
-
expect(result["width"]).to eq(TEST_IMG_W)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should successfully upload file by url" do
|
26
|
-
result = Cloudinary::Uploader.upload("http://cloudinary.com/images/old_logo.png", :tags => [TEST_TAG, TIMESTAMP_TAG])
|
27
|
-
expect(result["width"]).to eq(TEST_IMG_W)
|
28
|
-
expect(result["height"]).to eq(TEST_IMG_H)
|
29
|
-
expected_signature = Cloudinary::Utils.api_sign_request({:public_id=>result["public_id"], :version=>result["version"]}, Cloudinary.config.api_secret)
|
30
|
-
expect(result["signature"]).to eq(expected_signature)
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should successfully upload file asynchronously" do
|
34
|
-
result = Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :async => true)
|
35
|
-
expect(result["status"]).to eq("pending")
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should support the quality_analysis parameter" do
|
39
|
-
result = Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :quality_analysis => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
40
|
-
expect(result).to have_key("quality_analysis")
|
41
|
-
expect(result["quality_analysis"]).to have_key("focus")
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should support the quality_override parameter" do
|
45
|
-
['auto:advanced', 'auto:best', '80:420', 'none'].each do |q|
|
46
|
-
expected = {[:payload, :quality_override] => q}
|
47
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
48
|
-
Cloudinary::Uploader.upload Pathname.new(TEST_IMG), :quality_override => q
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should support the cinemagraph_analysis parameter for upload" do
|
53
|
-
expected = {
|
54
|
-
[:payload, :cinemagraph_analysis] => 1,
|
55
|
-
[:method] => :post
|
56
|
-
}
|
57
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
58
|
-
Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :cinemagraph_analysis => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should support the cinemagraph_analysis parameter for explicit" do
|
62
|
-
expected = {
|
63
|
-
[:payload, :cinemagraph_analysis] => 1,
|
64
|
-
[:method] => :post
|
65
|
-
}
|
66
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
67
|
-
Cloudinary::Uploader.explicit('sample', :type => "upload", :cinemagraph_analysis => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
68
|
-
end
|
69
|
-
|
70
|
-
describe '.rename' do
|
71
|
-
before(:all) do
|
72
|
-
@result = Cloudinary::Uploader.upload(TEST_IMG, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
73
|
-
@resource_1_id = @result["public_id"]
|
74
|
-
@resource_1_type = @result["type"]
|
75
|
-
result = Cloudinary::Uploader.upload("spec/favicon.ico", :tags => [TEST_TAG, TIMESTAMP_TAG])
|
76
|
-
@resource_2_id = result["public_id"]
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'should rename a resource' do
|
80
|
-
Cloudinary::Uploader.rename(@resource_1_id, @resource_1_id+"2")
|
81
|
-
expect(Cloudinary::Api.resource(@resource_1_id+"2")).not_to be_nil
|
82
|
-
@resource_1_id = @resource_1_id+"2" # will not update if expect fails
|
83
|
-
end
|
84
|
-
it 'should not allow renaming to an existing ID' do
|
85
|
-
id = @resource_2_id
|
86
|
-
@resource_2_id = @resource_1_id+"2" # if rename doesn't fail, this is the new ID
|
87
|
-
expect { Cloudinary::Uploader.rename(id, @resource_1_id+"2") }.to raise_error(CloudinaryException)
|
88
|
-
@resource_2_id = id
|
89
|
-
end
|
90
|
-
it 'should allow changing type of an uploaded resource' do
|
91
|
-
id = @resource_2_id
|
92
|
-
from_type = @resource_1_type
|
93
|
-
to_type = "private"
|
94
|
-
Cloudinary::Uploader.rename(id, id, :type => from_type, :to_type => to_type)
|
95
|
-
expect(Cloudinary::Api.resource(id, type: to_type)).to_not be_empty
|
96
|
-
Cloudinary::Uploader.rename(id, id, :type => to_type, :to_type => from_type)
|
97
|
-
end
|
98
|
-
context ':overwrite => true' do
|
99
|
-
it 'should rename to an existing ID' do
|
100
|
-
new_id = Cloudinary::Uploader.upload(TEST_IMG, :tags => [TEST_TAG, TIMESTAMP_TAG])["public_id"]
|
101
|
-
Cloudinary::Uploader.rename(@resource_2_id, new_id, :overwrite => true)
|
102
|
-
expect(Cloudinary::Api.resource(new_id)["format"]).to eq("ico")
|
103
|
-
@resource_2_id = new_id # will not update if expect fails
|
104
|
-
end
|
105
|
-
end
|
106
|
-
context ':invalidate => true' do
|
107
|
-
it 'should notify the server to invalidate the resource in the CDN' do
|
108
|
-
# Can't test the result, so we just verify the parameter is send to the server
|
109
|
-
expected ={
|
110
|
-
:url => /.*\/rename$/,
|
111
|
-
[:payload, :invalidate] => 1,
|
112
|
-
[:payload, :from_public_id] => @resource_2_id,
|
113
|
-
[:payload, :to_public_id] => @resource_2_id+"2"
|
114
|
-
}
|
115
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
116
|
-
Cloudinary::Uploader.rename(@resource_2_id, @resource_2_id+"2", :invalidate => true) # will not affect the server
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should support explicit" do
|
123
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :public_id] => "sample", [:payload, :eager] => "c_scale,w_2.0"))
|
124
|
-
result = Cloudinary::Uploader.explicit("sample", :type=>"upload", :eager=>[{:crop=>"scale", :width=>"2.0"}])
|
125
|
-
end
|
126
|
-
|
127
|
-
it "should support eager" do
|
128
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>[{ :crop =>"scale", :width =>"2.0"}], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
129
|
-
expect(result["eager"].length).to be(1)
|
130
|
-
expect(result).to have_deep_hash_values_of(["eager", 0, "transformation"] => "c_scale,w_2.0")
|
131
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>"c_scale,w_2.0", :tags => [TEST_TAG, TIMESTAMP_TAG])
|
132
|
-
expect(result["eager"].length).to be(1)
|
133
|
-
expect(result).to have_deep_hash_values_of(["eager", 0, "transformation"] => "c_scale,w_2.0")
|
134
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>[
|
135
|
-
"c_scale,w_2.0",
|
136
|
-
{ :crop =>"crop", :width =>"0.5", :format => "tiff"},
|
137
|
-
[[{:crop =>"crop", :width =>"0.5"},{:angle =>90}]],
|
138
|
-
[[{:crop =>"crop", :width =>"0.5"},{:angle =>90}],"tiff"]
|
139
|
-
], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
140
|
-
expect(result["eager"].length).to be(4)
|
141
|
-
expect(result).to have_deep_hash_values_of(
|
142
|
-
["eager", 0, "transformation"] => "c_scale,w_2.0",
|
143
|
-
["eager", 1, "transformation"] => "c_crop,w_0.5/tiff",
|
144
|
-
["eager", 2, "transformation"] => "c_crop,w_0.5/a_90",
|
145
|
-
["eager", 3, "transformation"] => "c_crop,w_0.5/a_90/tiff"
|
146
|
-
)
|
147
|
-
end
|
148
|
-
|
149
|
-
it "should support headers" do
|
150
|
-
Cloudinary::Uploader.upload(TEST_IMG, :headers =>["Link: 1"], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
151
|
-
Cloudinary::Uploader.upload(TEST_IMG, :headers =>{ "Link" => "1"}, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
152
|
-
end
|
153
|
-
|
154
|
-
it "should successfully generate text image" do
|
155
|
-
result = Cloudinary::Uploader.text("hello world", :tags => [TEST_TAG, TIMESTAMP_TAG])
|
156
|
-
expect(result["width"]).to be > 1
|
157
|
-
expect(result["height"]).to be > 1
|
158
|
-
end
|
159
|
-
|
160
|
-
describe "tag" do
|
161
|
-
describe "add_tag" do
|
162
|
-
it "should correctly add tags" do
|
163
|
-
expected ={
|
164
|
-
:url => /.*\/tags/,
|
165
|
-
[:payload, :tag] => "new_tag",
|
166
|
-
[:payload, :public_ids] => ["some_public_id1", "some_public_id2"],
|
167
|
-
[:payload, :command] => "add"
|
168
|
-
}
|
169
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
170
|
-
|
171
|
-
Cloudinary::Uploader.add_tag( "new_tag", ["some_public_id1", "some_public_id2"])
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
describe "remove_tag" do
|
176
|
-
it "should correctly remove tag" do
|
177
|
-
expected ={
|
178
|
-
:url => /.*\/tags/,
|
179
|
-
[:payload, :tag] => "tag",
|
180
|
-
[:payload, :public_ids] => ["some_public_id1", "some_public_id2"],
|
181
|
-
[:payload, :command] => "remove"
|
182
|
-
}
|
183
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
184
|
-
|
185
|
-
Cloudinary::Uploader.remove_tag("tag", ["some_public_id1", "some_public_id2"])
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
describe "replace_tag" do
|
190
|
-
it "should correctly replace tag" do
|
191
|
-
expected ={
|
192
|
-
:url => /.*\/tags/,
|
193
|
-
[:payload, :tag] => "tag",
|
194
|
-
[:payload, :public_ids] => ["some_public_id1", "some_public_id2"],
|
195
|
-
[:payload, :command] => "replace"
|
196
|
-
}
|
197
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
198
|
-
|
199
|
-
Cloudinary::Uploader.replace_tag("tag", ["some_public_id1", "some_public_id2"])
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
describe "remove_all_tags" do
|
204
|
-
it "should correctly remove all tags" do
|
205
|
-
expected ={
|
206
|
-
:url => /.*\/tags/,
|
207
|
-
[:payload, :public_ids] => ["some_public_id1", "some_public_id2"],
|
208
|
-
[:payload, :command] => "remove_all"
|
209
|
-
}
|
210
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
211
|
-
|
212
|
-
Cloudinary::Uploader.remove_all_tags(["some_public_id1", "some_public_id2"])
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
end
|
217
|
-
|
218
|
-
|
219
|
-
describe "context" do
|
220
|
-
describe "add_context" do
|
221
|
-
it "should correctly add context" do
|
222
|
-
expected ={
|
223
|
-
:url => /.*\/context/,
|
224
|
-
[:payload, :context] => "key1=value1|key2=val\\|ue2",
|
225
|
-
[:payload, :public_ids] => ["some_public_id1", "some_public_id2"],
|
226
|
-
[:payload, :command] => "add"
|
227
|
-
}
|
228
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
229
|
-
|
230
|
-
Cloudinary::Uploader.add_context( {:key1 => "value1", :key2 => "val|ue2"}, ["some_public_id1", "some_public_id2"])
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
describe "remove_all_context" do
|
235
|
-
it "should correctly remove all context" do
|
236
|
-
expected ={
|
237
|
-
:url => /.*\/context/,
|
238
|
-
[:payload, :public_ids] => ["some_public_id1", "some_public_id2"],
|
239
|
-
[:payload, :command] => "remove_all",
|
240
|
-
[:payload, :type] => "private"
|
241
|
-
|
242
|
-
}
|
243
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
244
|
-
|
245
|
-
Cloudinary::Uploader.remove_all_context(["some_public_id1", "some_public_id2"], :type => "private")
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
end
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
it "should correctly handle unique_filename" do
|
254
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :use_filename => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
255
|
-
expect(result["public_id"]).to match(/logo_[a-zA-Z0-9]{6}/)
|
256
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :use_filename => true, :unique_filename => false, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
257
|
-
expect(result["public_id"]).to eq("logo")
|
258
|
-
end
|
259
|
-
|
260
|
-
it "should allow whitelisted formats if allowed_formats", :allowed=>true do
|
261
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :allowed_formats => ["png"], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
262
|
-
expect(result["format"]).to eq("png")
|
263
|
-
end
|
264
|
-
|
265
|
-
it "should prevent non whitelisted formats from being uploaded if allowed_formats is specified", :allowed=>true do
|
266
|
-
expect{Cloudinary::Uploader.upload(TEST_IMG, :allowed_formats => ["jpg"], :tags => [TEST_TAG, TIMESTAMP_TAG])}.to raise_error(CloudinaryException)
|
267
|
-
end
|
268
|
-
|
269
|
-
it "should allow non whitelisted formats if type is specified and convert to that type", :allowed=>true do
|
270
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, :allowed_formats => ["jpg"], :format => "jpg", :tags => [TEST_TAG, TIMESTAMP_TAG])
|
271
|
-
expect(result["format"]).to eq("jpg")
|
272
|
-
end
|
273
|
-
|
274
|
-
it "should allow sending face coordinates" do
|
275
|
-
coordinates = [[120, 30, 109, 150], [121, 31, 110, 151]]
|
276
|
-
result_coordinates = [[120, 30, 109, 51], [121, 31, 110, 51]] # actual boundaries fitted by the server
|
277
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, { :face_coordinates => coordinates, :faces => true, :tags => [TEST_TAG, TIMESTAMP_TAG]})
|
278
|
-
expect(result["faces"]).to eq(result_coordinates)
|
279
|
-
|
280
|
-
different_coordinates = [[122, 32, 111, 152]]
|
281
|
-
Cloudinary::Uploader.explicit(result["public_id"], {:face_coordinates => different_coordinates, :faces => true, :type => "upload", :tags => [TEST_TAG, TIMESTAMP_TAG]})
|
282
|
-
info = Cloudinary::Api.resource(result["public_id"], {:faces => true})
|
283
|
-
expect(info["faces"]).to eq(different_coordinates)
|
284
|
-
end
|
285
|
-
|
286
|
-
it "should allow sending context" do
|
287
|
-
context = {"key1"=>'value1', "key2" => 'valu\e2', "key3" => 'val=u|e3', "key4" => 'val\=ue'}
|
288
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, { :context => context, :tags => [TEST_TAG, TIMESTAMP_TAG]})
|
289
|
-
info = Cloudinary::Api.resource(result["public_id"], {:context => true})
|
290
|
-
expect(info["context"]).to eq({"custom" => context})
|
291
|
-
end
|
292
|
-
|
293
|
-
it "should support requesting manual moderation" do
|
294
|
-
result = Cloudinary::Uploader.upload(TEST_IMG, { :moderation => :manual, :tags => [TEST_TAG, TIMESTAMP_TAG]})
|
295
|
-
expect(result["moderation"][0]["status"]).to eq("pending")
|
296
|
-
expect(result["moderation"][0]["kind"]).to eq("manual")
|
297
|
-
end
|
298
|
-
|
299
|
-
it "should support requesting ocr anlysis" do
|
300
|
-
expect(RestClient::Request).to receive(:execute) do |options|
|
301
|
-
expect(options[:payload][:ocr]).to eq(:adv_ocr)
|
302
|
-
end
|
303
|
-
Cloudinary::Uploader.upload(TEST_IMG, { :ocr => :adv_ocr, :tags => [TEST_TAG, TIMESTAMP_TAG]})
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should support requesting raw conversion" do
|
307
|
-
expect{Cloudinary::Uploader.upload(TEST_RAW, {:resource_type => :raw, :raw_convert => :illegal, :tags => [TEST_TAG, TIMESTAMP_TAG]})}.to raise_error(CloudinaryException, /Illegal value|not a valid|is invalid/)
|
308
|
-
end
|
309
|
-
|
310
|
-
it "should support requesting categorization" do
|
311
|
-
expect{Cloudinary::Uploader.upload(TEST_IMG, { :categorization => :illegal, :tags => [TEST_TAG, TIMESTAMP_TAG]})}.to raise_error(CloudinaryException, /Illegal value|not a valid|is not valid/)
|
312
|
-
end
|
313
|
-
|
314
|
-
it "should support requesting detection" do
|
315
|
-
expect{Cloudinary::Uploader.upload(TEST_IMG, { :detection => :illegal, :tags => [TEST_TAG, TIMESTAMP_TAG]})}.to raise_error(CloudinaryException, /Detection is invalid/)
|
316
|
-
end
|
317
|
-
|
318
|
-
it "should support upload_large", :large => true do
|
319
|
-
io = StringIO.new
|
320
|
-
header = "BMJ\xB9Y\x00\x00\x00\x00\x00\x8A\x00\x00\x00|\x00\x00\x00x\x05\x00\x00x\x05\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\xC0\xB8Y\x00a\x0F\x00\x00a\x0F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\x00\x00\x00\x00\xFFBGRs\x00\x00\x00\x00\x00\x00\x00\x00T\xB8\x1E\xFC\x00\x00\x00\x00\x00\x00\x00\x00fff\xFC\x00\x00\x00\x00\x00\x00\x00\x00\xC4\xF5(\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
321
|
-
io.puts(header)
|
322
|
-
5880000.times{ io.write("\xFF") }
|
323
|
-
io.rewind
|
324
|
-
result = Cloudinary::Uploader.upload_large(io, :chunk_size => 5243000, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
325
|
-
expect(result["resource_type"]).to eq('raw')
|
326
|
-
io.rewind
|
327
|
-
result = Cloudinary::Uploader.upload_large(io, :resource_type => 'image', :chunk_size => 5243000, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
328
|
-
expect(result["resource_type"]).to eq('image')
|
329
|
-
expect(result["width"]).to eq(1400)
|
330
|
-
expect(result["height"]).to eq(1400)
|
331
|
-
expect(result["format"]).to eq("bmp")
|
332
|
-
end
|
333
|
-
|
334
|
-
it "should allow fallback of upload large with remote url to regular upload" do
|
335
|
-
file = "http://cloudinary.com/images/old_logo.png"
|
336
|
-
result = Cloudinary::Uploader.upload_large(file, :chunk_size => 5243000, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
337
|
-
expect(result).to_not be_nil
|
338
|
-
expect(result["width"]).to eq(TEST_IMG_W)
|
339
|
-
expect(result["height"]).to eq(TEST_IMG_H)
|
340
|
-
end
|
341
|
-
|
342
|
-
it "should include special headers in upload_large" do
|
343
|
-
expect(RestClient::Request).to receive(:execute) do |options|
|
344
|
-
expect(options[:headers]["Content-Range"]).to_not be_empty
|
345
|
-
expect(options[:headers]["X-Unique-Upload-Id"]).to_not be_empty
|
346
|
-
end
|
347
|
-
Cloudinary::Uploader.upload_large(TEST_IMG, { :tags => [TEST_TAG, TIMESTAMP_TAG]})
|
348
|
-
end
|
349
|
-
|
350
|
-
context "unsigned" do
|
351
|
-
after do
|
352
|
-
Cloudinary.class_variable_set(:@@config, nil)
|
353
|
-
end
|
354
|
-
|
355
|
-
it "should support unsigned uploading using presets", :upload_preset => true do
|
356
|
-
preset = Cloudinary::Api.create_upload_preset(:folder => "test_folder_upload", :unsigned => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
357
|
-
|
358
|
-
Cloudinary.config.api_key = nil
|
359
|
-
Cloudinary.config.api_secret = nil
|
360
|
-
|
361
|
-
result = Cloudinary::Uploader.unsigned_upload(TEST_IMG, preset["name"], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
362
|
-
expect(result["public_id"]).to match(/^test_folder_upload\/[a-z0-9]+$/)
|
363
|
-
|
364
|
-
Cloudinary.class_variable_set(:@@config, nil)
|
365
|
-
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
describe ":timeout" do
|
370
|
-
before do
|
371
|
-
@timeout = Cloudinary.config.timeout
|
372
|
-
Cloudinary.config.timeout = 0.01
|
373
|
-
end
|
374
|
-
after do
|
375
|
-
Cloudinary.config.timeout = @timeout
|
376
|
-
end
|
377
|
-
|
378
|
-
it "should fail if timeout is reached" do
|
379
|
-
expect{Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :tags => [TEST_TAG, TIMESTAMP_TAG])}.to raise_error(RestClient::RequestTimeout)
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
context ":responsive_breakpoints" do
|
384
|
-
context ":create_derived with transformation and format conversion" do
|
385
|
-
expected ={
|
386
|
-
:url => /.*\/upload$/,
|
387
|
-
[:payload, :responsive_breakpoints] => %r("transformation":"e_sepia/jpg"),
|
388
|
-
[:payload, :responsive_breakpoints] => %r("transformation":"gif"),
|
389
|
-
[:payload, :responsive_breakpoints] => %r("create_derived":true)
|
390
|
-
}
|
391
|
-
it 'should return a proper responsive_breakpoints hash in the response' do
|
392
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
393
|
-
Cloudinary::Uploader.upload(TEST_IMG, responsive_breakpoints:[{transformation:{effect: "sepia"}, format:"jpg", bytes_step:20000, create_derived: true, :min_width => 200, :max_width => 1000, :max_images => 20},{format:"gif", create_derived:true, bytes_step:20000, :min_width => 200, :max_width => 1000, :max_images => 20}], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
394
|
-
end
|
395
|
-
end
|
396
|
-
end
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
describe 'explicit' do
|
401
|
-
context ":invalidate" do
|
402
|
-
it 'should pass the invalidate value to the server' do
|
403
|
-
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :invalidate] => 1))
|
404
|
-
Cloudinary::Uploader.explicit("cloudinary", :type=>"twitter_name", :eager=>[{:crop=>"scale", :width=>"2.0"}], :invalidate => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
405
|
-
end
|
406
|
-
end
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|