file_validators 1.0.0

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