ruby-thumbor 2.0.1 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,497 +1,320 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'json'
3
5
  require 'ruby-thumbor'
4
- require 'util/thumbor'
5
6
 
6
7
  describe Thumbor::Cascade do
8
+ subject(:cascade_instance) { described_class.new key, image_url }
9
+
7
10
  let(:image_url) { 'my.domain.com/some/image/url.jpg' }
8
- let(:image_md5) { 'f33af67e41168e80fcc5b00f8bd8061a' }
9
11
  let(:key) { 'my-security-key' }
10
12
 
11
- subject { Thumbor::Cascade.new key, image_url }
12
-
13
- describe '#new' do
14
-
15
- it "should create a new instance passing key and keep it" do
16
- expect(subject.computed_key).to eq 'my-security-keym'
17
- end
13
+ it 'raises an error' do
14
+ expect { cascade_instance.god_of_war_crop }.to raise_error(NoMethodError)
18
15
  end
19
16
 
20
- it 'should raise an error' do
21
- expect{ subject.god_of_war_crop }.to raise_error(NoMethodError)
17
+ it 'responds to filter methods' do
18
+ expect(cascade_instance).to respond_to('quality_filter')
22
19
  end
23
20
 
24
- describe '#url_for' do
25
-
26
- it "should return just the image hash if no arguments passed" do
27
- url = subject.url_for
28
- expect(url).to eq image_md5
29
- end
30
-
31
- it "should raise if no image passed" do
32
- expect { Thumbor::Cascade.new.url_for }.to raise_error(RuntimeError)
33
- end
34
-
35
- it "should return proper url for width-only" do
36
- url = subject.width(300).url_for
37
- expect(url).to eq '300x0/' << image_md5
38
- end
39
-
40
- it "should return proper url for height-only" do
41
- url = subject.height(300).url_for
42
- expect(url).to eq '0x300/' << image_md5
43
- end
44
-
45
- it "should return proper url for width and height" do
46
- url = subject.width(200).height(300).url_for
47
- expect(url).to eq '200x300/' << image_md5
48
- end
49
-
50
- it "should return proper smart url" do
51
- url = subject.width(200).height(300).smart(true).url_for
52
- expect(url).to eq '200x300/smart/' << image_md5
53
- end
54
-
55
- it "should return proper fit-in url" do
56
- url = subject.width(200).height(300).fit_in(true).url_for
57
- expect(url).to eq 'fit-in/200x300/' << image_md5
58
- end
59
-
60
- it "should return proper adaptive-fit-in url" do
61
- url = subject.width(200).height(300).adaptive_fit_in(true).url_for
62
- expect(url).to eq 'adaptive-fit-in/200x300/' << image_md5
63
- end
64
-
65
- it "should return proper full-fit-in url" do
66
- url = subject.width(200).height(300).full_fit_in(true).url_for
67
- expect(url).to eq 'full-fit-in/200x300/' << image_md5
68
- end
69
-
70
- it "should return proper adaptive-full-fit-in url" do
71
- url = subject.width(200).height(300).adaptive_full_fit_in(true).url_for
72
- expect(url).to eq 'adaptive-full-fit-in/200x300/' << image_md5
21
+ describe '#generate' do
22
+ it 'creates an unsafe url' do
23
+ url = described_class.new(nil, image_url).width(300).height(200).generate
24
+ expect(url).to eq '/unsafe/300x200/my.domain.com/some/image/url.jpg'
73
25
  end
74
26
 
75
- [:fit_in, :full_fit_in].each do |fit|
76
- it "should raise error when using #{fit} without width or height" do
77
- subject.send(fit, true)
78
- expect{subject.url_for}.to raise_error(ArgumentError)
79
- end
27
+ it 'creates an url with debug' do
28
+ url = cascade_instance.debug(true).height(200).generate
29
+ expect(url).to eq '/5_eX4HHQYk81HQVkc1gBIAvPbLo=/debug/0x200/my.domain.com/some/image/url.jpg'
80
30
  end
81
31
 
82
- it "should return proper flip url if no width and height" do
83
- url = subject.flip(true).url_for
84
- expect(url).to eq '-0x0/' << image_md5
32
+ it 'creates a new instance with width and height' do
33
+ url = cascade_instance.width(300).height(200).generate
34
+ expect(url).to eq '/TQfyd3H36Z3srcNcLOYiM05YNO8=/300x200/my.domain.com/some/image/url.jpg'
85
35
  end
86
36
 
87
- it "should return proper flop url if no width and height" do
88
- url = subject.flop(true).url_for
89
- expect(url).to eq '0x-0/' << image_md5
37
+ it 'is able to change the Thumbor key' do
38
+ url1 = cascade_instance.width(300).height(200).generate
39
+ url2 = described_class.new('another-thumbor-key', image_url).width(300).height(200).generate
40
+ expect(url1).not_to eq url2
90
41
  end
91
42
 
92
- it "should return proper flip-flop url if no width and height" do
93
- url = subject.flip(true).flop(true).url_for
94
- expect(url).to eq '-0x-0/' << image_md5
43
+ it 'creates a new instance with width, height and meta' do
44
+ url = cascade_instance.width(300).height(200).meta(true).generate
45
+ expect(url).to eq '/YBQEWd3g_WRMnVEG73zfzcr8Zj0=/meta/300x200/my.domain.com/some/image/url.jpg'
95
46
  end
96
47
 
97
- it "should return proper flip url if width" do
98
- url = subject.width(300).flip(true).url_for
99
- expect(url).to eq '-300x0/' << image_md5
48
+ it 'creates a new instance with width, height, meta and smart' do
49
+ url = cascade_instance.width(300).height(200).meta(true).smart(true).generate
50
+ expect(url).to eq '/jP89J0qOWHgPlm_lOA28GtOh5GU=/meta/300x200/smart/my.domain.com/some/image/url.jpg'
100
51
  end
101
52
 
102
- it "should return proper flop url if height" do
103
- url = subject.height(300).flop(true).url_for
104
- expect(url).to eq '0x-300/' << image_md5
53
+ it 'creates a new instance with width, height, meta, smart and fit_in' do
54
+ url = cascade_instance.width(300).height(200).meta(true).smart(true).fit_in(true).generate
55
+ expect(url).to eq '/zrrOh_TtTs4kiLLEQq1w4bcTYdc=/meta/fit-in/300x200/smart/my.domain.com/some/image/url.jpg'
105
56
  end
106
57
 
107
- it "should return horizontal align" do
108
- url = subject.halign(:left).url_for
109
- expect(url).to eq 'left/' << image_md5
58
+ it 'creates a new instance with width, height, meta, smart, fit_in and flip' do
59
+ url = cascade_instance.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).generate
60
+ expect(url).to eq '/4t1XK1KH43cOb1QJ9tU00-W2_k8=/meta/fit-in/-300x200/smart/my.domain.com/some/image/url.jpg'
110
61
  end
111
62
 
112
- it "should not return horizontal align if it is center" do
113
- url = subject.halign(:center).url_for
114
- expect(url).to eq image_md5
63
+ it 'creates a new instance with width, height, meta, smart, fit_in, flip and flop' do
64
+ url = cascade_instance.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).flop(true).generate
65
+ expect(url).to eq '/HJnvjZU69PkPOhyZGu-Z3Uc_W_A=/meta/fit-in/-300x-200/smart/my.domain.com/some/image/url.jpg'
115
66
  end
116
67
 
117
- it "should return vertical align" do
118
- url = subject.valign(:top).url_for
119
- expect(url).to eq 'top/' << image_md5
68
+ it 'creates a new instance with quality and brigthness filter' do
69
+ url = cascade_instance.quality_filter(20).brightness_filter(10).generate
70
+ expect(url).to eq '/q0DiFg-5-eFZIqyN3lRoCvg2K0s=/filters:quality(20):brightness(10)/my.domain.com/some/image/url.jpg'
120
71
  end
121
72
 
122
- it "should not return vertical align if it is middle" do
123
- url = subject.valign(:middle).url_for
124
- expect(url).to eq image_md5
73
+ it 'returns just the image hash if no arguments passed' do
74
+ url = cascade_instance.generate
75
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
125
76
  end
126
77
 
127
- it "should return halign and valign properly" do
128
- url = subject.halign(:left).valign(:top).url_for
129
- expect(url).to eq 'left/top/' << image_md5
78
+ it 'raises if no image passed' do
79
+ expect { described_class.new.generate }.to raise_error(RuntimeError)
130
80
  end
131
81
 
132
- it "should return meta properly" do
133
- url = subject.meta(true).url_for
134
- expect(url).to eq 'meta/' << image_md5
82
+ it 'returns proper url for width-only' do
83
+ url = cascade_instance.width(300).generate
84
+ expect(url).to eq '/eFwrBWryxtRw9hDSbQPhi5iLpo8=/300x0/my.domain.com/some/image/url.jpg'
135
85
  end
136
86
 
137
- it "should return proper crop url when param is array" do
138
- url = subject.crop([10, 20, 30, 40]).url_for
139
- expect(url).to eq '10x20:30x40/' << image_md5
87
+ it 'returns proper url for height-only' do
88
+ url = cascade_instance.height(300).generate
89
+ expect(url).to eq '/-VGIgp7g8cMKcfF2gFK9ZpmB_5w=/0x300/my.domain.com/some/image/url.jpg'
140
90
  end
141
91
 
142
- it "should return proper crop url" do
143
- url = subject.crop(10, 20, 30, 40).url_for
144
- expect(url).to eq '10x20:30x40/' << image_md5
92
+ it 'returns proper url for width and height' do
93
+ url = cascade_instance.width(200).height(300).generate
94
+ expect(url).to eq '/TrM0qqfcivb6VxS3Hxlxn43W21k=/200x300/my.domain.com/some/image/url.jpg'
145
95
  end
146
96
 
147
- it "should ignore crop if all zeros" do
148
- url = subject.crop(0, 0, 0, 0).url_for
149
- expect(url).to eq image_md5
97
+ it 'returns proper smart url' do
98
+ url = cascade_instance.width(200).height(300).smart(true).generate
99
+ expect(url).to eq '/hdzhxXzK45DzNTru5urV6x6xxSs=/200x300/smart/my.domain.com/some/image/url.jpg'
150
100
  end
151
101
 
152
- it "should have smart after halign and valign" do
153
- url = subject.halign(:left).valign(:top).smart(true).url_for
154
- expect(url).to eq 'left/top/smart/' << image_md5
102
+ it 'returns proper fit-in url' do
103
+ url = cascade_instance.width(200).height(300).fit_in(true).generate
104
+ expect(url).to eq '/LOv6ArMOJA2VRpfMQjjs4xSyZpM=/fit-in/200x300/my.domain.com/some/image/url.jpg'
155
105
  end
156
106
 
157
- it "should have quality filter" do
158
- url = subject.quality_filter(20).url_for
159
- expect(url).to eq 'filters:quality(20)/' << image_md5
107
+ it 'returns proper adaptive-fit-in url' do
108
+ url = cascade_instance.width(200).height(300).adaptive_fit_in(true).generate
109
+ expect(url).to eq '/V2xmSmQZm4i5-0Flx8iuRtawOkg=/adaptive-fit-in/200x300/my.domain.com/some/image/url.jpg'
160
110
  end
161
111
 
162
- it "should have brightness filter" do
163
- url = subject.brightness_filter(30).url_for
164
- expect(url).to eq 'filters:brightness(30)/' << image_md5
112
+ it 'returns proper full-fit-in url' do
113
+ url = cascade_instance.width(200).height(300).full_fit_in(true).generate
114
+ expect(url).to eq '/geXhR7ZFxztQTsKzmkDxYCX-HHg=/full-fit-in/200x300/my.domain.com/some/image/url.jpg'
165
115
  end
166
116
 
167
- it "should have 2 filters" do
168
- url = subject.brightness_filter(30).quality_filter(20).url_for
169
- expect(url).to eq 'filters:brightness(30):quality(20)/' << image_md5
117
+ it 'returns proper adaptive-full-fit-in url' do
118
+ url = cascade_instance.width(200).height(300).adaptive_full_fit_in(true).generate
119
+ expect(url).to eq '/jlUfjdC-6rG6jmuHgFp6eKgPy2g=/adaptive-full-fit-in/200x300/my.domain.com/some/image/url.jpg'
170
120
  end
171
121
 
172
- it "should escape url args" do
173
- url = subject.watermark_filter('http://my-server.com/image.png', 30).quality_filter(20).url_for
174
- expect(url).to eq 'filters:watermark(http%3A%2F%2Fmy-server.com%2Fimage.png,30):quality(20)/' << image_md5
122
+ %i[fit_in full_fit_in].each do |fit|
123
+ it "raises error when using #{fit} without width or height" do
124
+ cascade_instance.send(fit, true)
125
+ expect { cascade_instance.generate }.to raise_error(ArgumentError)
126
+ end
175
127
  end
176
128
 
177
- it "should have trim without params" do
178
- url = subject.trim.url_for
179
- expect(url).to eq 'trim/' << image_md5
129
+ it 'returns proper flip url if no width and height' do
130
+ url = cascade_instance.flip(true).generate
131
+ expect(url).to eq '/rlI4clPR-p-PR2QAxj5ZWiTfvH4=/-0x0/my.domain.com/some/image/url.jpg'
180
132
  end
181
133
 
182
- it "should have trim with direction param" do
183
- url = subject.trim('bottom-right').url_for
184
- expect(url).to eq 'trim:bottom-right/' << image_md5
134
+ it 'returns proper flop url if no width and height' do
135
+ url = cascade_instance.flop(true).generate
136
+ expect(url).to eq '/-4dmGj-TwIEqTAL9_9yEqUM8cks=/0x-0/my.domain.com/some/image/url.jpg'
185
137
  end
186
138
 
187
- it "should have trim with direction and tolerance param" do
188
- url = subject.trim('bottom-right', 15).url_for
189
- expect(url).to eq 'trim:bottom-right:15/' << image_md5
139
+ it 'returns proper flip-flop url if no width and height' do
140
+ url = cascade_instance.flip(true).flop(true).generate
141
+ expect(url).to eq '/FnMxpQMmxiMpdG219Dsj8pD_4Xc=/-0x-0/my.domain.com/some/image/url.jpg'
190
142
  end
191
143
 
192
- it "should have the right crop when cropping horizontally and given a left center" do
193
- url = subject.original_width(100).original_height(100).width(40).height(50).center(0, 50).url_for
194
- expect(url).to eq '0x0:80x100/40x50/' << image_md5
144
+ it 'returns proper flip url if width' do
145
+ url = cascade_instance.width(300).flip(true).generate
146
+ expect(url).to eq '/ccr2PoSYcTEGL4_Wzt4u3wWVRKU=/-300x0/my.domain.com/some/image/url.jpg'
195
147
  end
196
148
 
197
- it "should have the right crop when cropping horizontally and given a right center" do
198
- url = subject.original_width(100).original_height(100).width(40).height(50).center(100, 50).url_for
199
- expect(url).to eq '20x0:100x100/40x50/' << image_md5
149
+ it 'returns proper flop url if height' do
150
+ url = cascade_instance.height(300).flop(true).generate
151
+ expect(url).to eq '/R5K91tkyNgXO65F6E0txgA6C9lY=/0x-300/my.domain.com/some/image/url.jpg'
200
152
  end
201
153
 
202
- it "should have the right crop when cropping horizontally and given the actual center" do
203
- url = subject.original_width(100).original_height(100).width(40).height(50).center(50, 50).url_for
204
- expect(url).to eq '10x0:90x100/40x50/' << image_md5
154
+ it 'returns horizontal align' do
155
+ url = cascade_instance.halign(:left).generate
156
+ expect(url).to eq '/GTJE3wUt3sURik0O9Nae8sfI928=/left/my.domain.com/some/image/url.jpg'
205
157
  end
206
158
 
207
- it "should have the right crop when cropping vertically and given a top center" do
208
- url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 0).url_for
209
- expect(url).to eq '0x0:100x80/50x40/' << image_md5
159
+ it 'does not return horizontal align if it is center' do
160
+ url = cascade_instance.halign(:center).generate
161
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
210
162
  end
211
163
 
212
- it "should have the right crop when cropping vertically and given a bottom center" do
213
- url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 100).url_for
214
- expect(url).to eq '0x20:100x100/50x40/' << image_md5
164
+ it 'returns vertical align' do
165
+ url = cascade_instance.valign(:top).generate
166
+ expect(url).to eq '/1QQo5ihObuhgwl95--Z3g78vjiE=/top/my.domain.com/some/image/url.jpg'
215
167
  end
216
168
 
217
- it "should have the right crop when cropping vertically and given the actual center" do
218
- url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 50).url_for
219
- expect(url).to eq '0x10:100x90/50x40/' << image_md5
169
+ it 'does not return vertical align if it is middle' do
170
+ url = cascade_instance.valign(:middle).generate
171
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
220
172
  end
221
173
 
222
- it "should have the no crop when not necessary" do
223
- url = subject.original_width(100).original_height(100).width(50).height(50).center(50, 0).url_for
224
- expect(url).to eq '50x50/' << image_md5
174
+ it 'returns halign and valign properly' do
175
+ url = cascade_instance.halign(:left).valign(:top).generate
176
+ expect(url).to eq '/yA2rmtWv_uzHd9klz5OuMIZ5auI=/left/top/my.domain.com/some/image/url.jpg'
225
177
  end
226
178
 
227
- it "should blow up with a bad center" do
228
- expect { subject.original_width(100).original_height(100).width(50).height(50).center(50).url_for }.to raise_error(RuntimeError)
179
+ it 'returns meta properly' do
180
+ url = cascade_instance.meta(true).generate
181
+ expect(url).to eq '/WvIJFDJDePgIl5hZcLgtrzIPxfY=/meta/my.domain.com/some/image/url.jpg'
229
182
  end
230
183
 
231
- it "should have no crop with a missing original_height" do
232
- url = subject.original_width(100).width(50).height(40).center(50, 0).url_for
233
- expect(url).to eq '50x40/' << image_md5
184
+ it 'returns proper crop url when param is array' do
185
+ url = cascade_instance.crop([10, 20, 30, 40]).generate
186
+ expect(url).to eq '/QcnhqNfHwiP6BHLbD6UvneX7K28=/10x20:30x40/my.domain.com/some/image/url.jpg'
234
187
  end
235
188
 
236
- it "should have no crop with a missing original_width" do
237
- url = subject.original_height(100).width(50).height(40).center(50, 0).url_for
238
- expect(url).to eq '50x40/' << image_md5
189
+ it 'returns proper crop url' do
190
+ url = cascade_instance.crop(10, 20, 30, 40).generate
191
+ expect(url).to eq '/QcnhqNfHwiP6BHLbD6UvneX7K28=/10x20:30x40/my.domain.com/some/image/url.jpg'
239
192
  end
240
193
 
241
- it "should have no crop with out a width and height" do
242
- url = subject.original_width(100).original_height(100).center(50, 50).url_for
243
- expect(url).to eq image_md5
194
+ it 'ignores crop if all zeros' do
195
+ url = cascade_instance.crop(0, 0, 0, 0).generate
196
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
244
197
  end
245
198
 
246
- it "should use the original width with a missing width" do
247
- url = subject.original_width(100).original_height(100).height(80).center(50, 50).url_for
248
- expect(url).to eq '0x10:100x90/0x80/' << image_md5
199
+ it 'has smart after halign and valign' do
200
+ url = cascade_instance.halign(:left).valign(:top).smart(true).generate
201
+ expect(url).to eq '/KS6mVuzlGE3hJ75n3JUonfGgSFM=/left/top/smart/my.domain.com/some/image/url.jpg'
249
202
  end
250
203
 
251
- it "should use the original height with a missing height" do
252
- url = subject.original_width(100).original_height(100).width(80).center(50, 50).url_for
253
- expect(url).to eq '10x0:90x100/80x0/' << image_md5
204
+ it 'has quality filter' do
205
+ url = cascade_instance.quality_filter(20).generate
206
+ expect(url).to eq '/NyA-is4NojxiRqo0NcmJDhB6GTs=/filters:quality(20)/my.domain.com/some/image/url.jpg'
254
207
  end
255
208
 
256
- it "should have the right crop with a negative width" do
257
- url = subject.original_width(100).original_height(100).width(-50).height(40).center(50, 50).url_for
258
- expect(url).to eq '0x10:100x90/-50x40/' << image_md5
209
+ it 'has brightness filter' do
210
+ url = cascade_instance.brightness_filter(30).generate
211
+ expect(url).to eq '/oXDmnGD7vQV-rXcj8kCl1tcS3jc=/filters:brightness(30)/my.domain.com/some/image/url.jpg'
259
212
  end
260
213
 
261
- it "should have the right crop with a negative height" do
262
- url = subject.original_width(100).original_height(100).width(50).height(-40).center(50, 50).url_for
263
- expect(url).to eq '0x10:100x90/50x-40/' << image_md5
214
+ it 'has 2 filters' do
215
+ url = cascade_instance.brightness_filter(30).quality_filter(20).generate
216
+ expect(url).to eq '/SW9o4xQG1QAzE69WzEzarL_G3MI=/filters:brightness(30):quality(20)/my.domain.com/some/image/url.jpg'
264
217
  end
265
218
 
266
- it "should have the right crop with a negative height and width" do
267
- url = subject.original_width(100).original_height(100).width(-50).height(-40).center(50, 50).url_for
268
- expect(url).to eq '0x10:100x90/-50x-40/' << image_md5
219
+ it 'escapes url args' do
220
+ url = cascade_instance.watermark_filter('http://my-server.com/image.png', 30).quality_filter(20).generate
221
+ expect(url).to eq '/4b9kwg0-zsojf7Ed01TPKPYOel4=/filters:watermark(http%3A%2F%2Fmy-server.com%2Fimage.png,30):quality(20)/my.domain.com/some/image/url.jpg'
269
222
  end
270
- end
271
223
 
272
- describe '#generate' do
273
-
274
- it "should create a new instance passing key and keep it" do
275
- url = subject.width(300).height(200).generate
276
- expect(url).to eq '/TQfyd3H36Z3srcNcLOYiM05YNO8=/300x200/my.domain.com/some/image/url.jpg'
224
+ it 'has trim without params' do
225
+ url = cascade_instance.trim.generate
226
+ expect(url).to eq '/w23BC0dUiYBFrUnuoYJe8XROuyw=/trim/my.domain.com/some/image/url.jpg'
277
227
  end
278
228
 
279
- it "should be able to change the Thumbor key" do
280
- url1 = subject.width(300).height(200).generate
281
- url2 = Thumbor::Cascade.new('another-thumbor-key', image_url).width(300).height(200).generate
282
- expect(url1).not_to eq url2
229
+ it 'has trim with direction param' do
230
+ url = cascade_instance.trim('bottom-right').generate
231
+ expect(url).to eq '/kXPwSmqEvPFQezgzBCv9BtPWmBY=/trim:bottom-right/my.domain.com/some/image/url.jpg'
283
232
  end
284
233
 
285
- it "should create a new instance passing key and keep it" do
286
- url = subject.width(300).height(200).meta(true).generate
287
- expect(url).to eq '/YBQEWd3g_WRMnVEG73zfzcr8Zj0=/meta/300x200/my.domain.com/some/image/url.jpg'
234
+ it 'has trim with direction and tolerance param' do
235
+ url = cascade_instance.trim('bottom-right', 15).generate
236
+ expect(url).to eq '/TUCEIhtWfI1Uv9zjavCSl_i0A_8=/trim:bottom-right:15/my.domain.com/some/image/url.jpg'
288
237
  end
289
238
 
290
- it "should create a new instance passing key and keep it" do
291
- url = subject.width(300).height(200).meta(true).smart(true).generate
292
- expect(url).to eq '/jP89J0qOWHgPlm_lOA28GtOh5GU=/meta/300x200/smart/my.domain.com/some/image/url.jpg'
239
+ it 'has the right crop when cropping horizontally and given a left center' do
240
+ url = cascade_instance.original_width(100).original_height(100).width(40).height(50).center(0, 50).generate
241
+ expect(url).to eq '/SZIT3w4Qgebv5DuVJ8G1IH1mkCU=/0x0:80x100/40x50/my.domain.com/some/image/url.jpg'
293
242
  end
294
243
 
295
- it "should create a new instance passing key and keep it" do
296
- url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).generate
297
- expect(url).to eq '/zrrOh_TtTs4kiLLEQq1w4bcTYdc=/meta/fit-in/300x200/smart/my.domain.com/some/image/url.jpg'
244
+ it 'has the right crop when cropping horizontally and given a right center' do
245
+ url = cascade_instance.original_width(100).original_height(100).width(40).height(50).center(100, 50).generate
246
+ expect(url).to eq '/NEtCYehaISE7qR3zFj15CxnZoCs=/20x0:100x100/40x50/my.domain.com/some/image/url.jpg'
298
247
  end
299
248
 
300
- it "should create a new instance passing key and keep it" do
301
- url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).generate
302
- expect(url).to eq '/4t1XK1KH43cOb1QJ9tU00-W2_k8=/meta/fit-in/-300x200/smart/my.domain.com/some/image/url.jpg'
249
+ it 'has the right crop when cropping horizontally and given the actual center' do
250
+ url = cascade_instance.original_width(100).original_height(100).width(40).height(50).center(50, 50).generate
251
+ expect(url).to eq '/JLH65vJTu6d-cXBmqe5hYoSD4ho=/10x0:90x100/40x50/my.domain.com/some/image/url.jpg'
303
252
  end
304
253
 
305
- it "should create a new instance passing key and keep it" do
306
- url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).flop(true).generate
307
- expect(url).to eq '/HJnvjZU69PkPOhyZGu-Z3Uc_W_A=/meta/fit-in/-300x-200/smart/my.domain.com/some/image/url.jpg'
254
+ it 'has the right crop when cropping vertically and given a top center' do
255
+ url = cascade_instance.original_width(100).original_height(100).width(50).height(40).center(50, 0).generate
256
+ expect(url).to eq '/FIMZcLatW6bjgSRH9xTkEwUZAZ8=/0x0:100x80/50x40/my.domain.com/some/image/url.jpg'
308
257
  end
309
258
 
310
- it "should create a new instance passing key and keep it" do
311
- url = subject.quality_filter(20).brightness_filter(10).generate
312
- expect(url).to eq '/q0DiFg-5-eFZIqyN3lRoCvg2K0s=/filters:quality(20):brightness(10)/my.domain.com/some/image/url.jpg'
259
+ it 'has the right crop when cropping vertically and given a bottom center' do
260
+ url = cascade_instance.original_width(100).original_height(100).width(50).height(40).center(50, 100).generate
261
+ expect(url).to eq '/9Ud0sVo6i9DLOjlKbQP_4JXgFmA=/0x20:100x100/50x40/my.domain.com/some/image/url.jpg'
313
262
  end
314
- end
315
263
 
316
- describe "#generate :old => true" do
317
-
318
- subject { Thumbor::Cascade.new(key, image_url).old(true) }
319
-
320
- it "should create a new instance passing key and keep it" do
321
- url = subject.width(300).height(200).generate
322
- expect(url).to eq '/qkLDiIbvtiks0Up9n5PACtmpOfX6dPXw4vP4kJU-jTfyF6y1GJBJyp7CHYh1H3R2/' << image_url
264
+ it 'has the right crop when cropping vertically and given the actual center' do
265
+ url = cascade_instance.original_width(100).original_height(100).width(50).height(40).center(50, 50).generate
266
+ expect(url).to eq '/WejLJn8djJLn7DkMUq3S0zZCvZE=/0x10:100x90/50x40/my.domain.com/some/image/url.jpg'
323
267
  end
324
268
 
325
- it "should allow thumbor to decrypt it properly" do
326
- url = subject.width(300).height(200).generate
327
-
328
- encrypted = url.split('/')[1]
329
-
330
- decrypted = decrypt_in_thumbor(encrypted)
331
-
332
- expect(decrypted["horizontal_flip"]).to be_falsy
333
- expect(decrypted["vertical_flip"]).to be_falsy
334
- expect(decrypted["smart"]).to be_falsy
335
- expect(decrypted["meta"]).to be_falsy
336
- expect(decrypted["fit_in"]).to be_falsy
337
- expect(decrypted["crop"]["left"]).to eq 0
338
- expect(decrypted["crop"]["top"]).to eq 0
339
- expect(decrypted["crop"]["right"]).to eq 0
340
- expect(decrypted["crop"]["bottom"]).to eq 0
341
- expect(decrypted["valign"]).to eq 'middle'
342
- expect(decrypted["halign"]).to eq 'center'
343
- expect(decrypted["image_hash"]).to eq image_md5
344
- expect(decrypted["width"]).to eq 300
345
- expect(decrypted["height"]).to eq 200
346
-
269
+ it 'has the no crop when not necessary' do
270
+ url = cascade_instance.original_width(100).original_height(100).width(50).height(50).center(50, 0).generate
271
+ expect(url).to eq '/trIjfr513nkGkCpKXK6qgox2jPA=/50x50/my.domain.com/some/image/url.jpg'
347
272
  end
348
273
 
349
- it "should allow thumbor to decrypt it properly with meta" do
350
- url = subject.width(300).height(200).meta(true).generate
351
-
352
- encrypted = url.split('/')[1]
353
-
354
- decrypted = decrypt_in_thumbor(encrypted)
355
-
356
- expect(decrypted["meta"]).to be_truthy
357
- expect(decrypted["image_hash"]).to eq image_md5
358
- expect(decrypted["width"]).to eq 300
359
- expect(decrypted["height"]).to eq 200
360
-
274
+ it 'blows up with a bad center' do
275
+ expect do
276
+ cascade_instance.original_width(100).original_height(100).width(50).height(50).center(50).generate
277
+ end.to raise_error(RuntimeError)
361
278
  end
362
279
 
363
- it "should allow thumbor to decrypt it properly with smart" do
364
- url = subject.width(300).height(200).meta(true).smart(true).generate
365
-
366
- encrypted = url.split('/')[1]
367
-
368
- decrypted = decrypt_in_thumbor(encrypted)
369
-
370
- expect(decrypted["meta"]).to be_truthy
371
- expect(decrypted["smart"]).to be_truthy
372
- expect(decrypted["image_hash"]).to eq image_md5
373
- expect(decrypted["width"]).to eq 300
374
- expect(decrypted["height"]).to eq 200
375
-
280
+ it 'has no crop with a missing original_height' do
281
+ url = cascade_instance.original_width(100).width(50).height(40).center(50, 0).generate
282
+ expect(url).to eq '/veYlY0msKmemAaXpeav2kCNftmU=/50x40/my.domain.com/some/image/url.jpg'
376
283
  end
377
284
 
378
- it "should allow thumbor to decrypt it properly with fit-in" do
379
- url = subject.width(300).height(200).fit_in(true).generate
380
-
381
- encrypted = url.split('/')[1]
382
-
383
- decrypted = decrypt_in_thumbor(encrypted)
384
-
385
- expect(decrypted["fit_in"]).to be_truthy
386
- expect(decrypted["image_hash"]).to eq image_md5
387
- expect(decrypted["width"]).to eq 300
388
- expect(decrypted["height"]).to eq 200
389
-
285
+ it 'has no crop with a missing original_width' do
286
+ url = cascade_instance.original_height(100).width(50).height(40).center(50, 0).generate
287
+ expect(url).to eq '/veYlY0msKmemAaXpeav2kCNftmU=/50x40/my.domain.com/some/image/url.jpg'
390
288
  end
391
289
 
392
- it "should allow thumbor to decrypt it properly with flip" do
393
- url = subject.width(300).height(200).meta(true).smart(true).flip(true).generate
394
-
395
- encrypted = url.split('/')[1]
396
-
397
- decrypted = decrypt_in_thumbor(encrypted)
398
-
399
- expect(decrypted["meta"]).to be_truthy
400
- expect(decrypted["smart"]).to be_truthy
401
- expect(decrypted["image_hash"]).to eq image_md5
402
- expect(decrypted["width"]).to eq 300
403
- expect(decrypted["height"]).to eq 200
404
- expect(decrypted["horizontal_flip"]).to be_truthy
405
-
290
+ it 'has no crop with out a width and height' do
291
+ url = cascade_instance.original_width(100).original_height(100).center(50, 50).generate
292
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
406
293
  end
407
294
 
408
- it "should allow thumbor to decrypt it properly with flop" do
409
- url = subject.width(300).height(200).meta(true).smart(true).flip(true).flop(true).generate
410
-
411
- encrypted = url.split('/')[1]
412
-
413
- decrypted = decrypt_in_thumbor(encrypted)
414
-
415
- expect(decrypted["meta"]).to be_truthy
416
- expect(decrypted["smart"]).to be_truthy
417
- expect(decrypted["image_hash"]).to eq image_md5
418
- expect(decrypted["width"]).to eq 300
419
- expect(decrypted["height"]).to eq 200
420
- expect(decrypted["horizontal_flip"]).to be_truthy
421
- expect(decrypted["vertical_flip"]).to be_truthy
422
-
295
+ it 'uses the original width with a missing width' do
296
+ url = cascade_instance.original_width(100).original_height(100).height(80).center(50, 50).generate
297
+ expect(url).to eq '/02BNIIJ9NYNV9Q03JHPtlP0DIDg=/0x10:100x90/0x80/my.domain.com/some/image/url.jpg'
423
298
  end
424
299
 
425
- it "should allow thumbor to decrypt it properly with halign" do
426
- url = subject.width(300).height(200).meta(true).smart(true).flip(true).flop(true).
427
- halign(:left).generate
428
-
429
- encrypted = url.split('/')[1]
430
-
431
- decrypted = decrypt_in_thumbor(encrypted)
432
-
433
- expect(decrypted["meta"]).to be_truthy
434
- expect(decrypted["smart"]).to be_truthy
435
- expect(decrypted["image_hash"]).to eq image_md5
436
- expect(decrypted["width"]).to eq 300
437
- expect(decrypted["height"]).to eq 200
438
- expect(decrypted["horizontal_flip"]).to be_truthy
439
- expect(decrypted["vertical_flip"]).to be_truthy
440
- expect(decrypted["halign"]).to eq "left"
441
-
300
+ it 'uses the original height with a missing height' do
301
+ url = cascade_instance.original_width(100).original_height(100).width(80).center(50, 50).generate
302
+ expect(url).to eq '/0XL5BmMi3vlJQfw6aGOVW-M1vVI=/10x0:90x100/80x0/my.domain.com/some/image/url.jpg'
442
303
  end
443
304
 
444
- it "should allow thumbor to decrypt it properly with valign" do
445
- url = subject.width(300).height(200).meta(true).smart(true).flip(true).flop(true).
446
- halign(:left).valign(:top).generate
447
-
448
- encrypted = url.split('/')[1]
449
-
450
- decrypted = decrypt_in_thumbor(encrypted)
451
-
452
- expect(decrypted["meta"]).to be_truthy
453
- expect(decrypted["smart"]).to be_truthy
454
- expect(decrypted["image_hash"]).to eq image_md5
455
- expect(decrypted["width"]).to eq 300
456
- expect(decrypted["height"]).to eq 200
457
- expect(decrypted["horizontal_flip"]).to be_truthy
458
- expect(decrypted["vertical_flip"]).to be_truthy
459
- expect(decrypted["halign"]).to eq "left"
460
- expect(decrypted["valign"]).to eq "top"
461
-
305
+ it 'has the right crop with a negative width' do
306
+ url = cascade_instance.original_width(100).original_height(100).width(-50).height(40).center(50, 50).generate
307
+ expect(url).to eq '/IuRNPlFlpTVol45bDkOm2PGvneo=/0x10:100x90/-50x40/my.domain.com/some/image/url.jpg'
462
308
  end
463
309
 
464
- it "should allow thumbor to decrypt it properly with cropping" do
465
- url = subject.width(300).height(200).crop([10, 20, 30, 40]).generate
466
-
467
- encrypted = url.split('/')[1]
468
-
469
- decrypted = decrypt_in_thumbor(encrypted)
470
-
471
- expect(decrypted["horizontal_flip"]).to be_falsy
472
- expect(decrypted["vertical_flip"]).to be_falsy
473
- expect(decrypted["smart"]).to be_falsy
474
- expect(decrypted["meta"]).to be_falsy
475
- expect(decrypted["crop"]["left"]).to eq 10
476
- expect(decrypted["crop"]["top"]).to eq 20
477
- expect(decrypted["crop"]["right"]).to eq 30
478
- expect(decrypted["crop"]["bottom"]).to eq 40
479
- expect(decrypted["valign"]).to eq 'middle'
480
- expect(decrypted["halign"]).to eq 'center'
481
- expect(decrypted["image_hash"]).to eq image_md5
482
- expect(decrypted["width"]).to eq 300
483
- expect(decrypted["height"]).to eq 200
484
-
310
+ it 'has the right crop with a negative height' do
311
+ url = cascade_instance.original_width(100).original_height(100).width(50).height(-40).center(50, 50).generate
312
+ expect(url).to eq '/-8IhWGEeXaY1uv945i9EHLVjwuk=/0x10:100x90/50x-40/my.domain.com/some/image/url.jpg'
485
313
  end
486
314
 
487
- it "should allow thumbor to decrypt it properly with filters" do
488
- url = subject.quality_filter(20).brightness_filter(10).generate
489
-
490
- encrypted = url.split('/')[1]
491
-
492
- decrypted = decrypt_in_thumbor(encrypted)
493
-
494
- expect(decrypted["filters"]).to eq "quality(20):brightness(10)"
315
+ it 'has the right crop with a negative height and width' do
316
+ url = cascade_instance.original_width(100).original_height(100).width(-50).height(-40).center(50, 50).generate
317
+ expect(url).to eq '/lfjGLTTEaW_Rcvc1q0ZhfYup2jg=/0x10:100x90/-50x-40/my.domain.com/some/image/url.jpg'
495
318
  end
496
319
  end
497
320
  end