valvat 1.4.1 → 1.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/valvat/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +34 -82
- metadata.gz.sig +0 -0
- data/.editorconfig +0 -15
- data/.github/workflows/rubocop.yml +0 -17
- data/.github/workflows/specs.yml +0 -47
- data/.gitignore +0 -9
- data/.rubocop.yml +0 -24
- data/CHANGES.md +0 -419
- data/Gemfile +0 -14
- data/Guardfile +0 -7
- data/MIT-LICENSE +0 -20
- data/README.md +0 -350
- data/Rakefile +0 -10
- data/certs/mite.pem +0 -26
- data/gemfiles/activemodel-5 +0 -8
- data/gemfiles/activemodel-6 +0 -8
- data/gemfiles/activemodel-7 +0 -8
- data/gemfiles/standalone +0 -7
- data/spec/active_model/validations/valvat_validator_spec.rb +0 -274
- data/spec/spec_helper.rb +0 -37
- data/spec/valvat/checksum/at_spec.rb +0 -17
- data/spec/valvat/checksum/be_spec.rb +0 -17
- data/spec/valvat/checksum/bg_spec.rb +0 -18
- data/spec/valvat/checksum/cy_spec.rb +0 -17
- data/spec/valvat/checksum/de_spec.rb +0 -17
- data/spec/valvat/checksum/dk_spec.rb +0 -17
- data/spec/valvat/checksum/ee_spec.rb +0 -17
- data/spec/valvat/checksum/es_spec.rb +0 -65
- data/spec/valvat/checksum/fi_spec.rb +0 -17
- data/spec/valvat/checksum/fr_spec.rb +0 -17
- data/spec/valvat/checksum/gb_spec.rb +0 -34
- data/spec/valvat/checksum/gr_spec.rb +0 -17
- data/spec/valvat/checksum/hr_spec.rb +0 -17
- data/spec/valvat/checksum/hu_spec.rb +0 -17
- data/spec/valvat/checksum/ie_spec.rb +0 -24
- data/spec/valvat/checksum/it_spec.rb +0 -25
- data/spec/valvat/checksum/lt_spec.rb +0 -17
- data/spec/valvat/checksum/lu_spec.rb +0 -17
- data/spec/valvat/checksum/mt_spec.rb +0 -17
- data/spec/valvat/checksum/nl_spec.rb +0 -17
- data/spec/valvat/checksum/pl_spec.rb +0 -21
- data/spec/valvat/checksum/pt_spec.rb +0 -30
- data/spec/valvat/checksum/ro_spec.rb +0 -17
- data/spec/valvat/checksum/se_spec.rb +0 -21
- data/spec/valvat/checksum/si_spec.rb +0 -25
- data/spec/valvat/checksum_spec.rb +0 -40
- data/spec/valvat/lookup/hmrc_spec.rb +0 -58
- data/spec/valvat/lookup/vies_spec.rb +0 -25
- data/spec/valvat/lookup_spec.rb +0 -493
- data/spec/valvat/options_spec.rb +0 -23
- data/spec/valvat/syntax_spec.rb +0 -68
- data/spec/valvat/utils_spec.rb +0 -125
- data/spec/valvat_spec.rb +0 -276
- data/valvat.gemspec +0 -24
@@ -1,58 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Valvat::Lookup::HMRC do
|
6
|
-
before do
|
7
|
-
stub_const('Valvat::Lookup::HMRC::ENDPOINT_URL', 'https://test-api.service.hmrc.gov.uk/organisations/vat/check-vat-number/lookup')
|
8
|
-
end
|
9
|
-
|
10
|
-
after do
|
11
|
-
Valvat.configure(uk: false)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns hash with valid: true on success' do
|
15
|
-
response = described_class.new('GB553557881', { uk: true }).perform
|
16
|
-
|
17
|
-
expect(response).to match({
|
18
|
-
valid: true,
|
19
|
-
address: "131B Barton Hamlet\nSW97 5CK\nGB",
|
20
|
-
country_code: 'GB',
|
21
|
-
vat_number: '553557881',
|
22
|
-
name: 'Credite Sberger Donal Inc.',
|
23
|
-
request_date: kind_of(Time)
|
24
|
-
})
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'returns hash with valid: false on invalid input' do
|
28
|
-
response = described_class.new('GB123456789', { uk: true }).perform
|
29
|
-
expect(response).to match({ valid: false })
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'returns hash with valid: false on valid input with :uk option not set' do
|
33
|
-
response = described_class.new('GB553557881', {}).perform
|
34
|
-
expect(response).to match({ valid: false })
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'returns valid: false when uk option is set to false' do
|
38
|
-
response = described_class.new('GB553557881', { uk: false }).perform
|
39
|
-
expect(response).to match({ valid: false })
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'returns valid: false when uk option is not set' do
|
43
|
-
response = described_class.new('GB553557881').perform
|
44
|
-
expect(response).to match({ valid: false })
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'respects global :uk setting' do
|
48
|
-
Valvat.configure(uk: true)
|
49
|
-
response = described_class.new('GB553557881').perform
|
50
|
-
expect(response).to include({ valid: true })
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'overwrite global :uk setting' do
|
54
|
-
Valvat.configure(uk: true)
|
55
|
-
response = described_class.new('GB553557881', uk: false).perform
|
56
|
-
expect(response).to include({ valid: false })
|
57
|
-
end
|
58
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Valvat::Lookup::VIES do
|
6
|
-
it 'returns hash with valid: true on success' do
|
7
|
-
response = described_class.new('IE6388047V', {}).perform
|
8
|
-
|
9
|
-
skip 'VIES is down' if response[:error].is_a?(Valvat::MemberStateUnavailable)
|
10
|
-
|
11
|
-
expect(response).to match({
|
12
|
-
valid: true,
|
13
|
-
address: '3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4',
|
14
|
-
country_code: 'IE',
|
15
|
-
vat_number: '6388047V',
|
16
|
-
name: 'GOOGLE IRELAND LIMITED',
|
17
|
-
request_date: kind_of(Date)
|
18
|
-
})
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'returns hash with valid: false on invalid input' do
|
22
|
-
response = described_class.new('XC123123', {}).perform
|
23
|
-
expect(response.to_hash).to match({ valid: false, faultstring: 'INVALID_INPUT', faultcode: 'env:Server' })
|
24
|
-
end
|
25
|
-
end
|
data/spec/valvat/lookup_spec.rb
DELETED
@@ -1,493 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Valvat::Lookup do
|
6
|
-
describe '#validate' do
|
7
|
-
context 'with existing EU VAT number' do
|
8
|
-
it 'returns true' do
|
9
|
-
result = described_class.validate('IE6388047V')
|
10
|
-
skip 'VIES is down' if result.nil?
|
11
|
-
expect(result).to be(true)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'allows Valvat instance as input' do
|
15
|
-
result = described_class.validate(Valvat.new('IE6388047V'))
|
16
|
-
skip 'VIES is down' if result.nil?
|
17
|
-
expect(result).to be(true)
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'with details' do
|
21
|
-
it 'returns hash of details instead of true' do
|
22
|
-
result = described_class.validate('IE6388047V', detail: true)
|
23
|
-
skip 'VIES is down' if result.nil?
|
24
|
-
|
25
|
-
expect(result).to match({
|
26
|
-
request_date: kind_of(Date),
|
27
|
-
country_code: 'IE',
|
28
|
-
vat_number: '6388047V',
|
29
|
-
name: 'GOOGLE IRELAND LIMITED',
|
30
|
-
address: '3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4',
|
31
|
-
valid: true
|
32
|
-
})
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with existing GB VAT number' do
|
38
|
-
it 'returns true' do
|
39
|
-
result = described_class.validate('GB727255821', uk: true)
|
40
|
-
skip 'HMRC is down' if result.nil?
|
41
|
-
expect(result).to be(true)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'returns details in format similar to VIES' do
|
45
|
-
result = described_class.validate('GB727255821', detail: true, uk: true)
|
46
|
-
skip 'HMRC is down' if result.nil?
|
47
|
-
expect(result).to match({
|
48
|
-
request_date: kind_of(Time),
|
49
|
-
country_code: 'GB',
|
50
|
-
vat_number: '727255821',
|
51
|
-
name: 'AMAZON EU SARL',
|
52
|
-
address: "1 PRINCIPAL PLACE\nWORSHIP STREET\nLONDON\nEC2A 2FA\nGB",
|
53
|
-
valid: true
|
54
|
-
})
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'with not existing EU VAT number' do
|
59
|
-
it 'returns false' do
|
60
|
-
result = described_class.validate('IE6388048V')
|
61
|
-
skip 'VIES is down' if result.nil?
|
62
|
-
expect(result).to be(false)
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'with details' do
|
66
|
-
it 'still returns false' do
|
67
|
-
result = described_class.validate('LU21416128', detail: true)
|
68
|
-
skip 'VIES is down' if result.nil?
|
69
|
-
expect(result).to be(false)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context 'with not existing GB VAT number' do
|
75
|
-
it 'returns false' do
|
76
|
-
result = described_class.validate('GB727255820', uk: true)
|
77
|
-
skip 'HMRC is down' if result.nil?
|
78
|
-
expect(result).to be(false)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
context 'with invalid country code / input' do
|
83
|
-
it 'returns false' do
|
84
|
-
expect(described_class.validate('AE259597697')).to be(false)
|
85
|
-
expect(described_class.validate('')).to be(false)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
context 'with request identifier' do
|
90
|
-
it 'returns hash of details instead of true' do
|
91
|
-
result = described_class.validate('IE6388047V', requester: 'DE129415943')
|
92
|
-
|
93
|
-
skip 'VIES is down' if result.nil?
|
94
|
-
|
95
|
-
expect(result).to match({
|
96
|
-
request_date: kind_of(Date),
|
97
|
-
request_identifier: /\A[\w\W]{16}\Z/,
|
98
|
-
country_code: 'IE',
|
99
|
-
vat_number: '6388047V',
|
100
|
-
name: 'GOOGLE IRELAND LIMITED',
|
101
|
-
company_type: nil,
|
102
|
-
address: '3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4',
|
103
|
-
valid: true
|
104
|
-
})
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'supports old :requester_vat option for backwards compatibility' do
|
108
|
-
result = described_class.validate('IE6388047V', requester_vat: 'LU21416127')
|
109
|
-
|
110
|
-
skip 'VIES is down' if result.nil?
|
111
|
-
|
112
|
-
expect(result).to match({
|
113
|
-
request_date: kind_of(Date),
|
114
|
-
request_identifier: /\A[\w\W]{16}\Z/,
|
115
|
-
country_code: 'IE',
|
116
|
-
vat_number: '6388047V',
|
117
|
-
name: 'GOOGLE IRELAND LIMITED',
|
118
|
-
company_type: nil,
|
119
|
-
address: '3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4',
|
120
|
-
valid: true
|
121
|
-
})
|
122
|
-
end
|
123
|
-
|
124
|
-
context 'with GB VAT number' do
|
125
|
-
it 'returns hash of details with request number' do
|
126
|
-
response = described_class.validate('GB727255821', requester: 'GB727255821', uk: true)
|
127
|
-
skip 'HMRC is down' if response.nil?
|
128
|
-
expect(response).to match({
|
129
|
-
request_date: kind_of(Time),
|
130
|
-
request_identifier: /\A\w\w\w-\w\w\w-\w\w\w\Z/,
|
131
|
-
country_code: 'GB',
|
132
|
-
vat_number: '727255821',
|
133
|
-
name: 'AMAZON EU SARL',
|
134
|
-
address: "1 PRINCIPAL PLACE\nWORSHIP STREET\nLONDON\nEC2A 2FA\nGB",
|
135
|
-
valid: true
|
136
|
-
})
|
137
|
-
end
|
138
|
-
|
139
|
-
it 'raises exception if requester is not from GB' do
|
140
|
-
expect do
|
141
|
-
described_class.validate('GB727255821', requester: 'IE6388047V', uk: true)
|
142
|
-
end.to raise_error(Valvat::InvalidRequester,
|
143
|
-
'The HMRC web service returned the error: ' \
|
144
|
-
'INVALID_REQUEST (Invalid requesterVrn - Vrn parameters should be 9 or 12 digits)')
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'raises exception if requester is not valid' do
|
148
|
-
expect do
|
149
|
-
described_class.validate('GB727255821', requester: 'GB6388047', uk: true)
|
150
|
-
end.to raise_error(Valvat::InvalidRequester,
|
151
|
-
'The HMRC web service returned the error: ' \
|
152
|
-
'INVALID_REQUEST (Invalid requesterVrn - Vrn parameters should be 9 or 12 digits)')
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
context 'when set in global config' do
|
157
|
-
before { Valvat.configure(requester: 'IE6388047V') }
|
158
|
-
after { Valvat.configure(requester: nil) }
|
159
|
-
|
160
|
-
it 'returns hash of details instead of true' do
|
161
|
-
result = described_class.validate('IE6388047V')
|
162
|
-
|
163
|
-
skip 'VIES is down' if result.nil?
|
164
|
-
|
165
|
-
expect(result).to match({
|
166
|
-
request_date: kind_of(Date),
|
167
|
-
request_identifier: /\A[\w\W]{16}\Z/,
|
168
|
-
country_code: 'IE',
|
169
|
-
vat_number: '6388047V',
|
170
|
-
name: 'GOOGLE IRELAND LIMITED',
|
171
|
-
company_type: nil,
|
172
|
-
address: '3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4',
|
173
|
-
valid: true
|
174
|
-
})
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
describe '#validate with VIES test enviroment' do
|
181
|
-
let(:options) do
|
182
|
-
{ skip_local_validation: true }
|
183
|
-
end
|
184
|
-
|
185
|
-
before do
|
186
|
-
stub_const('Valvat::Lookup::VIES::ENDPOINT_URI', URI('https://ec.europa.eu/taxation_customs/vies/test-services/checkVatTestService'))
|
187
|
-
end
|
188
|
-
|
189
|
-
context 'with valid request with valid VAT number' do
|
190
|
-
subject(:result) { described_class.validate('DE100', options) }
|
191
|
-
|
192
|
-
it 'returns true' do
|
193
|
-
expect(result).to be(true)
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
context 'with valid request with an invalid VAT number' do
|
198
|
-
subject(:result) { described_class.validate('DE200', options) }
|
199
|
-
|
200
|
-
it 'returns false' do
|
201
|
-
expect(result).to be(false)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
describe 'Error : INVALID_INPUT' do
|
206
|
-
subject(:result) { described_class.validate('DE201', options) }
|
207
|
-
|
208
|
-
it 'returns false' do
|
209
|
-
expect(result).to be(false)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
describe 'Error : INVALID_REQUESTER_INFO' do
|
214
|
-
subject(:result) { described_class.validate('DE202', options) }
|
215
|
-
|
216
|
-
it 'raises Valvat::InvalidRequester' do
|
217
|
-
expect { result }.to raise_error(Valvat::InvalidRequester)
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
describe 'Error : SERVICE_UNAVAILABLE' do
|
222
|
-
subject(:result) { described_class.validate('DE300', options) }
|
223
|
-
|
224
|
-
it 'returns nil' do
|
225
|
-
expect(result).to be_nil
|
226
|
-
end
|
227
|
-
|
228
|
-
it 'raises error with raise_error: true' do
|
229
|
-
expect do
|
230
|
-
described_class.validate('DE300', options.merge(raise_error: true))
|
231
|
-
end.to raise_error(Valvat::ServiceUnavailable)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
describe 'Error : MS_UNAVAILABLE' do
|
236
|
-
subject(:result) { described_class.validate('DE301', options) }
|
237
|
-
|
238
|
-
it 'returns nil' do
|
239
|
-
expect(result).to be_nil
|
240
|
-
end
|
241
|
-
|
242
|
-
it 'raises error with raise_error: true' do
|
243
|
-
expect do
|
244
|
-
described_class.validate('DE301', options.merge(raise_error: true))
|
245
|
-
end.to raise_error(Valvat::MemberStateUnavailable)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
describe 'Error : TIMEOUT' do
|
250
|
-
subject(:result) { described_class.validate('DE302', options) }
|
251
|
-
|
252
|
-
it 'raises error' do
|
253
|
-
expect { result }.to raise_error(Valvat::Timeout)
|
254
|
-
end
|
255
|
-
|
256
|
-
it 'returns nil with raise_error set to false' do
|
257
|
-
expect(described_class.validate('DE302', options.merge(raise_error: false))).to be_nil
|
258
|
-
end
|
259
|
-
end
|
260
|
-
|
261
|
-
describe 'Network timeout' do
|
262
|
-
subject(:result) { described_class.validate('DE200', options) }
|
263
|
-
|
264
|
-
before { stub_request(:post, /ec.europa.eu/).to_timeout }
|
265
|
-
|
266
|
-
it 'raises error' do
|
267
|
-
expect { result }.to raise_error(Net::OpenTimeout, 'execution expired')
|
268
|
-
end
|
269
|
-
|
270
|
-
it 'also raises error with raise_error set to false (not handled)' do
|
271
|
-
expect do
|
272
|
-
described_class.validate('DE302', options.merge(raise_error: false))
|
273
|
-
end.to raise_error(Net::OpenTimeout, 'execution expired')
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
describe 'Error : VAT_BLOCKED' do
|
278
|
-
subject(:result) { described_class.validate('DE400', options) }
|
279
|
-
|
280
|
-
it 'raises error' do
|
281
|
-
expect { result }.to raise_error(Valvat::BlockedError, /VAT_BLOCKED/)
|
282
|
-
end
|
283
|
-
|
284
|
-
it 'returns nil with raise_error set to false' do
|
285
|
-
expect(described_class.validate('DE400', options.merge(raise_error: false))).to be_nil
|
286
|
-
end
|
287
|
-
end
|
288
|
-
|
289
|
-
describe 'Error : IP_BLOCKED' do
|
290
|
-
subject(:result) { described_class.validate('DE401', options) }
|
291
|
-
|
292
|
-
it 'raises error' do
|
293
|
-
expect { result }.to raise_error(Valvat::BlockedError, /IP_BLOCKED/)
|
294
|
-
end
|
295
|
-
|
296
|
-
it 'returns nil with raise_error set to false' do
|
297
|
-
expect(described_class.validate('DE401', options.merge(raise_error: false))).to be_nil
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
describe 'Error : GLOBAL_MAX_CONCURRENT_REQ' do
|
302
|
-
subject(:result) { described_class.validate('DE500', options) }
|
303
|
-
|
304
|
-
it 'raises error' do
|
305
|
-
expect { result }.to raise_error(Valvat::RateLimitError, /GLOBAL_MAX_CONCURRENT_REQ/)
|
306
|
-
end
|
307
|
-
|
308
|
-
it 'returns nil with raise_error set to false' do
|
309
|
-
expect(described_class.validate('DE500', options.merge(raise_error: false))).to be_nil
|
310
|
-
end
|
311
|
-
end
|
312
|
-
|
313
|
-
describe 'Error : GLOBAL_MAX_CONCURRENT_REQ_TIME' do
|
314
|
-
subject(:result) { described_class.validate('DE501', options) }
|
315
|
-
|
316
|
-
it 'raises error' do
|
317
|
-
expect { result }.to raise_error(Valvat::RateLimitError, /GLOBAL_MAX_CONCURRENT_REQ_TIME/)
|
318
|
-
end
|
319
|
-
|
320
|
-
it 'returns nil with raise_error set to false' do
|
321
|
-
expect(described_class.validate('DE501', options.merge(raise_error: false))).to be_nil
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
describe 'Error : MS_MAX_CONCURRENT_REQ' do
|
326
|
-
subject(:result) { described_class.validate('DE600', options) }
|
327
|
-
|
328
|
-
it 'raises error' do
|
329
|
-
expect { result }.to raise_error(Valvat::RateLimitError, /MS_MAX_CONCURRENT_REQ/)
|
330
|
-
end
|
331
|
-
|
332
|
-
it 'returns nil with raise_error set to false' do
|
333
|
-
expect(described_class.validate('DE600', options.merge(raise_error: false))).to be_nil
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
|
-
describe 'Error : MS_MAX_CONCURRENT_REQ_TIME' do
|
338
|
-
subject(:result) { described_class.validate('DE601', options) }
|
339
|
-
|
340
|
-
it 'raises error' do
|
341
|
-
expect { result }.to raise_error(Valvat::RateLimitError, /MS_MAX_CONCURRENT_REQ_TIME/)
|
342
|
-
end
|
343
|
-
|
344
|
-
it 'returns nil with raise_error set to false' do
|
345
|
-
expect(described_class.validate('DE601', options.merge(raise_error: false))).to be_nil
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
describe 'Error : HTTP error' do
|
350
|
-
subject(:result) { described_class.validate('DE601', options) }
|
351
|
-
|
352
|
-
before do
|
353
|
-
stub_request(:post, %r{\Ahttps://ec\.europa\.eu}).to_return({ status: 405 })
|
354
|
-
end
|
355
|
-
|
356
|
-
it 'raises error' do
|
357
|
-
expect { result }.to raise_error(Valvat::HTTPError, 'The VIES web service returned the error: 405')
|
358
|
-
end
|
359
|
-
|
360
|
-
it 'returns nil with raise_error set to false' do
|
361
|
-
expect(described_class.validate('DE601', options.merge(raise_error: false))).to be_nil
|
362
|
-
end
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
describe '#validate with HMRC test enviroment' do
|
367
|
-
# https://developer.service.hmrc.gov.uk/api-documentation/docs/testing
|
368
|
-
# https://github.com/hmrc/vat-registered-companies-api/blob/master/public/api/conf/1.0/test-data/vrn.csv
|
369
|
-
subject(:result) { described_class.validate('GB123456789', uk: true) }
|
370
|
-
|
371
|
-
before do
|
372
|
-
stub_const('Valvat::Lookup::HMRC::ENDPOINT_URL', 'https://test-api.service.hmrc.gov.uk/organisations/vat/check-vat-number/lookup')
|
373
|
-
end
|
374
|
-
|
375
|
-
context 'with valid request with valid VAT number' do
|
376
|
-
it 'returns true' do
|
377
|
-
expect(described_class.validate('GB553557881', uk: true)).to be(true)
|
378
|
-
expect(described_class.validate('GB146295999727', uk: true)).to be(true)
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
context 'with valid request with an invalid VAT number' do
|
383
|
-
it 'returns false' do
|
384
|
-
expect(result).to be(false)
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
describe 'Error : MESSAGE_THROTTLED_OUT' do
|
389
|
-
before do
|
390
|
-
stub_request(:get, /test-api\.service\.hmrc\.gov\.uk/).to_return(
|
391
|
-
status: 429,
|
392
|
-
body: '{"code":"MESSAGE_THROTTLED_OUT"}'
|
393
|
-
)
|
394
|
-
end
|
395
|
-
|
396
|
-
it 'raises error' do
|
397
|
-
expect { result }.to raise_error(Valvat::RateLimitError, /MESSAGE_THROTTLED_OUT/)
|
398
|
-
end
|
399
|
-
|
400
|
-
it 'returns nil with raise_error set to false' do
|
401
|
-
expect(described_class.validate('GB123456789', raise_error: false, uk: true)).to be_nil
|
402
|
-
end
|
403
|
-
end
|
404
|
-
|
405
|
-
describe 'Error : SCHEDULED_MAINTENANCE' do
|
406
|
-
before do
|
407
|
-
stub_request(:get, /test-api\.service\.hmrc\.gov\.uk/).to_return(
|
408
|
-
status: 503,
|
409
|
-
body: '{"code":"SCHEDULED_MAINTENANCE"}'
|
410
|
-
)
|
411
|
-
end
|
412
|
-
|
413
|
-
it 'returns nil' do
|
414
|
-
expect(result).to be_nil
|
415
|
-
end
|
416
|
-
|
417
|
-
it 'raises error with raise_error set to false' do
|
418
|
-
expect do
|
419
|
-
described_class.validate('GB123456789', raise_error: true, uk: true)
|
420
|
-
end.to raise_error(Valvat::ServiceUnavailable, 'The HMRC web service returned the error: SCHEDULED_MAINTENANCE')
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
describe 'Error : SERVER_ERROR' do
|
425
|
-
before do
|
426
|
-
stub_request(:get, /test-api\.service\.hmrc\.gov\.uk/).to_return(
|
427
|
-
status: 503,
|
428
|
-
body: '{"code":"SERVER_ERROR"}'
|
429
|
-
)
|
430
|
-
end
|
431
|
-
|
432
|
-
it 'returns nil' do
|
433
|
-
expect(result).to be_nil
|
434
|
-
end
|
435
|
-
|
436
|
-
it 'raises error with raise_error set to false' do
|
437
|
-
expect do
|
438
|
-
described_class.validate('GB123456789', raise_error: true, uk: true)
|
439
|
-
end.to raise_error(Valvat::ServiceUnavailable, 'The HMRC web service returned the error: SERVER_ERROR')
|
440
|
-
end
|
441
|
-
end
|
442
|
-
|
443
|
-
describe 'Error : GATEWAY_TIMEOUT' do
|
444
|
-
before do
|
445
|
-
stub_request(:get, /test-api\.service\.hmrc\.gov\.uk/).to_return(
|
446
|
-
status: 504,
|
447
|
-
body: '{"code":"GATEWAY_TIMEOUT"}'
|
448
|
-
)
|
449
|
-
end
|
450
|
-
|
451
|
-
it 'raises error' do
|
452
|
-
expect { result }.to raise_error(Valvat::Timeout, /GATEWAY_TIMEOUT/)
|
453
|
-
end
|
454
|
-
|
455
|
-
it 'returns nil with raise_error set to false' do
|
456
|
-
expect(described_class.validate('GB123456789', raise_error: false, uk: true)).to be_nil
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
describe 'Network timeout' do
|
461
|
-
before do
|
462
|
-
stub_request(:get, /test-api\.service\.hmrc\.gov\.uk/).to_timeout
|
463
|
-
end
|
464
|
-
|
465
|
-
it 'raises error' do
|
466
|
-
expect { result }.to raise_error(Net::OpenTimeout)
|
467
|
-
end
|
468
|
-
|
469
|
-
it 'also raises error with raise_error set to false (not handled)' do
|
470
|
-
expect do
|
471
|
-
described_class.validate('GB123456789', raise_error: false, uk: true)
|
472
|
-
end.to raise_error(Net::OpenTimeout)
|
473
|
-
end
|
474
|
-
end
|
475
|
-
|
476
|
-
describe 'Error : INTERNAL_SERVER_ERROR' do
|
477
|
-
before do
|
478
|
-
stub_request(:get, /test-api\.service\.hmrc\.gov\.uk/).to_return(
|
479
|
-
status: 500,
|
480
|
-
body: '{"code":"INTERNAL_SERVER_ERROR"}'
|
481
|
-
)
|
482
|
-
end
|
483
|
-
|
484
|
-
it 'raises error' do
|
485
|
-
expect { result }.to raise_error(Valvat::UnknownLookupError, /INTERNAL_SERVER_ERROR/)
|
486
|
-
end
|
487
|
-
|
488
|
-
it 'returns nil with raise_error set to false' do
|
489
|
-
expect(described_class.validate('GB123456789', raise_error: false, uk: true)).to be_nil
|
490
|
-
end
|
491
|
-
end
|
492
|
-
end
|
493
|
-
end
|
data/spec/valvat/options_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Valvat::Options do
|
6
|
-
describe '#[]' do
|
7
|
-
it 'returns global config by default' do
|
8
|
-
expect(described_class.new({})[:uk]).to be(false)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'returns option if set' do
|
12
|
-
expect(described_class.new({ uk: true })[:uk]).to be(true)
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'when options contains deprecated key' do
|
16
|
-
let(:options) { described_class.new({ requester_vat: 'DE123' }, silence: true) }
|
17
|
-
|
18
|
-
it 'returns it on new key' do
|
19
|
-
expect(options[:requester]).to be('DE123')
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/spec/valvat/syntax_spec.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
def it_validates(valid_vats, invalid_vats)
|
6
|
-
valid_vats.each do |valid|
|
7
|
-
it "returns true for #{valid.inspect}" do
|
8
|
-
expect(described_class.validate(valid)).to be(true)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
invalid_vats.each do |invalid|
|
13
|
-
it "returns false for #{invalid.inspect}" do
|
14
|
-
expect(described_class.validate(invalid)).to be(false)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe Valvat::Syntax do
|
20
|
-
describe '#validate' do
|
21
|
-
it_validates(%w[ATU03458890], %w[ATU034588908 ATU0345908 ATU0345889Y])
|
22
|
-
it_validates(%w[BE0817331995 BE1817331999], %w[BE081733199 BE08173319944 BE081733199H BE2817331999])
|
23
|
-
it_validates(%w[BG468134789 BG4681347897], %w[BG46813478979 BG4681347897C BG46813478G BG46813478])
|
24
|
-
it_validates(%w[CY36579347A CY36579347C CY60000347C], %w[CY36579347 CY365793478 CY365793478A CY365793G])
|
25
|
-
it_validates(%w[CZ56389267 CZ563892670 CZ5638926790], %w[CZ5638926 CZ56389268901])
|
26
|
-
it_validates(%w[DE345889003], %w[DE34588900 DE3458890090 DE34588900C])
|
27
|
-
it_validates(%w[DK67893463], %w[DK678934637 DK6789346 DK6789346H])
|
28
|
-
it_validates(%w[EE100207415], %w[EE1002074150 EE10020741 EE10020741 EE100207415K])
|
29
|
-
it_validates(%w[EL678456345], %w[EL67845634 EL6784563459 EL67845634P])
|
30
|
-
it_validates(%w[ESX67345987 ESA6734598B ES56734598C], %w[ES167345987 ESX6734598 ESX673459890])
|
31
|
-
it_validates(%w[FI67845638], %w[FI678456389 FI6784563 FI6784563K])
|
32
|
-
it_validates(%w[FR99123543267 FRBB123543267 FR9B123543267 FRB9123543267],
|
33
|
-
%w[FR99123543267B FRBB12354326 FR9B123543F67 FRB9123543])
|
34
|
-
it_validates(%w[GB123456789 GB123456789012 GBGD123 GBHA123],
|
35
|
-
%w[GB12345678 GB1234567890 GB12345678901 GB1234567890123 GBAB123 GBAA123 GBHH123 GBGD1234 GBGD12])
|
36
|
-
it_validates(%w[HR12345678912], %w[HR6789459 HR67894595L HR6789459J])
|
37
|
-
it_validates(%w[HU67894595], %w[HU6789459 HU67894595L HU6789459J])
|
38
|
-
it_validates(%w[IE1B12345J IE1234567B IE1234567XX], %w[IE1B123459 IE19123450 IEA9123450 IE1B12345XX IE1X34567XX])
|
39
|
-
it_validates(%w[IT45875359285 IT00146089990], %w[IT458753592859 IT4587535928G IT4587535928])
|
40
|
-
it_validates(%w[LT213179412 LT290061371314],
|
41
|
-
%w[LT21317942 LT213179422 LT2131794120 LT213179412K LT29006137132 LT290061371324 LT29006137131C
|
42
|
-
LT290061371314H])
|
43
|
-
it_validates(%w[LU45679456], %w[LU4567945 LU456794560 LU4567945J])
|
44
|
-
it_validates(%w[LV85678368906], %w[LV8567836890 LV856783689066 LV8567836890S])
|
45
|
-
it_validates(%w[MT64569367], %w[MT6456936 MT645693679 MT6456936L])
|
46
|
-
it_validates(%w[NL673739491B77], %w[NL673739491977 NL673739491A77 NL673739491B771 NL673739491B7 NL6737394917B7])
|
47
|
-
it_validates(%w[PL6784567284], %w[PL678456728 PL67845672849 PL678456728K])
|
48
|
-
it_validates(%w[PT346296476], %w[PT34629647 PT3462964769])
|
49
|
-
it_validates(%w[RO1234567890 RO123456789 RO12345678 RO1234567 RO123456 RO12345 RO1234 RO123 RO12],
|
50
|
-
%w[RO1 RO0234567890 RO023456789 RO02345678 RO0234567 RO023456 RO02345 RO0234 RO02 RO12345678901])
|
51
|
-
it_validates(%w[SE567396352701], %w[SE56739635201 SE5673963527701 SE567396352702 SE567396352711])
|
52
|
-
it_validates(%w[SI74357893], %w[SI743578931 SI7435789])
|
53
|
-
it_validates(%w[SK5683075682], %w[SK56830756821 SK568307568])
|
54
|
-
it_validates(%w[XI123456789 XI123456789012 XIGD123 XIHA123],
|
55
|
-
%w[XI12345678 XI12345678901234 XIGD1234 XIHA1234 XIGD12 XIHA12 XIHD123])
|
56
|
-
|
57
|
-
it 'returns false on blank/non-sense VAT number' do
|
58
|
-
['', ' ', 'DE', 'atu123xyz', 'xxxxxxxxxx', 'BEFR'].each do |input|
|
59
|
-
expect(described_class.validate(input)).to be(false)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'allows Valvat instance as input' do
|
64
|
-
expect(described_class.validate(Valvat.new('DE345889003'))).to be(true)
|
65
|
-
expect(described_class.validate(Valvat.new('DE34588900X'))).to be(false)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|