validates_zipcode 0.2.4 → 0.5.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +23 -43
- data/.travis.yml +9 -6
- data/Appraisals +2 -2
- data/CHANGELOG.md +34 -0
- data/README.md +69 -10
- data/gemfiles/rails_4.2.gemfile +4 -3
- data/gemfiles/rails_4.2.gemfile.lock +30 -5
- data/gemfiles/rails_5.2.gemfile +4 -3
- data/gemfiles/rails_5.2.gemfile.lock +30 -5
- data/gemfiles/rails_6.1.gemfile +8 -0
- data/gemfiles/rails_6.1.gemfile.lock +85 -0
- data/gemfiles/rails_edge.gemfile +4 -3
- data/gemfiles/rails_edge.gemfile.lock +30 -5
- data/lib/validates_zipcode.rb +12 -2
- data/lib/validates_zipcode/cldr_regex_collection.rb +94 -91
- data/lib/validates_zipcode/formatter.rb +53 -0
- data/lib/validates_zipcode/invalid_zipcode_error.rb +5 -0
- data/lib/validates_zipcode/validator.rb +8 -7
- data/lib/validates_zipcode/version.rb +1 -1
- data/lib/validates_zipcode/zipcode.rb +14 -1
- data/spec/format_zipcode_spec.rb +42 -0
- data/spec/spec_helper.rb +3566 -0
- data/spec/validates_zipcode_spec.rb +60 -353
- data/validates_zipcode.gemspec +7 -5
- metadata +47 -15
- data/gemfiles/rails_6.0.gemfile +0 -7
- data/gemfiles/rails_6.0.gemfile.lock +0 -57
@@ -1,363 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
+
# NOTE: Spain has the full case specs.
|
5
|
+
# Do not apply all checks to all countries for suite speed.
|
4
6
|
describe ValidatesZipcode, '#validate_each' do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
record = build_record(zipcode, 'AR')
|
14
|
-
zipcode_should_be_invalid(record, zipcode)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'Australia and New Zeland' do
|
20
|
-
it 'does not add errors with a valid zipcode' do
|
21
|
-
%w[AU NZ].each do |code|
|
22
|
-
record = build_record('9310', code)
|
23
|
-
zipcode_should_be_valid(record)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'adds errors with an invalid Zipcode' do
|
28
|
-
%w[AU NZ].each do |code|
|
29
|
-
%w[C1424CHN 12345 invalid_zip].each do |zipcode|
|
30
|
-
record = build_record(zipcode, code)
|
31
|
-
zipcode_should_be_invalid(record, zipcode)
|
7
|
+
TEST_DATA.each do |country_code, values|
|
8
|
+
context country_code do
|
9
|
+
context 'validates with valid zipcodes' do
|
10
|
+
values[:valid].each do |zipcode|
|
11
|
+
it zipcode do
|
12
|
+
record = build_record(zipcode, country_code)
|
13
|
+
zipcode_should_be_valid(record)
|
14
|
+
end
|
32
15
|
end
|
33
16
|
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'Brazil' do
|
38
|
-
it 'validates with a valid zipcode' do
|
39
|
-
['72315', '72315-500', '72315500', '24210-325', '24210325'].each do |zipcode|
|
40
|
-
record = build_record(zipcode, 'BR')
|
41
|
-
zipcode_should_be_valid(record)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'does not validate with an invalid zipcode' do
|
46
|
-
record = build_record('723155', 'BR')
|
47
|
-
zipcode_should_be_invalid(record, '723155')
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'Canada' do
|
52
|
-
it 'does not add errors with a valid zipcode' do
|
53
|
-
record = build_record('A1J2Z9', 'CA')
|
54
|
-
zipcode_should_be_valid(record)
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'adds errors with an invalid Zipcode' do
|
58
|
-
%w[C1424CHN 12345 D0D0D0 invalid_zip].each do |zipcode|
|
59
|
-
record = build_record(zipcode, 'CA')
|
60
|
-
zipcode_should_be_invalid(record, zipcode)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'Chile' do
|
66
|
-
it 'does not add errors with a valid zipcode' do
|
67
|
-
['123-1233', '000-0000', '1234567'].each do |zipcode|
|
68
|
-
record = build_record(zipcode, 'CL')
|
69
|
-
zipcode_should_be_valid(record)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'adds errors with an invalid Zipcode' do
|
74
|
-
['1234', '12345', 'D0D0D0', 'invalid_zip', 'C1424CHN', '122-12345'].each do |zipcode|
|
75
|
-
record = build_record(zipcode, 'CL')
|
76
|
-
zipcode_should_be_invalid(record, zipcode)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'Czech' do
|
82
|
-
it 'validates with a valid zipcode' do
|
83
|
-
['12000', '721 00'].each do |zipcode|
|
84
|
-
record = build_record(zipcode, 'CZ')
|
85
|
-
zipcode_should_be_valid(record)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'does not validate with an invalid zipcode' do
|
90
|
-
record = build_record('981 32', 'CZ')
|
91
|
-
zipcode_should_be_invalid(record, '981 32')
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context 'Ireland' do
|
96
|
-
it 'does not add errors with a valid postcode - old format' do
|
97
|
-
['D02 AF30', 'X91 PK81', 'V94 H2PP', 'D07 R6YE', 'D6W1234',
|
98
|
-
'A230984', 'D00AV92', 'Y631FHK', 'A000000', 'D44N4X4'].each do |zipcode|
|
99
|
-
record = build_record(zipcode, 'IE')
|
100
|
-
zipcode_should_be_valid(record)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'adds errors with an invalid Zipcode' do
|
105
|
-
['1234', '12345-12345', 'invalid_zip'].each do |zipcode|
|
106
|
-
record = build_record(zipcode, 'IE')
|
107
|
-
zipcode_should_be_invalid(record, zipcode)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
context 'Israel' do
|
113
|
-
it 'validates with a valid zipcode' do
|
114
|
-
%w[1029200 880000 90001].each do |zipcode|
|
115
|
-
record = build_record(zipcode, 'IL')
|
116
|
-
zipcode_should_be_valid(record)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'does not validate with an invalid zipcode' do
|
121
|
-
record = build_record('1200', 'IL')
|
122
|
-
zipcode_should_be_invalid(record, '1200')
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'Japan' do
|
127
|
-
it 'validates with a valid zipcode' do
|
128
|
-
%w[1029200 102-9200 408-0301 207-1000].each do |zipcode|
|
129
|
-
record = build_record(zipcode, 'JP')
|
130
|
-
zipcode_should_be_valid(record)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'does not validate with an invalid zipcode' do
|
135
|
-
record = build_record('1200', 'JP')
|
136
|
-
zipcode_should_be_invalid(record, '1200')
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
context 'Lithuania' do
|
141
|
-
it 'validates with a valid zipcode' do
|
142
|
-
record = build_record('LT-00110', 'LT')
|
143
|
-
zipcode_should_be_valid(record)
|
144
|
-
record = build_record('00110', 'LT')
|
145
|
-
zipcode_should_be_valid(record)
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'does not validate with an invalid zipcode' do
|
149
|
-
record = build_record('2100', 'LT')
|
150
|
-
zipcode_should_be_invalid(record, '2100')
|
151
|
-
record = build_record('LT-2100', 'LT')
|
152
|
-
zipcode_should_be_invalid(record, 'LT-2100')
|
153
|
-
record = build_record('LT21006', 'LT')
|
154
|
-
zipcode_should_be_invalid(record, 'LT21006')
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
context 'Luxembourg' do
|
159
|
-
it 'does not add errors with a valid zipcode' do
|
160
|
-
['L-5635', '5635'].each do |zipcode|
|
161
|
-
record = build_record(zipcode, 'LU')
|
162
|
-
zipcode_should_be_valid(record)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'adds errors with an invalid Zipcode' do
|
167
|
-
['124', '12345-12345', 'D0D0D0', 'invalid_zip'].each do |zipcode|
|
168
|
-
record = build_record(zipcode, 'LU')
|
169
|
-
zipcode_should_be_invalid(record, zipcode)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
context 'Mauritius' do
|
175
|
-
it 'validates with a valid zipcode' do
|
176
|
-
%w[42602 A2101 r6414].each do |zipcode|
|
177
|
-
record = build_record(zipcode, 'MU')
|
178
|
-
zipcode_should_be_valid(record)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
it 'does not validate with an invalid zipcode' do
|
183
|
-
%w[05678 B4242].each do |zipcode|
|
184
|
-
record = build_record(zipcode, 'MU')
|
185
|
-
zipcode_should_be_invalid(record, zipcode)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
context 'Moldova' do
|
191
|
-
it 'validates with a valid zipcode' do
|
192
|
-
record = build_record('MD2001', 'MD')
|
193
|
-
zipcode_should_be_valid(record)
|
194
|
-
end
|
195
|
-
|
196
|
-
it 'does not validate with an invalid zipcode' do
|
197
|
-
record = build_record('MD-2100', 'MD')
|
198
|
-
zipcode_should_be_invalid(record, 'MD-2100')
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
context 'Panama' do
|
203
|
-
it 'validates with a valid zipcode' do
|
204
|
-
%w[0800 6369].each do |zipcode|
|
205
|
-
record = build_record(zipcode, 'PA')
|
206
|
-
zipcode_should_be_valid(record)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'does not validate with an invalid zipcode' do
|
211
|
-
%w[10800 369 A341].each do |zipcode|
|
212
|
-
record = build_record(zipcode, 'PA')
|
213
|
-
zipcode_should_be_invalid(record, zipcode)
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
context 'Portugal' do
|
219
|
-
it 'validates with a valid zipcode' do
|
220
|
-
['4500', '4500-250'].each do |zipcode|
|
221
|
-
record = build_record(zipcode, 'PT')
|
222
|
-
zipcode_should_be_valid(record)
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'does not validate with an invalid zipcode' do
|
227
|
-
record = build_record('4500-2500', 'PT')
|
228
|
-
zipcode_should_be_invalid(record, '4500-2500')
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
context 'Serbia' do
|
233
|
-
it 'validates with a valid zipcode' do
|
234
|
-
record = build_record('21000', 'RS')
|
235
|
-
zipcode_should_be_valid(record)
|
236
|
-
end
|
237
|
-
|
238
|
-
it 'does not validate with an invalid zipcode' do
|
239
|
-
record = build_record('2100', 'RS')
|
240
|
-
zipcode_should_be_invalid(record, '2100')
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
|
-
context 'Slovakia' do
|
245
|
-
it 'validates with a valid zipcode' do
|
246
|
-
['83102', '911 05', '094 12'].each do |zipcode|
|
247
|
-
record = build_record(zipcode, 'SK')
|
248
|
-
zipcode_should_be_valid(record)
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
it 'does not validate with an invalid zipcode' do
|
253
|
-
record = build_record('120 00', 'SK')
|
254
|
-
zipcode_should_be_invalid(record, '120 00')
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
context 'Spain' do
|
259
|
-
it 'does not add errors with a valid zipcode' do
|
260
|
-
record = build_record('93108', 'ES')
|
261
|
-
zipcode_should_be_valid(record)
|
262
|
-
end
|
263
|
-
|
264
|
-
it 'adds errors with an invalid Zipcode' do
|
265
|
-
['1234', '12345-12345', 'D0D0D0', 'invalid_zip'].each do |zipcode|
|
266
|
-
record = build_record(zipcode, 'ES')
|
267
|
-
zipcode_should_be_invalid(record, zipcode)
|
268
|
-
end
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
context 'South Korea' do
|
273
|
-
it 'validates with a valid zipcode' do
|
274
|
-
['72315', '723-150', '11011', '110-110'].each do |zipcode|
|
275
|
-
record = build_record(zipcode, 'KR')
|
276
|
-
zipcode_should_be_valid(record)
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
it 'does not validate with an invalid zipcode' do
|
281
|
-
record = build_record('723155', 'KR')
|
282
|
-
zipcode_should_be_invalid(record, '723155')
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
context 'Taiwan' do
|
287
|
-
it 'validates with a valid zipcode' do
|
288
|
-
['833', '74144'].each do |zipcode|
|
289
|
-
record = build_record(zipcode, 'TW')
|
290
|
-
zipcode_should_be_valid(record)
|
291
|
-
end
|
292
|
-
end
|
293
17
|
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
end
|
298
|
-
end
|
18
|
+
context 'does not validate with invalid zipcodes' do
|
19
|
+
values[:invalid].each do |zipcode|
|
20
|
+
display_name = zipcode.nil? ? 'nil' : zipcode.blank? ? 'blank' : zipcode
|
299
21
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
'ID1 1QD',
|
305
|
-
'M32 0JG',
|
306
|
-
'NE30 1DP',
|
307
|
-
'OX49 5NU',
|
308
|
-
'SW1A 2AA',
|
309
|
-
'W1K 7DA',
|
310
|
-
'id1 1qd',
|
311
|
-
'Sw1A 2aA',
|
312
|
-
'id11qd',
|
313
|
-
'SW1A2AA'
|
314
|
-
].each do |zipcode|
|
315
|
-
record = build_record(zipcode, cc)
|
316
|
-
zipcode_should_be_valid(record)
|
22
|
+
it display_name.to_s do
|
23
|
+
record = build_record(zipcode, country_code)
|
24
|
+
zipcode_should_be_invalid(record, nil)
|
25
|
+
end
|
317
26
|
end
|
318
27
|
end
|
319
|
-
|
320
|
-
it 'does not validate with an invalid zipcode' do
|
321
|
-
[nil, '', 'nope', 'id11qd1000', '28001'].each do |zipcode|
|
322
|
-
record = build_record(zipcode, cc)
|
323
|
-
zipcode_should_be_invalid(record, nil)
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
context 'USA' do
|
330
|
-
it 'does not add errors with a valid zipcode' do
|
331
|
-
record = build_record('93108', 'US')
|
332
|
-
zipcode_should_be_valid(record)
|
333
|
-
[12_345, '12345', '12345-1234', '12345-123456', '12345 1234', '12345 123456'].each do |zipcode|
|
334
|
-
record = build_record(zipcode, 'US')
|
335
|
-
zipcode_should_be_valid(record)
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
it 'adds errors with an invalid Zipcode' do
|
340
|
-
['1234', '12345-12345', 'D0D0D0', 'invalid_zip'].each do |zipcode|
|
341
|
-
record = build_record(zipcode, 'US')
|
342
|
-
zipcode_should_be_invalid(record, zipcode)
|
343
|
-
end
|
344
|
-
end
|
345
|
-
end
|
346
|
-
|
347
|
-
context 'Nicaragua' do
|
348
|
-
it 'validates with a valid zipcode' do
|
349
|
-
# @see https://en.wikipedia.org/wiki/Postal_codes_in_Nicaragua
|
350
|
-
['11002', '11034'].each do |zipcode|
|
351
|
-
record = build_record(zipcode, 'NI')
|
352
|
-
zipcode_should_be_valid(record)
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
it 'does not validate with an invalid zipcode' do
|
357
|
-
['1002', '111034'].each do |zipcode|
|
358
|
-
record = build_record(zipcode, 'NI')
|
359
|
-
zipcode_should_be_invalid(record, zipcode)
|
360
|
-
end
|
361
28
|
end
|
362
29
|
end
|
363
30
|
|
@@ -373,18 +40,30 @@ describe ValidatesZipcode, '#validate_each' do
|
|
373
40
|
it 'validates with a valid zipcode' do
|
374
41
|
%w[0800 6369].each do |zipcode|
|
375
42
|
record = build_record(zipcode, 'PA')
|
376
|
-
zipcode_should_be_valid(record, excluded_country_codes: [
|
43
|
+
zipcode_should_be_valid(record, excluded_country_codes: %w[PA])
|
377
44
|
end
|
378
45
|
end
|
379
46
|
|
380
47
|
it 'validates with an invalid zipcode' do
|
381
48
|
%w[10800 369 A341].each do |zipcode|
|
382
49
|
record = build_record(zipcode, 'PA')
|
383
|
-
zipcode_should_be_valid(record, excluded_country_codes: [
|
50
|
+
zipcode_should_be_valid(record, excluded_country_codes: %w[PA])
|
384
51
|
end
|
385
52
|
end
|
386
53
|
end
|
387
54
|
end
|
55
|
+
|
56
|
+
context 'with formatting' do
|
57
|
+
it 'is true with a valid zipcode for a given country code' do
|
58
|
+
zipcode_should_be_valid(build_record('28 108', 'ES'), format: true)
|
59
|
+
zipcode_should_be_invalid(build_record('28 108', 'ES'), nil)
|
60
|
+
zipcode_should_be_invalid(build_record('28 108', 'ES'), nil, format: false)
|
61
|
+
|
62
|
+
zipcode_should_be_valid(build_record('V2r-1c8', 'CA'), format: true)
|
63
|
+
zipcode_should_be_invalid(build_record('V2r-1c8', 'CA'), nil)
|
64
|
+
zipcode_should_be_invalid(build_record('V2r-1c8', 'CA'), nil, format: false)
|
65
|
+
end
|
66
|
+
end
|
388
67
|
end
|
389
68
|
|
390
69
|
describe ValidatesZipcode, '.valid?' do
|
@@ -404,9 +83,29 @@ describe ValidatesZipcode, '.valid?' do
|
|
404
83
|
end
|
405
84
|
|
406
85
|
it "is true with an excluded country code - we don't want those to fail and nil is hairy" do
|
407
|
-
expect(ValidatesZipcode.valid?('XXXX!!!XXXX', 'PA', excluded_country_codes: [
|
86
|
+
expect(ValidatesZipcode.valid?('XXXX!!!XXXX', 'PA', excluded_country_codes: %w[PA])).to eq(true)
|
408
87
|
end
|
409
88
|
end
|
89
|
+
|
90
|
+
context 'with formatting' do
|
91
|
+
it 'is true with a valid zipcode for a given country code' do
|
92
|
+
expect(ValidatesZipcode.valid?('28 108', 'ES', format: true)).to eq(true)
|
93
|
+
expect(ValidatesZipcode.valid?('28 108', 'ES', format: false)).to eq(false)
|
94
|
+
|
95
|
+
expect(ValidatesZipcode.valid?('V2r-1c8', 'CA', format: true)).to eq(true)
|
96
|
+
expect(ValidatesZipcode.valid?('V2r-1c8', 'CA', format: false)).to eq(false)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe ValidatesZipcode, '.format' do
|
102
|
+
it 'formats valid zipcodes' do
|
103
|
+
expect(ValidatesZipcode.format('Ka9 2dj', 'UK')).to eq('KA9 2DJ')
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'raises for invalid zipcodes' do
|
107
|
+
expect { ValidatesZipcode.format('KA9 1tr', 'DE') }.to raise_error(ValidatesZipcode::InvalidZipcodeError)
|
108
|
+
end
|
410
109
|
end
|
411
110
|
|
412
111
|
def zipcode_should_be_valid(record, options = {})
|
@@ -422,6 +121,14 @@ def zipcode_should_be_invalid(record, _zipcode, options = {})
|
|
422
121
|
expect(record.errors.messages[:zipcode]).to include 'Zipcode is invalid'
|
423
122
|
end
|
424
123
|
|
124
|
+
def zipcode_should_be_invalid_with_custom_message(record, _zipcode, options = {})
|
125
|
+
custom_message = 'is really wrong'
|
126
|
+
ValidatesZipcode::Validator.new(options.merge(attributes: :zipcode, message: custom_message)).validate(record)
|
127
|
+
|
128
|
+
expect(record.errors.size).to eq 1
|
129
|
+
expect(record.errors.messages[:zipcode]).to include custom_message
|
130
|
+
end
|
131
|
+
|
425
132
|
def build_record(zipcode, country_alpha2)
|
426
133
|
ValidationDummyClass.new.tap do |object|
|
427
134
|
object.country_alpha2 = country_alpha2
|