file_validators 2.3.0 → 3.0.0.beta1

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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FileValidators
2
- VERSION = '2.3.0'
4
+ VERSION = '3.0.0.beta1'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'rack/test/uploaded_file'
3
5
 
@@ -52,7 +54,7 @@ describe 'Combined File Validators integration with ActiveModel' do
52
54
  before :all do
53
55
  Person.class_eval do
54
56
  Person.reset_callbacks(:validate)
55
- validates_file_size :avatar, { less_than: 20.kilobytes }
57
+ validates_file_size :avatar, less_than: 20.kilobytes
56
58
  validates_file_content_type :avatar, allow: 'image/jpeg'
57
59
  end
58
60
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'rack/test/uploaded_file'
3
5
 
@@ -69,7 +71,8 @@ describe 'File Content Type integration with ActiveModel' do
69
71
  before :all do
70
72
  Person.class_eval do
71
73
  Person.reset_callbacks(:validate)
72
- validates :avatar, file_content_type: { allow: ['image/jpeg', 'text/plain'], mode: :strict }
74
+ validates :avatar, file_content_type: { allow: ['image/jpeg', 'text/plain'],
75
+ mode: :strict }
73
76
  end
74
77
  end
75
78
 
@@ -97,7 +100,7 @@ describe 'File Content Type integration with ActiveModel' do
97
100
  before :all do
98
101
  Person.class_eval do
99
102
  Person.reset_callbacks(:validate)
100
- validates :avatar, file_content_type: { allow: lambda { |record| ['image/jpeg', 'text/plain'] },
103
+ validates :avatar, file_content_type: { allow: ->(_record) { ['image/jpeg', 'text/plain'] },
101
104
  mode: :strict }
102
105
  end
103
106
  end
@@ -177,7 +180,8 @@ describe 'File Content Type integration with ActiveModel' do
177
180
  before :all do
178
181
  Person.class_eval do
179
182
  Person.reset_callbacks(:validate)
180
- validates :avatar, file_content_type: { exclude: ['image/jpeg', 'text/plain'], mode: :strict }
183
+ validates :avatar, file_content_type: { exclude: ['image/jpeg', 'text/plain'],
184
+ mode: :strict }
181
185
  end
182
186
  end
183
187
 
@@ -205,7 +209,8 @@ describe 'File Content Type integration with ActiveModel' do
205
209
  before :all do
206
210
  Person.class_eval do
207
211
  Person.reset_callbacks(:validate)
208
- validates :avatar, file_content_type: { exclude: lambda { |record| /^image\/.*/ }, mode: :strict }
212
+ validates :avatar, file_content_type: { exclude: ->(_record) { /^image\/.*/ },
213
+ mode: :strict }
209
214
  end
210
215
  end
211
216
 
@@ -229,7 +234,8 @@ describe 'File Content Type integration with ActiveModel' do
229
234
  before :all do
230
235
  Person.class_eval do
231
236
  Person.reset_callbacks(:validate)
232
- validates :avatar, file_content_type: { allow: /^image\/.*/, exclude: 'image/png', mode: :strict }
237
+ validates :avatar, file_content_type: { allow: /^image\/.*/, exclude: 'image/png',
238
+ mode: :strict }
233
239
  end
234
240
  end
235
241
 
@@ -334,22 +340,28 @@ describe 'File Content Type integration with ActiveModel' do
334
340
  subject { Person.new }
335
341
 
336
342
  context 'for invalid content type' do
337
- before { subject.avatar = "{\"filename\":\"img140910_88338.GIF\",\"content_type\":\"image/gif\",\"size\":13150}" }
343
+ before do
344
+ subject.avatar = '{"filename":"img140910_88338.GIF","content_type":"image/gif","size":13150}'
345
+ end
346
+
338
347
  it { is_expected.not_to be_valid }
339
348
  end
340
349
 
341
350
  context 'for valid content type' do
342
- before { subject.avatar = "{\"filename\":\"img140910_88338.jpg\",\"content_type\":\"image/jpeg\",\"size\":13150}" }
351
+ before do
352
+ subject.avatar = '{"filename":"img140910_88338.jpg","content_type":"image/jpeg","size":13150}'
353
+ end
354
+
343
355
  it { is_expected.to be_valid }
344
356
  end
345
357
 
346
358
  context 'empty json string' do
347
- before { subject.avatar = "{}" }
359
+ before { subject.avatar = '{}' }
348
360
  it { is_expected.to be_valid }
349
361
  end
350
362
 
351
363
  context 'empty string' do
352
- before { subject.avatar = "" }
364
+ before { subject.avatar = '' }
353
365
  it { is_expected.to be_valid }
354
366
  end
355
367
  end
@@ -365,12 +377,26 @@ describe 'File Content Type integration with ActiveModel' do
365
377
  subject { Person.new }
366
378
 
367
379
  context 'for invalid content type' do
368
- before { subject.avatar = { "filename" => "img140910_88338.GIF", "content_type" => "image/gif", "size" => 13150 } }
380
+ before do
381
+ subject.avatar = {
382
+ 'filename' => 'img140910_88338.GIF',
383
+ 'content_type' => 'image/gif',
384
+ 'size' => 13_150
385
+ }
386
+ end
387
+
369
388
  it { is_expected.not_to be_valid }
370
389
  end
371
390
 
372
391
  context 'for valid content type' do
373
- before { subject.avatar = { "filename" => "img140910_88338.jpg", "content_type" => "image/jpeg", "size" => 13150 } }
392
+ before do
393
+ subject.avatar = {
394
+ 'filename' => 'img140910_88338.jpg',
395
+ 'content_type' => 'image/jpeg',
396
+ 'size' => 13_150
397
+ }
398
+ end
399
+
374
400
  it { is_expected.to be_valid }
375
401
  end
376
402
 
@@ -391,22 +417,22 @@ describe 'File Content Type integration with ActiveModel' do
391
417
  subject { Person.new }
392
418
 
393
419
  context 'for one invalid content type' do
394
- before {
420
+ before do
395
421
  subject.avatar = [
396
422
  Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain'),
397
423
  Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg')
398
424
  ]
399
- }
425
+ end
400
426
  it { is_expected.not_to be_valid }
401
427
  end
402
428
 
403
429
  context 'for two invalid content types' do
404
- before {
430
+ before do
405
431
  subject.avatar = [
406
432
  Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain'),
407
433
  Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain')
408
434
  ]
409
- }
435
+ end
410
436
 
411
437
  it 'is invalid and adds just one error' do
412
438
  expect(subject).not_to be_valid
@@ -415,12 +441,12 @@ describe 'File Content Type integration with ActiveModel' do
415
441
  end
416
442
 
417
443
  context 'for valid content type' do
418
- before {
444
+ before do
419
445
  subject.avatar = [
420
446
  Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg'),
421
447
  Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg')
422
448
  ]
423
- }
449
+ end
424
450
  it { is_expected.to be_valid }
425
451
  end
426
452
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'rack/test/uploaded_file'
3
5
 
@@ -44,7 +46,7 @@ describe 'File Size Validator integration with ActiveModel' do
44
46
  before :all do
45
47
  Person.class_eval do
46
48
  Person.reset_callbacks(:validate)
47
- validates :avatar, file_size: { in: lambda { |record| 20.kilobytes..40.kilobytes } }
49
+ validates :avatar, file_size: { in: ->(_record) { 20.kilobytes..40.kilobytes } }
48
50
  end
49
51
  end
50
52
 
@@ -99,8 +101,8 @@ describe 'File Size Validator integration with ActiveModel' do
99
101
  before :all do
100
102
  Person.class_eval do
101
103
  Person.reset_callbacks(:validate)
102
- validates :avatar, file_size: { greater_than: lambda { |record| 20.kilobytes },
103
- less_than: lambda { |record| 40.kilobytes } }
104
+ validates :avatar, file_size: { greater_than: ->(_record) { 20.kilobytes },
105
+ less_than: ->(_record) { 40.kilobytes } }
104
106
  end
105
107
  end
106
108
 
@@ -218,22 +220,28 @@ describe 'File Size Validator integration with ActiveModel' do
218
220
  subject { Person.new }
219
221
 
220
222
  context 'when file size is less than the specified size' do
221
- before { subject.avatar = "{\"filename\":\"img140910_88338.GIF\",\"content_type\":\"image/gif\",\"size\":13150}" }
223
+ before do
224
+ subject.avatar = '{"filename":"img140910_88338.GIF","content_type":"image/gif","size":13150}'
225
+ end
226
+
222
227
  it { is_expected.not_to be_valid }
223
228
  end
224
229
 
225
230
  context 'when file size within the specified size' do
226
- before { subject.avatar = "{\"filename\":\"img140910_88338.GIF\",\"content_type\":\"image/gif\",\"size\":33150}" }
231
+ before do
232
+ subject.avatar = '{"filename":"img140910_88338.GIF","content_type":"image/gif","size":33150}'
233
+ end
234
+
227
235
  it { is_expected.to be_valid }
228
236
  end
229
237
 
230
238
  context 'empty json string' do
231
- before { subject.avatar = "{}" }
239
+ before { subject.avatar = '{}' }
232
240
  it { is_expected.to be_valid }
233
241
  end
234
242
 
235
243
  context 'empty json string' do
236
- before { subject.avatar = "" }
244
+ before { subject.avatar = '' }
237
245
  it { is_expected.to be_valid }
238
246
  end
239
247
  end
@@ -249,12 +257,26 @@ describe 'File Size Validator integration with ActiveModel' do
249
257
  subject { Person.new }
250
258
 
251
259
  context 'when file size is less than the specified size' do
252
- before { subject.avatar = { "filename" => "img140910_88338.GIF", "content_type" => "image/gif", "size" => 13150 } }
260
+ before do
261
+ subject.avatar = {
262
+ 'filename' => 'img140910_88338.GIF',
263
+ 'content_type' => 'image/gif',
264
+ 'size' => 13_150
265
+ }
266
+ end
267
+
253
268
  it { is_expected.not_to be_valid }
254
269
  end
255
270
 
256
271
  context 'when file size within the specified size' do
257
- before { subject.avatar = { "filename" => "img140910_88338.GIF", "content_type" => "image/gif", "size" => 33150 } }
272
+ before do
273
+ subject.avatar = {
274
+ 'filename' => 'img140910_88338.GIF',
275
+ 'content_type' => 'image/gif',
276
+ 'size' => 33_150
277
+ }
278
+ end
279
+
258
280
  it { is_expected.to be_valid }
259
281
  end
260
282
 
@@ -275,22 +297,22 @@ describe 'File Size Validator integration with ActiveModel' do
275
297
  subject { Person.new }
276
298
 
277
299
  context 'when size of one file is less than the specified size' do
278
- before {
300
+ before do
279
301
  subject.avatar = [
280
302
  Rack::Test::UploadedFile.new(@cute_path),
281
303
  Rack::Test::UploadedFile.new(@chubby_bubble_path)
282
304
  ]
283
- }
305
+ end
284
306
  it { is_expected.not_to be_valid }
285
307
  end
286
308
 
287
309
  context 'when size of all files is within the specified size' do
288
- before {
310
+ before do
289
311
  subject.avatar = [
290
312
  Rack::Test::UploadedFile.new(@cute_path),
291
313
  Rack::Test::UploadedFile.new(@cute_path)
292
314
  ]
293
- }
315
+ end
294
316
 
295
317
  it 'is invalid and adds just one error' do
296
318
  expect(subject).not_to be_valid
@@ -299,12 +321,12 @@ describe 'File Size Validator integration with ActiveModel' do
299
321
  end
300
322
 
301
323
  context 'when size of all files is less than the specified size' do
302
- before {
324
+ before do
303
325
  subject.avatar = [
304
326
  Rack::Test::UploadedFile.new(@chubby_bubble_path),
305
327
  Rack::Test::UploadedFile.new(@chubby_bubble_path)
306
328
  ]
307
- }
329
+ end
308
330
 
309
331
  it { is_expected.to be_valid }
310
332
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'tempfile'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe FileValidators::Utils::MediaTypeSpoofDetector do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ActiveModel::Validations::FileContentTypeValidator do
@@ -17,57 +19,85 @@ describe ActiveModel::Validations::FileContentTypeValidator do
17
19
  before { build_validator allow: 'image/jpg' }
18
20
  it { is_expected.to allow_file_content_type('image/jpg', @validator) }
19
21
  end
20
-
22
+
21
23
  context 'as an regexp' do
22
24
  before { build_validator allow: /^image\/.*/ }
23
25
  it { is_expected.to allow_file_content_type('image/png', @validator) }
24
26
  end
25
-
27
+
26
28
  context 'as a list' do
27
29
  before { build_validator allow: ['image/png', 'image/jpg', 'image/jpeg'] }
28
30
  it { is_expected.to allow_file_content_type('image/png', @validator) }
29
31
  end
30
32
 
31
33
  context 'as a proc' do
32
- before { build_validator allow: lambda { |record| ['image/png', 'image/jpg', 'image/jpeg'] } }
34
+ before { build_validator allow: ->(_record) { ['image/png', 'image/jpg', 'image/jpeg'] } }
33
35
  it { is_expected.to allow_file_content_type('image/png', @validator) }
34
36
  end
35
37
  end
36
-
38
+
37
39
  context 'with a disallowed type' do
38
40
  context 'as a string' do
39
41
  before { build_validator allow: 'image/png' }
40
42
  it { is_expected.not_to allow_file_content_type('image/jpeg', @validator) }
41
43
  end
42
-
44
+
43
45
  context 'as a regexp' do
44
46
  before { build_validator allow: /^text\/.*/ }
45
47
  it { is_expected.not_to allow_file_content_type('image/png', @validator) }
46
48
  end
47
49
 
48
50
  context 'as a proc' do
49
- before { build_validator allow: lambda { |record| /^text\/.*/ } }
51
+ before { build_validator allow: ->(_record) { /^text\/.*/ } }
50
52
  it { is_expected.not_to allow_file_content_type('image/png', @validator) }
51
53
  end
52
-
54
+
53
55
  context 'with :message option' do
54
56
  context 'without interpolation' do
55
- before { build_validator allow: 'image/png', message: 'should be a PNG image' }
56
- it { is_expected.not_to allow_file_content_type('image/jpeg', @validator, message: 'Avatar should be a PNG image') }
57
+ before do
58
+ build_validator allow: 'image/png',
59
+ message: 'should be a PNG image'
60
+ end
61
+
62
+ it do
63
+ is_expected.not_to allow_file_content_type(
64
+ 'image/jpeg', @validator,
65
+ message: 'Avatar should be a PNG image'
66
+ )
67
+ end
57
68
  end
58
-
69
+
59
70
  context 'with interpolation' do
60
- before { build_validator allow: 'image/png', message: 'should have content type %{types}' }
61
- it { is_expected.not_to allow_file_content_type('image/jpeg', @validator,
62
- message: 'Avatar should have content type image/png') }
63
- it { is_expected.to allow_file_content_type('image/png', @validator,
64
- message: 'Avatar should have content type image/png') }
71
+ before do
72
+ build_validator allow: 'image/png',
73
+ message: 'should have content type %{types}'
74
+ end
75
+
76
+ it do
77
+ is_expected.not_to allow_file_content_type(
78
+ 'image/jpeg', @validator,
79
+ message: 'Avatar should have content type image/png'
80
+ )
81
+ end
82
+
83
+ it do
84
+ is_expected.to allow_file_content_type(
85
+ 'image/png', @validator,
86
+ message: 'Avatar should have content type image/png'
87
+ )
88
+ end
65
89
  end
66
90
  end
67
91
 
68
92
  context 'default message' do
69
93
  before { build_validator allow: 'image/png' }
70
- it { is_expected.not_to allow_file_content_type('image/jpeg', @validator, message: 'Avatar file should be one of image/png') }
94
+
95
+ it do
96
+ is_expected.not_to allow_file_content_type(
97
+ 'image/jpeg', @validator,
98
+ message: 'Avatar file should be one of image/png'
99
+ )
100
+ end
71
101
  end
72
102
  end
73
103
  end
@@ -78,23 +108,23 @@ describe ActiveModel::Validations::FileContentTypeValidator do
78
108
  before { build_validator exclude: 'image/gif' }
79
109
  it { is_expected.to allow_file_content_type('image/png', @validator) }
80
110
  end
81
-
111
+
82
112
  context 'as an regexp' do
83
113
  before { build_validator exclude: /^text\/.*/ }
84
114
  it { is_expected.to allow_file_content_type('image/png', @validator) }
85
115
  end
86
-
116
+
87
117
  context 'as a list' do
88
118
  before { build_validator exclude: ['image/png', 'image/jpg', 'image/jpeg'] }
89
119
  it { is_expected.to allow_file_content_type('image/gif', @validator) }
90
120
  end
91
121
 
92
122
  context 'as a proc' do
93
- before { build_validator exclude: lambda { |record| ['image/png', 'image/jpg', 'image/jpeg'] } }
123
+ before { build_validator exclude: ->(_record) { ['image/png', 'image/jpg', 'image/jpeg'] } }
94
124
  it { is_expected.to allow_file_content_type('image/gif', @validator) }
95
125
  end
96
126
  end
97
-
127
+
98
128
  context 'with a disallowed type' do
99
129
  context 'as a string' do
100
130
  before { build_validator exclude: 'image/gif' }
@@ -107,28 +137,56 @@ describe ActiveModel::Validations::FileContentTypeValidator do
107
137
  end
108
138
 
109
139
  context 'as an proc' do
110
- before { build_validator exclude: lambda { |record| /^text\/.*/ } }
140
+ before { build_validator exclude: ->(_record) { /^text\/.*/ } }
111
141
  it { is_expected.not_to allow_file_content_type('text/plain', @validator) }
112
142
  end
113
-
143
+
114
144
  context 'with :message option' do
115
145
  context 'without interpolation' do
116
- before { build_validator exclude: 'image/png', message: 'should not be a PNG image' }
117
- it { is_expected.not_to allow_file_content_type('image/png', @validator, message: 'Avatar should not be a PNG image') }
146
+ before do
147
+ build_validator exclude: 'image/png',
148
+ message: 'should not be a PNG image'
149
+ end
150
+
151
+ it do
152
+ is_expected.not_to allow_file_content_type(
153
+ 'image/png', @validator,
154
+ message: 'Avatar should not be a PNG image'
155
+ )
156
+ end
118
157
  end
119
-
158
+
120
159
  context 'with interpolation' do
121
- before { build_validator exclude: 'image/png', message: 'should not have content type %{types}' }
122
- it { is_expected.not_to allow_file_content_type('image/png', @validator,
123
- message: 'Avatar should not have content type image/png') }
124
- it { is_expected.to allow_file_content_type('image/jpeg', @validator,
125
- message: 'Avatar should not have content type image/jpeg') }
160
+ before do
161
+ build_validator exclude: 'image/png',
162
+ message: 'should not have content type %{types}'
163
+ end
164
+
165
+ it do
166
+ is_expected.not_to allow_file_content_type(
167
+ 'image/png', @validator,
168
+ message: 'Avatar should not have content type image/png'
169
+ )
170
+ end
171
+
172
+ it do
173
+ is_expected.to allow_file_content_type(
174
+ 'image/jpeg', @validator,
175
+ message: 'Avatar should not have content type image/jpeg'
176
+ )
177
+ end
126
178
  end
127
179
  end
128
180
 
129
181
  context 'default message' do
130
182
  before { build_validator exclude: 'image/png' }
131
- it { is_expected.not_to allow_file_content_type('image/png', @validator, message: 'Avatar file cannot be image/png') }
183
+
184
+ it do
185
+ is_expected.not_to allow_file_content_type(
186
+ 'image/png', @validator,
187
+ message: 'Avatar file cannot be image/png'
188
+ )
189
+ end
132
190
  end
133
191
  end
134
192
  end
@@ -151,7 +209,7 @@ describe ActiveModel::Validations::FileContentTypeValidator do
151
209
  expect { build_validator argument => 'image/jpg' }.not_to raise_error
152
210
  expect { build_validator argument => ['image/jpg'] }.not_to raise_error
153
211
  expect { build_validator argument => /^image\/.*/ }.not_to raise_error
154
- expect { build_validator argument => lambda { |record| 'image/jpg' } }.not_to raise_error
212
+ expect { build_validator argument => ->(_record) { 'image/jpg' } }.not_to raise_error
155
213
  end
156
214
 
157
215
  it "raises argument error if :#{argument} is neither a string, array, regexp nor proc" do