file_validators 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ require 'rack/test/uploaded_file'
3
+
4
+ describe 'Combined File Validators integration with ActiveModel' do
5
+ class Person
6
+ include ActiveModel::Validations
7
+ attr_accessor :avatar
8
+ end
9
+
10
+ before :all do
11
+ @cute_path = File.join(File.dirname(__FILE__), '../fixtures/cute.jpg')
12
+ @chubby_bubble_path = File.join(File.dirname(__FILE__), '../fixtures/chubby_bubble.jpg')
13
+ @chubby_cute_path = File.join(File.dirname(__FILE__), '../fixtures/chubby_cute.png')
14
+ @sample_text_path = File.join(File.dirname(__FILE__), '../fixtures/sample.txt')
15
+ end
16
+
17
+ context 'without helpers' do
18
+ before :all do
19
+ Person.class_eval do
20
+ Person.reset_callbacks(:validate)
21
+ validates :avatar, file_size: { less_than: 20.kilobytes },
22
+ file_content_type: { allow: 'image/jpeg' }
23
+ end
24
+ end
25
+
26
+ subject { Person.new }
27
+
28
+ context 'with an allowed type' do
29
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg') }
30
+ it { is_expected.to be_valid }
31
+ end
32
+
33
+ context 'with a disallowed type' do
34
+ it 'invalidates jpeg image file having size bigger than the allowed size' do
35
+ subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path, 'image/jpeg')
36
+ expect(subject).not_to be_valid
37
+ end
38
+
39
+ it 'invalidates png image file' do
40
+ subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png')
41
+ expect(subject).not_to be_valid
42
+ end
43
+
44
+ it 'invalidates text file' do
45
+ subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain')
46
+ expect(subject).not_to be_valid
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'with helpers' do
52
+ before :all do
53
+ Person.class_eval do
54
+ Person.reset_callbacks(:validate)
55
+ validates_file_size :avatar, { less_than: 20.kilobytes }
56
+ validates_file_content_type :avatar, allow: 'image/jpeg'
57
+ end
58
+ end
59
+
60
+ subject { Person.new }
61
+
62
+ context 'with an allowed type' do
63
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg') }
64
+ it { is_expected.to be_valid }
65
+ end
66
+
67
+ context 'with a disallowed type' do
68
+ it 'invalidates jpeg image file having size bigger than the allowed size' do
69
+ subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path, 'image/jpeg')
70
+ expect(subject).not_to be_valid
71
+ end
72
+
73
+ it 'invalidates png image file' do
74
+ subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png')
75
+ expect(subject).not_to be_valid
76
+ end
77
+
78
+ it 'invalidates text file' do
79
+ subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain')
80
+ expect(subject).not_to be_valid
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,195 @@
1
+ require 'spec_helper'
2
+ require 'rack/test/uploaded_file'
3
+
4
+ describe 'File Content Type integration with ActiveModel' do
5
+ class Person
6
+ include ActiveModel::Validations
7
+ attr_accessor :avatar
8
+ end
9
+
10
+ before :all do
11
+ @cute_path = File.join(File.dirname(__FILE__), '../fixtures/cute.jpg')
12
+ @chubby_bubble_path = File.join(File.dirname(__FILE__), '../fixtures/chubby_bubble.jpg')
13
+ @chubby_cute_path = File.join(File.dirname(__FILE__), '../fixtures/chubby_cute.png')
14
+ @sample_text_path = File.join(File.dirname(__FILE__), '../fixtures/sample.txt')
15
+ end
16
+
17
+ context ':allow option' do
18
+ context 'a string' do
19
+ before :all do
20
+ Person.class_eval do
21
+ Person.reset_callbacks(:validate)
22
+ validates :avatar, file_content_type: { allow: 'image/jpeg' }
23
+ end
24
+ end
25
+
26
+ subject { Person.new }
27
+
28
+ context 'with an allowed type' do
29
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg') }
30
+ it { is_expected.to be_valid }
31
+ end
32
+
33
+ context 'with a disallowed type' do
34
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png') }
35
+ it { is_expected.not_to be_valid }
36
+ end
37
+ end
38
+
39
+ context 'as a regex' do
40
+ before :all do
41
+ Person.class_eval do
42
+ Person.reset_callbacks(:validate)
43
+ validates :avatar, file_content_type: { allow: /^image\/.*/ }
44
+ end
45
+ end
46
+
47
+ subject { Person.new }
48
+
49
+ context 'with an allowed types' do
50
+ it 'validates jpeg image file' do
51
+ subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg')
52
+ expect(subject).to be_valid
53
+ end
54
+
55
+ it 'validates png image file' do
56
+ subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png')
57
+ expect(subject).to be_valid
58
+ end
59
+ end
60
+
61
+ context 'with a disallowed type' do
62
+ before { subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain') }
63
+ it { is_expected.not_to be_valid }
64
+ end
65
+ end
66
+
67
+ context 'as a list' do
68
+ before :all do
69
+ Person.class_eval do
70
+ Person.reset_callbacks(:validate)
71
+ validates :avatar, file_content_type: { allow: ['image/jpeg', 'text/plain'] }
72
+ end
73
+ end
74
+
75
+ subject { Person.new }
76
+
77
+ context 'with allowed types' do
78
+ it 'validates jpeg' do
79
+ subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg')
80
+ expect(subject).to be_valid
81
+ end
82
+
83
+ it 'validates text file' do
84
+ subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain')
85
+ expect(subject).to be_valid
86
+ end
87
+ end
88
+
89
+ context 'with a disallowed type' do
90
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png') }
91
+ it { is_expected.not_to be_valid }
92
+ end
93
+ end
94
+ end
95
+
96
+ context ':exclude option' do
97
+ context 'a string' do
98
+ before :all do
99
+ Person.class_eval do
100
+ Person.reset_callbacks(:validate)
101
+ validates :avatar, file_content_type: { exclude: 'image/jpeg' }
102
+ end
103
+ end
104
+
105
+ subject { Person.new }
106
+
107
+ context 'with an allowed type' do
108
+ before { subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain') }
109
+ it { is_expected.to be_valid }
110
+ end
111
+
112
+ context 'with a disallowed type' do
113
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg') }
114
+ it { is_expected.not_to be_valid }
115
+ end
116
+ end
117
+
118
+ context 'as a regex' do
119
+ before :all do
120
+ Person.class_eval do
121
+ Person.reset_callbacks(:validate)
122
+ validates :avatar, file_content_type: { exclude: /^image\/.*/ }
123
+ end
124
+ end
125
+
126
+ subject { Person.new }
127
+
128
+ context 'with an allowed type' do
129
+ before { subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain') }
130
+ it { is_expected.to be_valid }
131
+ end
132
+
133
+ context 'with a disallowed types' do
134
+ it 'invalidates jpeg image file' do
135
+ subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg')
136
+ expect(subject).not_to be_valid
137
+ end
138
+
139
+ it 'invalidates png image file' do
140
+ subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png')
141
+ expect(subject).not_to be_valid
142
+ end
143
+ end
144
+ end
145
+
146
+ context 'as a list' do
147
+ before :all do
148
+ Person.class_eval do
149
+ Person.reset_callbacks(:validate)
150
+ validates :avatar, file_content_type: { exclude: ['image/jpeg', 'text/plain'] }
151
+ end
152
+ end
153
+
154
+ subject { Person.new }
155
+
156
+ context 'with an allowed type' do
157
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png') }
158
+ it { is_expected.to be_valid }
159
+ end
160
+
161
+ context 'with a disallowed types' do
162
+ it 'invalidates jpeg' do
163
+ subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg')
164
+ expect(subject).not_to be_valid
165
+ end
166
+
167
+ it 'invalidates text file' do
168
+ subject.avatar = Rack::Test::UploadedFile.new(@sample_text_path, 'text/plain')
169
+ expect(subject).not_to be_valid
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ context ':allow and :exclude combined' do
176
+ before :all do
177
+ Person.class_eval do
178
+ Person.reset_callbacks(:validate)
179
+ validates :avatar, file_content_type: { allow: /^image\/.*/, exclude: 'image/png' }
180
+ end
181
+ end
182
+
183
+ subject { Person.new }
184
+
185
+ context 'with an allowed type' do
186
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path, 'image/jpeg') }
187
+ it { is_expected.to be_valid }
188
+ end
189
+
190
+ context 'with a disallowed type' do
191
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path, 'image/png') }
192
+ it { is_expected.not_to be_valid }
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+ require 'rack/test/uploaded_file'
3
+
4
+ describe 'File Size Validator integration with ActiveModel' do
5
+ class Person
6
+ include ActiveModel::Validations
7
+ attr_accessor :avatar
8
+ end
9
+
10
+ before :all do
11
+ @cute_path = File.join(File.dirname(__FILE__), '../fixtures/cute.jpg')
12
+ @chubby_bubble_path = File.join(File.dirname(__FILE__), '../fixtures/chubby_bubble.jpg')
13
+ @chubby_cute_path = File.join(File.dirname(__FILE__), '../fixtures/chubby_cute.png')
14
+ end
15
+
16
+ context ':in option' do
17
+ before :all do
18
+ Person.class_eval do
19
+ Person.reset_callbacks(:validate)
20
+ validates :avatar, file_size: { in: 20.kilobytes..40.kilobytes }
21
+ end
22
+ end
23
+
24
+ subject { Person.new }
25
+
26
+ context 'when file size is out of range' do
27
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path) }
28
+ it { is_expected.not_to be_valid }
29
+ end
30
+
31
+ context 'when file size is out of range' do
32
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path) }
33
+ it { is_expected.not_to be_valid }
34
+ end
35
+
36
+ context 'when file size within range' do
37
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path) }
38
+ it { is_expected.to be_valid }
39
+ end
40
+ end
41
+
42
+ context ':greater_than and :less_than option' do
43
+ before :all do
44
+ Person.class_eval do
45
+ Person.reset_callbacks(:validate)
46
+ validates :avatar, file_size: { greater_than: 20.kilobytes,
47
+ less_than: 40.kilobytes }
48
+ end
49
+ end
50
+
51
+ subject { Person.new }
52
+
53
+ context 'when file size is out of range' do
54
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path) }
55
+ it { is_expected.not_to be_valid }
56
+ end
57
+
58
+ context 'when file size is out of range' do
59
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_cute_path) }
60
+ it { is_expected.not_to be_valid }
61
+ end
62
+
63
+ context 'when file size within range' do
64
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path) }
65
+ it { is_expected.to be_valid }
66
+ end
67
+ end
68
+
69
+ context ':less_than_or_equal_to option' do
70
+ before :all do
71
+ Person.class_eval do
72
+ Person.reset_callbacks(:validate)
73
+ validates :avatar, file_size: { less_than_or_equal_to: 20.kilobytes }
74
+ end
75
+ end
76
+
77
+ subject { Person.new }
78
+
79
+ context 'when file size is greater than the specified size' do
80
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path) }
81
+ it { is_expected.not_to be_valid }
82
+ end
83
+
84
+ context 'when file size within the specified size' do
85
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path) }
86
+ it { is_expected.to be_valid }
87
+ end
88
+ end
89
+
90
+ context ':greater_than_or_equal_to option' do
91
+ before :all do
92
+ Person.class_eval do
93
+ Person.reset_callbacks(:validate)
94
+ validates :avatar, file_size: { greater_than_or_equal_to: 20.kilobytes }
95
+ end
96
+ end
97
+
98
+ subject { Person.new }
99
+
100
+ context 'when file size is less than the specified size' do
101
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path) }
102
+ it { is_expected.not_to be_valid }
103
+ end
104
+
105
+ context 'when file size within the specified size' do
106
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path) }
107
+ it { is_expected.to be_valid }
108
+ end
109
+ end
110
+
111
+ context ':less_than option' do
112
+ before :all do
113
+ Person.class_eval do
114
+ Person.reset_callbacks(:validate)
115
+ validates :avatar, file_size: { less_than: 20.kilobytes }
116
+ end
117
+ end
118
+
119
+ subject { Person.new }
120
+
121
+ context 'when file size is greater than the specified size' do
122
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path) }
123
+ it { is_expected.not_to be_valid }
124
+ end
125
+
126
+ context 'when file size within the specified size' do
127
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path) }
128
+ it { is_expected.to be_valid }
129
+ end
130
+ end
131
+
132
+ context ':greater_than option' do
133
+ before :all do
134
+ Person.class_eval do
135
+ Person.reset_callbacks(:validate)
136
+ validates :avatar, file_size: { greater_than: 20.kilobytes }
137
+ end
138
+ end
139
+
140
+ subject { Person.new }
141
+
142
+ context 'when file size is less than the specified size' do
143
+ before { subject.avatar = Rack::Test::UploadedFile.new(@cute_path) }
144
+ it { is_expected.not_to be_valid }
145
+ end
146
+
147
+ context 'when file size within the specified size' do
148
+ before { subject.avatar = Rack::Test::UploadedFile.new(@chubby_bubble_path) }
149
+ it { is_expected.to be_valid }
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,128 @@
1
+ require 'spec_helper'
2
+ require 'file_validators/validators/file_content_type_validator'
3
+
4
+ describe ActiveModel::Validations::FileContentTypeValidator do
5
+ class Dummy
6
+ include ActiveModel::Validations
7
+ end
8
+
9
+ subject { Dummy }
10
+
11
+ def build_validator(options)
12
+ @validator = ActiveModel::Validations::FileContentTypeValidator.new(options.merge(attributes: :avatar))
13
+ end
14
+
15
+ context 'whitelist format' do
16
+ context 'with an allowed type' do
17
+ context 'as a string' do
18
+ before { build_validator allow: 'image/jpg' }
19
+ it { is_expected.to allow_file_content_type('image/jpg', @validator) }
20
+ end
21
+
22
+ context 'as an regexp' do
23
+ before { build_validator allow: /^image\/.*/ }
24
+ it { is_expected.to allow_file_content_type('image/png', @validator) }
25
+ end
26
+
27
+ context 'as a list' do
28
+ before { build_validator allow: ['image/png', 'image/jpg', 'image/jpeg'] }
29
+ it { is_expected.to allow_file_content_type('image/png', @validator) }
30
+ end
31
+ end
32
+
33
+ context 'with a disallowed type' do
34
+ context 'as a string' do
35
+ before { build_validator allow: 'image/png' }
36
+ it { is_expected.not_to allow_file_content_type('image/jpeg', @validator) }
37
+ end
38
+
39
+ context 'as a regexp' do
40
+ before { build_validator allow: /^text\/.*/ }
41
+ it { is_expected.not_to allow_file_content_type('image/png', @validator) }
42
+ end
43
+
44
+ context 'with :message option' do
45
+ context 'without interpolation' do
46
+ before { build_validator allow: 'image/png', message: 'should be a PNG image' }
47
+ it { is_expected.not_to allow_file_content_type('image/jpeg', @validator, message: 'Avatar should be a PNG image') }
48
+ end
49
+
50
+ context 'with interpolation' do
51
+ before { build_validator allow: 'image/png', message: 'should have content type %{types}' }
52
+ it { is_expected.not_to allow_file_content_type('image/jpeg', @validator,
53
+ message: 'Avatar should have content type image/png') }
54
+ it { is_expected.to allow_file_content_type('image/png', @validator,
55
+ message: 'Avatar should have content type image/png') }
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ context 'blacklist format' do
62
+ context 'with an allowed type' do
63
+ context 'as a string' do
64
+ before { build_validator exclude: 'image/gif' }
65
+ it { is_expected.to allow_file_content_type('image/png', @validator) }
66
+ end
67
+
68
+ context 'as an regexp' do
69
+ before { build_validator exclude: /^text\/.*/ }
70
+ it { is_expected.to allow_file_content_type('image/png', @validator) }
71
+ end
72
+
73
+ context 'as a list' do
74
+ before { build_validator exclude: ['image/png', 'image/jpg', 'image/jpeg'] }
75
+ it { is_expected.to allow_file_content_type('image/gif', @validator) }
76
+ end
77
+ end
78
+
79
+ context 'with a disallowed type' do
80
+ context 'as a string' do
81
+ before { build_validator exclude: 'image/gif' }
82
+ it { is_expected.not_to allow_file_content_type('image/gif', @validator) }
83
+ end
84
+
85
+ context 'as an regexp' do
86
+ before { build_validator exclude: /^text\/.*/ }
87
+ it { is_expected.not_to allow_file_content_type('text/plain', @validator) }
88
+ end
89
+
90
+ context 'with :message option' do
91
+ context 'without interpolation' do
92
+ before { build_validator exclude: 'image/png', message: 'should not be a PNG image' }
93
+ it { is_expected.not_to allow_file_content_type('image/png', @validator, message: 'Avatar should not be a PNG image') }
94
+ end
95
+
96
+ context 'with interpolation' do
97
+ before { build_validator exclude: 'image/png', message: 'should not have content type %{types}' }
98
+ it { is_expected.not_to allow_file_content_type('image/png', @validator,
99
+ message: 'Avatar should not have content type image/png') }
100
+ it { is_expected.to allow_file_content_type('image/jpeg', @validator,
101
+ message: 'Avatar should not have content type image/jpeg') }
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ context 'using the helper' do
108
+ before { Dummy.validates_file_content_type :avatar, allow: 'image/jpg' }
109
+
110
+ it 'adds the validator to the class' do
111
+ expect(Dummy.validators_on(:avatar)).to include(ActiveModel::Validations::FileContentTypeValidator)
112
+ end
113
+ end
114
+
115
+ context 'given options' do
116
+ it 'raises argument error if no required argument was given' do
117
+ expect { build_validator message: 'Some message' }.to raise_error(ArgumentError)
118
+ end
119
+
120
+ it 'does not raise argument error if :in was given' do
121
+ expect { build_validator allow: 'image/jpg' }.not_to raise_error
122
+ end
123
+
124
+ it 'does not raise argument error if :exclude was given' do
125
+ expect { build_validator exclude: 'image/jpg' }.not_to raise_error
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+ require 'file_validators/validators/file_size_validator'
3
+
4
+ describe ActiveModel::Validations::FileSizeValidator do
5
+ class Dummy
6
+ include ActiveModel::Validations
7
+ end
8
+
9
+ def storage_units
10
+ if defined?(ActiveSupport::NumberHelper) # Rails 4.0+
11
+ { 5120 => '5 KB', 10240 => '10 KB' }
12
+ else
13
+ { 5120 => '5120 Bytes', 10240 => '10240 Bytes' }
14
+ end
15
+ end
16
+
17
+ before :all do
18
+ @storage_units = storage_units
19
+ end
20
+
21
+ subject { Dummy }
22
+
23
+ def build_validator(options)
24
+ @validator = ActiveModel::Validations::FileSizeValidator.new(options.merge(attributes: :avatar))
25
+ end
26
+
27
+ context 'with :in option' do
28
+ before { build_validator in: (5.kilobytes..10.kilobytes) }
29
+
30
+ it { is_expected.to allow_file_size(7.kilobytes, @validator) }
31
+ it { is_expected.not_to allow_file_size(4.kilobytes, @validator) }
32
+ it { is_expected.not_to allow_file_size(11.kilobytes, @validator) }
33
+ end
34
+
35
+ context 'with :greater_than_or_equal_to option' do
36
+ before { build_validator greater_than_or_equal_to: 10.kilobytes }
37
+
38
+ it { is_expected.to allow_file_size(11.kilobytes, @validator) }
39
+ it { is_expected.to allow_file_size(10.kilobytes, @validator) }
40
+ it { is_expected.not_to allow_file_size(9.kilobytes, @validator) }
41
+ end
42
+
43
+ context 'with :less_than_or_equal_to option' do
44
+ before { build_validator less_than_or_equal_to: 10.kilobytes }
45
+
46
+ it { is_expected.to allow_file_size(9.kilobytes, @validator) }
47
+ it { is_expected.to allow_file_size(10.kilobytes, @validator) }
48
+ it { is_expected.not_to allow_file_size(11.kilobytes, @validator) }
49
+ end
50
+
51
+ context 'with :greater_than option' do
52
+ before { build_validator greater_than: 10.kilobytes }
53
+
54
+ it { is_expected.to allow_file_size(11.kilobytes, @validator) }
55
+ it { is_expected.not_to allow_file_size(10.kilobytes, @validator) }
56
+ end
57
+
58
+ context 'with :less_than option' do
59
+ before { build_validator less_than: 10.kilobytes }
60
+
61
+ it { is_expected.to allow_file_size(9.kilobytes, @validator) }
62
+ it { is_expected.not_to allow_file_size(10.kilobytes, @validator) }
63
+ end
64
+
65
+ context 'with :greater_than and :less_than option' do
66
+ before { build_validator greater_than: 5.kilobytes, less_than: 10.kilobytes }
67
+
68
+ it { is_expected.to allow_file_size(7.kilobytes, @validator) }
69
+ it { is_expected.not_to allow_file_size(5.kilobytes, @validator) }
70
+ it { is_expected.not_to allow_file_size(10.kilobytes, @validator) }
71
+ end
72
+
73
+ context 'with :message option' do
74
+ before { build_validator in: (5.kilobytes..10.kilobytes),
75
+ message: 'is invalid. (Between %{min} and %{max} please.)' }
76
+
77
+ it { is_expected.not_to allow_file_size(11.kilobytes, @validator,
78
+ message: "Avatar is invalid. (Between #{@storage_units[5120]} and #{@storage_units[10240]} please.)") }
79
+
80
+ it { is_expected.to allow_file_size(7.kilobytes, @validator,
81
+ message: "Avatar is invalid. (Between #{@storage_units[5120]} and #{@storage_units[10240]} please.)") }
82
+ end
83
+
84
+
85
+ context 'using the helper' do
86
+ before { Dummy.validates_file_size :avatar, in: (5.kilobytes..10.kilobytes) }
87
+
88
+ it 'adds the validator to the class' do
89
+ expect(Dummy.validators_on(:avatar)).to include(ActiveModel::Validations::FileSizeValidator)
90
+ end
91
+ end
92
+
93
+ context 'given options' do
94
+ it 'raises argument error if no required argument was given' do
95
+ expect { build_validator message: 'Some message' }.to raise_error(ArgumentError)
96
+ end
97
+
98
+ (ActiveModel::Validations::FileSizeValidator::AVAILABLE_CHECKS).each do |argument|
99
+ it "does not raise argument error if #{argument} was given" do
100
+ expect { build_validator argument => 5.kilobytes }.not_to raise_error
101
+ end
102
+ end
103
+
104
+ it 'does not raise argument error if :in was given' do
105
+ expect { build_validator in: (5.kilobytes..10.kilobytes) }.not_to raise_error
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,13 @@
1
+ en:
2
+ number:
3
+ human:
4
+ storage_units:
5
+ format: "%n %u"
6
+ units:
7
+ byte:
8
+ one: "Byte"
9
+ other: "Bytes"
10
+ kb: "KB"
11
+ mb: "MB"
12
+ gb: "GB"
13
+ tb: "TB"
@@ -0,0 +1,16 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require 'active_support/core_ext'
4
+ require_relative '../lib/file_validators'
5
+ require 'rspec'
6
+ require 'coveralls'
7
+
8
+ Coveralls.wear!
9
+
10
+ locale_path = Dir.glob(File.dirname(__FILE__) + '/locale/*.yml')
11
+ I18n.load_path += locale_path unless I18n.load_path.include?(locale_path)
12
+
13
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
14
+
15
+ RSpec.configure do |config|
16
+ end