ruby-thumbor 2.0.1 → 4.0.2

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.
@@ -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