valvat 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +2 -1
  5. data/.travis.yml +30 -16
  6. data/CHANGES.md +13 -0
  7. data/Gemfile +2 -3
  8. data/README.md +90 -44
  9. data/gemfiles/activemodel-3-2 +3 -4
  10. data/gemfiles/activemodel-4 +3 -4
  11. data/gemfiles/activemodel-5 +4 -5
  12. data/gemfiles/activemodel-6 +7 -0
  13. data/gemfiles/before-ruby21/activemodel-3-2 +3 -4
  14. data/gemfiles/before-ruby21/activemodel-4 +3 -4
  15. data/gemfiles/before-ruby21/standalone +3 -4
  16. data/gemfiles/standalone +3 -5
  17. data/lib/active_model/validations/valvat_validator.rb +20 -5
  18. data/lib/valvat.rb +3 -1
  19. data/lib/valvat/checksum/gb.rb +30 -13
  20. data/lib/valvat/checksum/ie.rb +1 -1
  21. data/lib/valvat/error.rb +28 -0
  22. data/lib/valvat/locales/en.yml +1 -1
  23. data/lib/valvat/lookup.rb +11 -43
  24. data/lib/valvat/lookup/fault.rb +30 -0
  25. data/lib/valvat/lookup/request.rb +33 -12
  26. data/lib/valvat/lookup/response.rb +36 -0
  27. data/lib/valvat/version.rb +1 -1
  28. data/spec/active_model/validations/valvat_validator_spec.rb +66 -66
  29. data/spec/valvat/checksum/at_spec.rb +2 -2
  30. data/spec/valvat/checksum/be_spec.rb +2 -2
  31. data/spec/valvat/checksum/bg_spec.rb +2 -2
  32. data/spec/valvat/checksum/cy_spec.rb +2 -2
  33. data/spec/valvat/checksum/de_spec.rb +2 -2
  34. data/spec/valvat/checksum/dk_spec.rb +2 -2
  35. data/spec/valvat/checksum/ee_spec.rb +2 -2
  36. data/spec/valvat/checksum/es_spec.rb +2 -2
  37. data/spec/valvat/checksum/fi_spec.rb +2 -2
  38. data/spec/valvat/checksum/fr_spec.rb +2 -2
  39. data/spec/valvat/checksum/gb_spec.rb +5 -3
  40. data/spec/valvat/checksum/gr_spec.rb +2 -2
  41. data/spec/valvat/checksum/hr_spec.rb +2 -2
  42. data/spec/valvat/checksum/hu_spec.rb +2 -2
  43. data/spec/valvat/checksum/ie_spec.rb +8 -2
  44. data/spec/valvat/checksum/it_spec.rb +4 -4
  45. data/spec/valvat/checksum/lt_spec.rb +2 -2
  46. data/spec/valvat/checksum/lu_spec.rb +2 -2
  47. data/spec/valvat/checksum/mt_spec.rb +2 -2
  48. data/spec/valvat/checksum/nl_spec.rb +2 -2
  49. data/spec/valvat/checksum/pl_spec.rb +3 -3
  50. data/spec/valvat/checksum/pt_spec.rb +2 -2
  51. data/spec/valvat/checksum/ro_spec.rb +2 -2
  52. data/spec/valvat/checksum/se_spec.rb +3 -3
  53. data/spec/valvat/checksum/si_spec.rb +4 -4
  54. data/spec/valvat/checksum_spec.rb +2 -2
  55. data/spec/valvat/lockup/fault_spec.rb +32 -0
  56. data/spec/valvat/lockup/request_spec.rb +15 -0
  57. data/spec/valvat/lockup/response_spec.rb +27 -0
  58. data/spec/valvat/lookup_spec.rb +168 -35
  59. data/spec/valvat/syntax_spec.rb +29 -29
  60. data/spec/valvat/utils_spec.rb +6 -6
  61. data/spec/valvat_spec.rb +18 -18
  62. data/valvat.gemspec +1 -0
  63. metadata +29 -6
  64. metadata.gz.sig +0 -0
  65. data/lib/valvat/lookup/request_with_id.rb +0 -31
@@ -5,6 +5,20 @@ require 'valvat/lookup'
5
5
  module ActiveModel
6
6
  module Validations
7
7
  class ValvatValidator < EachValidator
8
+ def initialize(options)
9
+ if options[:lookup]
10
+ options[:lookup] = if options[:lookup] == :fail_if_down
11
+ {fail_if_down: true}
12
+ elsif options[:lookup].is_a?(Hash)
13
+ options[:lookup]
14
+ else
15
+ {}
16
+ end
17
+ end
18
+
19
+ super
20
+ end
21
+
8
22
  def validate_each(record, attribute, value)
9
23
  vat = Valvat(value)
10
24
  iso_country_code = vat.iso_country_code
@@ -17,10 +31,10 @@ module ActiveModel
17
31
 
18
32
  iso_country_code = "eu" if iso_country_code.blank?
19
33
  record.errors.add(attribute, :invalid_vat,
20
- :message => options[:message],
21
- :country_adjective => I18n.t(
34
+ message: options[:message],
35
+ country_adjective: I18n.t(
22
36
  :"valvat.country_adjectives.#{iso_country_code.downcase}",
23
- :default => [:"valvat.country_adjectives.eu", "european"]
37
+ default: [:"valvat.country_adjectives.eu", "european"]
24
38
  )
25
39
  )
26
40
  end
@@ -43,9 +57,10 @@ module ActiveModel
43
57
 
44
58
  def vat_exists?(vat)
45
59
  return true unless options[:lookup]
46
- is_valid = vat.exists?
60
+
61
+ is_valid = vat.exists?(options[:lookup])
47
62
  return is_valid unless is_valid.nil?
48
- options[:lookup] != :fail_if_down
63
+ !options[:lookup][:fail_if_down]
49
64
  end
50
65
  end
51
66
  end
@@ -1,7 +1,9 @@
1
+ require 'valvat/error'
1
2
  require 'valvat/local'
2
3
  require 'valvat/lookup'
3
4
  require 'valvat/lookup/request'
4
- require 'valvat/lookup/request_with_id'
5
+ require 'valvat/lookup/response'
6
+ require 'valvat/lookup/fault'
5
7
  require 'active_model/validations/valvat_validator' if defined?(ActiveModel)
6
8
 
7
9
  class Valvat
@@ -3,33 +3,50 @@ class Valvat
3
3
  class GB < Base
4
4
  OLD_FORMAT_FORBIDDEN_RANGES = [(100_000..999_999), (9_490_001..9_700_000), (9_990_001..9_999_999)]
5
5
  NEW_FORMAT_FORBIDDEN_RANGES = [(1..100_000), (100_001..1_000_000)]
6
+ GOV_NUMBER = /\A(GD[0-4]{1}\d{2})\Z/
7
+ HEALTH_NUMBER = /\A(HA[5-9]{1}\d{2})\Z/
6
8
 
7
9
  def validate
8
10
  vat_number = vat.to_s_wo_country
9
- check_sum = vat.to_s_wo_country[7..8].to_i
10
- vat_base = vat_number[0..6]
11
11
 
12
12
  # government departments and health authorities, so no checksum
13
- return true if vat_number =~ /\A(GD[0-4]{1}\d{2})\Z/ || vat_number =~ /\A(HA[5-9]{1}\d{2})\Z/
14
- return false if vat_number =~ /\A0{9}\Z/ || vat_number =~ /\A0{12}\Z/
13
+ return true if gov_or_health?(vat_number)
14
+ return false if all_zero?(vat_number)
15
15
 
16
- vat_base_sum = vat_base.split('').
17
- map(&:to_i).
18
- zip([8, 7, 6, 5, 4, 3, 2]).
19
- map { |vat_number_digit, multiplier| vat_number_digit * multiplier }.
20
- inject(:+)
16
+ checksum = vat_number[7..8].to_i
17
+ vat_base = vat_number[0..6]
18
+ vat_base_int = vat_base.to_i
19
+ vat_base_sum = generate_vat_base_sum(vat_base)
21
20
 
22
- old_format_remainder = (vat_base_sum + check_sum).modulo(97)
23
- new_format_remainder = (vat_base_sum + 55 + check_sum).modulo(97)
21
+ old_format_remainder = (vat_base_sum + checksum).modulo(97)
22
+ new_format_remainder = (vat_base_sum + 55 + checksum).modulo(97)
24
23
 
25
24
  return false if old_format_remainder == 0 &&
26
- OLD_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base.to_i }
25
+ OLD_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base_int }
27
26
 
28
27
  return false if new_format_remainder == 0 &&
29
- NEW_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base.to_i }
28
+ NEW_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base_int }
30
29
 
31
30
  old_format_remainder == 0 || new_format_remainder == 0
32
31
  end
32
+
33
+ private
34
+
35
+ def gov_or_health?(vat_number)
36
+ vat_number =~ GOV_NUMBER || vat_number =~ HEALTH_NUMBER
37
+ end
38
+
39
+ def all_zero?(vat_number)
40
+ vat_number =~ /\A0{9}\Z/ || vat_number =~ /\A0{12}\Z/
41
+ end
42
+
43
+ def generate_vat_base_sum(vat_base)
44
+ vat_base.split('').
45
+ map(&:to_i).
46
+ zip([8, 7, 6, 5, 4, 3, 2]).
47
+ map { |vat_number_digit, multiplier| vat_number_digit * multiplier }.
48
+ inject(:+)
49
+ end
33
50
  end
34
51
  end
35
52
  end
@@ -6,7 +6,7 @@ class Valvat
6
6
  fig*(i+2)
7
7
  end
8
8
  if str_wo_country.size == 9
9
- total += (CHARS.index(str_wo_country[8]) * 9)
9
+ total += ((CHARS.index(str_wo_country[8]) || 0) * 9)
10
10
  end
11
11
  total.modulo(23)
12
12
  end
@@ -0,0 +1,28 @@
1
+ class Valvat
2
+ Error = Class.new(RuntimeError)
3
+
4
+ class ViesError < Error
5
+ def initialize(faultstring='UNKOWN')
6
+ @faultstring = faultstring
7
+ end
8
+
9
+ def to_s
10
+ "The VIES web service returned the error '#{@faultstring}'."
11
+ end
12
+
13
+ def eql?(other)
14
+ to_s.eql?(other.to_s)
15
+ end
16
+ end
17
+ ViesMaintenanceError = Class.new(ViesError)
18
+
19
+ ServiceUnavailable = Class.new(ViesMaintenanceError)
20
+ MemberStateUnavailable = Class.new(ViesMaintenanceError)
21
+
22
+ Timeout = Class.new(ViesError)
23
+ InvalidRequester = Class.new(ViesError)
24
+ BlockedError = Class.new(ViesError)
25
+ RateLimitError = Class.new(ViesError)
26
+
27
+ UnknownViesError = Class.new(ViesError)
28
+ end
@@ -1,7 +1,7 @@
1
1
  en:
2
2
  errors:
3
3
  messages:
4
- invalid_vat: is not a valid %{country_adjective} vat number
4
+ invalid_vat: is not a valid %{country_adjective} VAT number
5
5
  valvat:
6
6
  country_adjectives:
7
7
  eu: European
@@ -1,36 +1,23 @@
1
- require 'savon'
2
-
3
1
  class Valvat
4
2
  class Lookup
5
- VIES_WSDL_URL = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'
6
- REMOVE_KEYS = [:valid, :@xmlns]
7
-
8
- attr_reader :vat, :options
9
3
 
10
4
  def initialize(vat, options={})
11
5
  @vat = Valvat(vat)
12
6
  @options = options || {}
13
- @options[:requester_vat] = Valvat(requester_vat) if requester_vat
7
+ @options[:requester] ||= @options[:requester_vat]
14
8
  end
15
9
 
16
10
  def validate
17
- return false unless vat.european?
11
+ return false if !@options[:skip_local_validation] && !@vat.valid?
12
+ return handle_vies_error(response[:error]) if response[:error]
18
13
 
19
- valid? && show_details? ? response_details : valid?
20
- rescue => error
21
- return false if invalid_input?(error)
22
- raise error if options[:raise_error]
23
- nil
14
+ response[:valid] && show_details? ? response.to_hash : response[:valid]
24
15
  end
25
16
 
26
17
  class << self
27
18
  def validate(vat, options={})
28
19
  new(vat, options).validate
29
20
  end
30
-
31
- def client
32
- @client ||= Savon::Client.new(wsdl: VIES_WSDL_URL, log: false, follow_redirects: true)
33
- end
34
21
  end
35
22
 
36
23
  private
@@ -40,37 +27,18 @@ class Valvat
40
27
  end
41
28
 
42
29
  def response
43
- @response ||= request.perform(self.class.client)
44
- end
45
-
46
- def request
47
- if requester_vat
48
- RequestWithId.new(vat, requester_vat)
49
- else
50
- Request.new(vat)
51
- end
52
- end
53
-
54
- def requester_vat
55
- options[:requester_vat]
56
- end
57
-
58
- def invalid_input?(err)
59
- return if !err.respond_to?(:to_hash) || !err.to_hash[:fault]
60
- (err.to_hash[:fault][:faultstring] || "").upcase =~ /INVALID_INPUT/
30
+ @response ||= Request.new(@vat, @options).perform
61
31
  end
62
32
 
63
33
  def show_details?
64
- requester_vat || options[:detail]
34
+ @options[:requester] || @options[:detail]
65
35
  end
66
36
 
67
- def response_details
68
- response.inject({}) do |hash, kv|
69
- key, value = kv
70
- unless REMOVE_KEYS.include?(key)
71
- hash[key.to_s.sub(/^trader_/, "").to_sym] = (value == "---" ? nil : value)
72
- end
73
- hash
37
+ def handle_vies_error(error)
38
+ if ViesMaintenanceError === error
39
+ raise error if @options[:raise_error]
40
+ else
41
+ raise error unless @options[:raise_error] == false
74
42
  end
75
43
  end
76
44
  end
@@ -0,0 +1,30 @@
1
+ class Valvat
2
+ class Lookup
3
+ class Fault < Response
4
+ private
5
+
6
+ def self.cleanup(hash)
7
+ fault = hash[:fault][:faultstring]
8
+ return {valid: false} if fault == "INVALID_INPUT"
9
+ {error: fault_to_error(fault)}
10
+ end
11
+
12
+ FAULTS = {
13
+ "SERVICE_UNAVAILABLE" => ServiceUnavailable,
14
+ "MS_UNAVAILABLE" => MemberStateUnavailable,
15
+ "INVALID_REQUESTER_INFO" => InvalidRequester,
16
+ "TIMEOUT" => Timeout,
17
+ "VAT_BLOCKED" => BlockedError,
18
+ "IP_BLOCKED" => BlockedError,
19
+ "GLOBAL_MAX_CONCURRENT_REQ" => RateLimitError,
20
+ "GLOBAL_MAX_CONCURRENT_REQ_TIME" => RateLimitError,
21
+ "MS_MAX_CONCURRENT_REQ" => RateLimitError,
22
+ "MS_MAX_CONCURRENT_REQ_TIME" => RateLimitError
23
+ }
24
+
25
+ def self.fault_to_error(fault)
26
+ (FAULTS[fault] || UnknownViesError).new(fault)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,30 +1,51 @@
1
+ require 'savon'
2
+
1
3
  class Valvat
2
4
  class Lookup
3
5
  class Request
4
- def initialize(vat)
5
- @vat = vat
6
+ VIES_WSDL_URL = 'https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'
7
+
8
+ def initialize(vat, options)
9
+ @vat = Valvat(vat)
10
+ @options = options || {}
11
+ @requester = @options[:requester] && Valvat(@options[:requester])
6
12
  end
7
13
 
8
- def perform(client)
9
- client.call(action, :message => body, :message_tag => message_tag).to_hash[response_key]
14
+ def perform
15
+ begin
16
+ Response.new(
17
+ client.call(action, message: message, message_tag: message_tag)
18
+ )
19
+ rescue Savon::SOAPFault => fault
20
+ Fault.new(fault)
21
+ end
10
22
  end
11
23
 
12
24
  private
13
25
 
14
- def body
15
- {:country_code => @vat.vat_country_code, :vat_number => @vat.to_s_wo_country}
26
+ def client
27
+ Savon::Client.new({
28
+ wsdl: VIES_WSDL_URL, log: false, follow_redirects: true
29
+ }.merge(@options[:savon] || {}))
16
30
  end
17
31
 
18
- def message_tag
19
- :checkVat
32
+ def message
33
+ {
34
+ country_code: @vat.vat_country_code,
35
+ vat_number: @vat.to_s_wo_country
36
+ }.merge(@requester ? {
37
+ requester_country_code: @requester.vat_country_code,
38
+ requester_vat_number: @requester.to_s_wo_country
39
+ } : {}
40
+ )
20
41
  end
21
42
 
22
- def action
23
- :check_vat
43
+ def message_tag
44
+ @requester ? :checkVatApprox : :checkVat
24
45
  end
25
46
 
26
- def response_key
27
- :check_vat_response
47
+ def action
48
+ @requester ? :check_vat_approx : :check_vat
28
49
  end
29
50
  end
30
51
  end
@@ -0,0 +1,36 @@
1
+ class Valvat
2
+ class Lookup
3
+ class Response
4
+ def initialize(raw)
5
+ @raw = raw
6
+ end
7
+
8
+ def [](key)
9
+ to_hash[key]
10
+ end
11
+
12
+ def to_hash
13
+ @hash ||= self.class.cleanup(@raw.to_hash)
14
+ end
15
+
16
+ private
17
+
18
+ def self.cleanup(hash)
19
+ (hash[:check_vat_approx_response] || hash[:check_vat_response] || {}).inject({}) do |hash, (key, value)|
20
+ hash[cleanup_key(key)] = cleanup_value(value) unless key == :"@xmlns"
21
+ hash
22
+ end
23
+ end
24
+
25
+ TRADER_PREFIX = /\Atrader_/
26
+
27
+ def self.cleanup_key(key)
28
+ key.to_s.sub(TRADER_PREFIX, "").to_sym
29
+ end
30
+
31
+ def self.cleanup_value(value)
32
+ value == "---" ? nil : value
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  class Valvat
2
- VERSION = "0.9.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -2,27 +2,27 @@ require 'spec_helper'
2
2
 
3
3
  if defined?(ActiveModel)
4
4
  class Invoice < ModelBase
5
- validates :vat_number, :valvat => true
5
+ validates :vat_number, valvat: true
6
6
  end
7
7
 
8
8
  class InvoiceWithLookup < ModelBase
9
- validates :vat_number, :valvat => {:lookup => true}
9
+ validates :vat_number, valvat: {lookup: true}
10
10
  end
11
11
 
12
12
  class InvoiceWithLookupAndFailIfDown < ModelBase
13
- validates :vat_number, :valvat => {:lookup => :fail_if_down}
13
+ validates :vat_number, valvat: {lookup: :fail_if_down}
14
14
  end
15
15
 
16
16
  class InvoiceAllowBlank < ModelBase
17
- validates :vat_number, :valvat => {:allow_blank => true}
17
+ validates :vat_number, valvat: {allow_blank: true}
18
18
  end
19
19
 
20
20
  class InvoiceAllowBlankOnAll < ModelBase
21
- validates :vat_number, :valvat => true, :allow_blank => true
21
+ validates :vat_number, valvat: true, allow_blank: true
22
22
  end
23
23
 
24
24
  class InvoiceCheckCountry < ModelBase
25
- validates :vat_number, :valvat => {:match_country => :country}
25
+ validates :vat_number, valvat: {match_country: :country}
26
26
 
27
27
  def country
28
28
  @attributes[:country]
@@ -30,7 +30,7 @@ if defined?(ActiveModel)
30
30
  end
31
31
 
32
32
  class InvoiceCheckCountryWithLookup < ModelBase
33
- validates :vat_number, :valvat => {:match_country => :country, :lookup => true}
33
+ validates :vat_number, valvat: {match_country: :country, lookup: true}
34
34
 
35
35
  def country
36
36
  @attributes[:country]
@@ -38,18 +38,18 @@ if defined?(ActiveModel)
38
38
  end
39
39
 
40
40
  class InvoiceWithChecksum < ModelBase
41
- validates :vat_number, :valvat => {:checksum => true}
41
+ validates :vat_number, valvat: {checksum: true}
42
42
  end
43
43
 
44
44
  describe Invoice do
45
- context "with valid vat number" do
45
+ context "with valid VAT number" do
46
46
  it "should be valid" do
47
- expect(Invoice.new(:vat_number => "DE259597697")).to be_valid
47
+ expect(Invoice.new(vat_number: "DE259597697")).to be_valid
48
48
  end
49
49
  end
50
50
 
51
- context "with invalid vat number" do
52
- let(:invoice) { Invoice.new(:vat_number => "DE259597697123") }
51
+ context "with invalid VAT number" do
52
+ let(:invoice) { Invoice.new(vat_number: "DE259597697123") }
53
53
 
54
54
  it "should not be valid" do
55
55
  expect(invoice).not_to be_valid
@@ -57,13 +57,13 @@ if defined?(ActiveModel)
57
57
 
58
58
  it "should add default (country specific) error message" do
59
59
  invoice.valid?
60
- expect(invoice.errors[:vat_number]).to eql(["is not a valid German vat number"])
60
+ expect(invoice.errors[:vat_number]).to eql(["is not a valid German VAT number"])
61
61
  end
62
62
 
63
63
  context "with i18n translation in place" do
64
64
  before do
65
- I18n.backend.store_translations(:en, :activemodel => {
66
- :errors => {:models => {:invoice => {:invalid_vat => "is ugly."}}}
65
+ I18n.backend.store_translations(:en, activemodel: {
66
+ errors: {models: {invoice: {invalid_vat: "is ugly."}}}
67
67
  })
68
68
  end
69
69
 
@@ -77,165 +77,165 @@ if defined?(ActiveModel)
77
77
 
78
78
  context "with i18n translation with country adjective placeholder in place" do
79
79
  before do
80
- I18n.backend.store_translations(:en, :activemodel => {
81
- :errors => {:models => {:invoice => {:invalid_vat => "is not a %{country_adjective} vat"}}}
80
+ I18n.backend.store_translations(:en, activemodel: {
81
+ errors: {models: {invoice: {invalid_vat: "is not a %{country_adjective} vat"}}}
82
82
  })
83
83
  end
84
84
 
85
85
  after { I18n.reload! }
86
86
 
87
87
  it "should replace country adjective placeholder" do
88
- invoice = Invoice.new(:vat_number => "IE123")
88
+ invoice = Invoice.new(vat_number: "IE123")
89
89
  invoice.valid?
90
90
  expect(invoice.errors[:vat_number]).to eql(["is not a Irish vat"])
91
91
  end
92
92
 
93
93
  it "should fall back to 'European' if country is missing" do
94
- invoice = Invoice.new(:vat_number => "XX123")
94
+ invoice = Invoice.new(vat_number: "XX123")
95
95
  invoice.valid?
96
96
  expect(invoice.errors[:vat_number]).to eql(["is not a European vat"])
97
97
  end
98
98
  end
99
99
  end
100
100
 
101
- context "with blank vat number" do
101
+ context "with blank VAT number" do
102
102
  it "should not be valid" do
103
- expect(Invoice.new(:vat_number => "")).not_to be_valid
104
- expect(Invoice.new(:vat_number => nil)).not_to be_valid
103
+ expect(Invoice.new(vat_number: "")).not_to be_valid
104
+ expect(Invoice.new(vat_number: nil)).not_to be_valid
105
105
  end
106
106
  end
107
107
  end
108
108
 
109
109
  describe InvoiceWithLookup do
110
- context "with valid but not existing vat number" do
110
+ context "with valid but not existing VAT number" do
111
111
  before do
112
- allow(Valvat::Syntax).to receive_messages(:validate => true)
113
- allow(Valvat::Lookup).to receive_messages(:validate => false)
112
+ allow(Valvat::Syntax).to receive_messages(validate: true)
113
+ allow(Valvat::Lookup).to receive_messages(validate: false)
114
114
  end
115
115
 
116
116
  it "should not be valid" do
117
- expect(InvoiceWithLookup.new(:vat_number => "DE123")).not_to be_valid
117
+ expect(InvoiceWithLookup.new(vat_number: "DE123")).not_to be_valid
118
118
  end
119
119
  end
120
120
 
121
- context "with valid and existing vat number" do
121
+ context "with valid and existing VAT number" do
122
122
  before do
123
- allow(Valvat::Syntax).to receive_messages(:validate => true)
124
- allow(Valvat::Lookup).to receive_messages(:validate => true)
123
+ allow(Valvat::Syntax).to receive_messages(validate: true)
124
+ allow(Valvat::Lookup).to receive_messages(validate: true)
125
125
  end
126
126
 
127
127
  it "should be valid" do
128
- expect(InvoiceWithLookup.new(:vat_number => "DE123")).to be_valid
128
+ expect(InvoiceWithLookup.new(vat_number: "DE123")).to be_valid
129
129
  end
130
130
  end
131
131
 
132
- context "with valid vat number and VIES country service down" do
132
+ context "with valid VAT number and VIES country service down" do
133
133
  before do
134
- allow(Valvat::Syntax).to receive_messages(:validate => true)
135
- allow(Valvat::Lookup).to receive_messages(:validate => nil)
134
+ allow(Valvat::Syntax).to receive_messages(validate: true)
135
+ allow(Valvat::Lookup).to receive_messages(validate: nil)
136
136
  end
137
137
 
138
138
  it "should be valid" do
139
- expect(InvoiceWithLookup.new(:vat_number => "DE123")).to be_valid
139
+ expect(InvoiceWithLookup.new(vat_number: "DE123")).to be_valid
140
140
  end
141
141
  end
142
142
  end
143
143
 
144
144
  describe InvoiceWithLookupAndFailIfDown do
145
- context "with valid vat number and VIES country service down" do
145
+ context "with valid VAT number and VIES country service down" do
146
146
  before do
147
- allow(Valvat::Syntax).to receive_messages(:validate => true)
148
- allow(Valvat::Lookup).to receive_messages(:validate => nil)
147
+ allow(Valvat::Syntax).to receive_messages(validate: true)
148
+ allow(Valvat::Lookup).to receive_messages(validate: nil)
149
149
  end
150
150
 
151
151
  it "should not be valid" do
152
- expect(InvoiceWithLookupAndFailIfDown.new(:vat_number => "DE123")).not_to be_valid
152
+ expect(InvoiceWithLookupAndFailIfDown.new(vat_number: "DE123")).not_to be_valid
153
153
  end
154
154
  end
155
155
  end
156
156
 
157
157
  describe InvoiceAllowBlank do
158
- context "with blank vat number" do
158
+ context "with blank VAT number" do
159
159
  it "should be valid" do
160
- expect(InvoiceAllowBlank.new(:vat_number => "")).to be_valid
161
- expect(InvoiceAllowBlank.new(:vat_number => nil)).to be_valid
160
+ expect(InvoiceAllowBlank.new(vat_number: "")).to be_valid
161
+ expect(InvoiceAllowBlank.new(vat_number: nil)).to be_valid
162
162
  end
163
163
  end
164
164
  end
165
165
 
166
166
  describe InvoiceAllowBlankOnAll do
167
- context "with blank vat number" do
167
+ context "with blank VAT number" do
168
168
  it "should be valid" do
169
- expect(InvoiceAllowBlankOnAll.new(:vat_number => "")).to be_valid
170
- expect(InvoiceAllowBlankOnAll.new(:vat_number => nil)).to be_valid
169
+ expect(InvoiceAllowBlankOnAll.new(vat_number: "")).to be_valid
170
+ expect(InvoiceAllowBlankOnAll.new(vat_number: nil)).to be_valid
171
171
  end
172
172
  end
173
173
  end
174
174
 
175
175
  describe InvoiceCheckCountry do
176
176
  it "should be not valid on blank country" do
177
- expect(InvoiceCheckCountry.new(:country => nil, :vat_number => "DE259597697")).not_to be_valid
178
- expect(InvoiceCheckCountry.new(:country => "", :vat_number => "DE259597697")).not_to be_valid
177
+ expect(InvoiceCheckCountry.new(country: nil, vat_number: "DE259597697")).not_to be_valid
178
+ expect(InvoiceCheckCountry.new(country: "", vat_number: "DE259597697")).not_to be_valid
179
179
  end
180
180
 
181
181
  it "should be not valid on wired country" do
182
- expect(InvoiceCheckCountry.new(:country => "XAXXX", :vat_number => "DE259597697")).not_to be_valid
183
- expect(InvoiceCheckCountry.new(:country => "ZO", :vat_number => "DE259597697")).not_to be_valid
182
+ expect(InvoiceCheckCountry.new(country: "XAXXX", vat_number: "DE259597697")).not_to be_valid
183
+ expect(InvoiceCheckCountry.new(country: "ZO", vat_number: "DE259597697")).not_to be_valid
184
184
  end
185
185
 
186
186
  it "should be not valid on mismatching (eu) country" do
187
- expect(InvoiceCheckCountry.new(:country => "FR", :vat_number => "DE259597697")).not_to be_valid
188
- expect(InvoiceCheckCountry.new(:country => "AT", :vat_number => "DE259597697")).not_to be_valid
189
- expect(InvoiceCheckCountry.new(:country => "DE", :vat_number => "ATU65931334")).not_to be_valid
187
+ expect(InvoiceCheckCountry.new(country: "FR", vat_number: "DE259597697")).not_to be_valid
188
+ expect(InvoiceCheckCountry.new(country: "AT", vat_number: "DE259597697")).not_to be_valid
189
+ expect(InvoiceCheckCountry.new(country: "DE", vat_number: "ATU65931334")).not_to be_valid
190
190
  end
191
191
 
192
192
  it "should be valid on matching country" do
193
- expect(InvoiceCheckCountry.new(:country => "DE", :vat_number => "DE259597697")).to be_valid
194
- expect(InvoiceCheckCountry.new(:country => "AT", :vat_number => "ATU65931334")).to be_valid
193
+ expect(InvoiceCheckCountry.new(country: "DE", vat_number: "DE259597697")).to be_valid
194
+ expect(InvoiceCheckCountry.new(country: "AT", vat_number: "ATU65931334")).to be_valid
195
195
  end
196
196
 
197
197
  it "should give back error message with country from :country_match" do
198
- invoice = InvoiceCheckCountry.new(:country => "FR", :vat_number => "DE259597697")
198
+ invoice = InvoiceCheckCountry.new(country: "FR", vat_number: "DE259597697")
199
199
  invoice.valid?
200
- expect(invoice.errors[:vat_number]).to eql(["is not a valid French vat number"])
200
+ expect(invoice.errors[:vat_number]).to eql(["is not a valid French VAT number"])
201
201
  end
202
202
 
203
- it "should give back error message with country from :country_match even on invalid vat number" do
204
- invoice = InvoiceCheckCountry.new(:country => "FR", :vat_number => "DE259597697123")
203
+ it "should give back error message with country from :country_match even on invalid VAT number" do
204
+ invoice = InvoiceCheckCountry.new(country: "FR", vat_number: "DE259597697123")
205
205
  invoice.valid?
206
- expect(invoice.errors[:vat_number]).to eql(["is not a valid French vat number"])
206
+ expect(invoice.errors[:vat_number]).to eql(["is not a valid French VAT number"])
207
207
  end
208
208
  end
209
209
 
210
210
  describe InvoiceCheckCountryWithLookup do
211
211
  before do
212
- allow(Valvat::Syntax).to receive_messages(:validate => true)
213
- allow(Valvat::Lookup).to receive_messages(:validate => true)
212
+ allow(Valvat::Syntax).to receive_messages(validate: true)
213
+ allow(Valvat::Lookup).to receive_messages(validate: true)
214
214
  end
215
215
 
216
216
  it "avoids lookup or syntax check on failed because of mismatching country" do
217
217
  expect(Valvat::Syntax).not_to receive(:validate)
218
218
  expect(Valvat::Lookup).not_to receive(:validate)
219
- InvoiceCheckCountryWithLookup.new(:country => "FR", :vat_number => "DE259597697").valid?
219
+ InvoiceCheckCountryWithLookup.new(country: "FR", vat_number: "DE259597697").valid?
220
220
  end
221
221
 
222
222
  it "check syntax and looup on matching country" do
223
223
  expect(Valvat::Syntax).to receive(:validate).and_return(true)
224
224
  expect(Valvat::Lookup).to receive(:validate).and_return(true)
225
- InvoiceCheckCountryWithLookup.new(:country => "DE", :vat_number => "DE259597697").valid?
225
+ InvoiceCheckCountryWithLookup.new(country: "DE", vat_number: "DE259597697").valid?
226
226
  end
227
227
  end
228
228
 
229
229
  describe InvoiceWithChecksum do
230
- context "with valid vat number" do
230
+ context "with valid VAT number" do
231
231
  it "should be valid" do
232
- expect(InvoiceWithChecksum.new(:vat_number => "DE259597697")).to be_valid
232
+ expect(InvoiceWithChecksum.new(vat_number: "DE259597697")).to be_valid
233
233
  end
234
234
  end
235
235
 
236
- context "with invalid vat number" do
236
+ context "with invalid VAT number" do
237
237
  it "should not be valid" do
238
- expect(InvoiceWithChecksum.new(:vat_number => "DE259597687")).not_to be_valid
238
+ expect(InvoiceWithChecksum.new(vat_number: "DE259597687")).not_to be_valid
239
239
  end
240
240
  end
241
241
  end