br_documents 0.1.3 → 0.2.2

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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/config.yml +40 -0
  3. data/.rubocop.yml +73 -0
  4. data/.tool-versions +1 -0
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +79 -42
  7. data/README.md +33 -0
  8. data/Rakefile +4 -4
  9. data/br_documents.gemspec +26 -19
  10. data/lib/br_documents/cnpj_cpf/cnpj.rb +2 -2
  11. data/lib/br_documents/cnpj_cpf/cpf.rb +2 -2
  12. data/lib/br_documents/cnpj_cpf/document.rb +9 -9
  13. data/lib/br_documents/cnpj_validator.rb +4 -4
  14. data/lib/br_documents/commons/mod11.rb +1 -2
  15. data/lib/br_documents/commons/mod14.rb +1 -2
  16. data/lib/br_documents/cpf_validator.rb +4 -4
  17. data/lib/br_documents/{gtin/gtin.rb → gtin.rb} +3 -3
  18. data/lib/br_documents/gtin_validator.rb +6 -6
  19. data/lib/br_documents/ie/ac.rb +3 -2
  20. data/lib/br_documents/ie/al.rb +2 -1
  21. data/lib/br_documents/ie/am.rb +3 -2
  22. data/lib/br_documents/ie/ap.rb +20 -16
  23. data/lib/br_documents/ie/ba.rb +28 -25
  24. data/lib/br_documents/ie/base.rb +1 -1
  25. data/lib/br_documents/ie/ce.rb +3 -2
  26. data/lib/br_documents/ie/df.rb +3 -2
  27. data/lib/br_documents/ie/es.rb +2 -1
  28. data/lib/br_documents/ie/factory.rb +3 -3
  29. data/lib/br_documents/ie/go.rb +3 -2
  30. data/lib/br_documents/ie/ma.rb +2 -1
  31. data/lib/br_documents/ie/mg.rb +14 -17
  32. data/lib/br_documents/ie/ms.rb +2 -1
  33. data/lib/br_documents/ie/mt.rb +6 -5
  34. data/lib/br_documents/ie/pa.rb +3 -2
  35. data/lib/br_documents/ie/pattern1.rb +10 -7
  36. data/lib/br_documents/ie/pattern2.rb +9 -8
  37. data/lib/br_documents/ie/pb.rb +3 -2
  38. data/lib/br_documents/ie/pe.rb +10 -10
  39. data/lib/br_documents/ie/pi.rb +2 -1
  40. data/lib/br_documents/ie/pr.rb +3 -2
  41. data/lib/br_documents/ie/rj.rb +3 -2
  42. data/lib/br_documents/ie/rn.rb +19 -16
  43. data/lib/br_documents/ie/ro.rb +16 -13
  44. data/lib/br_documents/ie/rr.rb +4 -3
  45. data/lib/br_documents/ie/rs.rb +3 -2
  46. data/lib/br_documents/ie/sc.rb +3 -2
  47. data/lib/br_documents/ie/se.rb +3 -2
  48. data/lib/br_documents/ie/sp.rb +17 -14
  49. data/lib/br_documents/ie/to.rb +6 -5
  50. data/lib/br_documents/ie_validator.rb +7 -7
  51. data/lib/br_documents/suframa.rb +46 -0
  52. data/lib/br_documents/suframa_validator.rb +8 -0
  53. data/lib/br_documents/version.rb +1 -1
  54. data/lib/br_documents.rb +3 -3
  55. data/spec/br_documents/cnpj_cpf/cnpj_spec.rb +59 -0
  56. data/spec/br_documents/cnpj_cpf/cpf_spec.rb +59 -0
  57. data/spec/br_documents/cnpj_validator_spec.rb +36 -0
  58. data/spec/br_documents/cpf_validator_spec.rb +36 -0
  59. data/spec/{gtin → br_documents}/gtin_spec.rb +4 -4
  60. data/spec/{gtin_validator_spec.rb → br_documents/gtin_validator_spec.rb} +14 -14
  61. data/spec/br_documents/ie/ac_spec.rb +43 -0
  62. data/spec/br_documents/ie/al_spec.rb +36 -0
  63. data/spec/br_documents/ie/am_spec.rb +43 -0
  64. data/spec/br_documents/ie/ap_spec.rb +36 -0
  65. data/spec/br_documents/ie/ba_spec.rb +69 -0
  66. data/spec/br_documents/ie/ce_spec.rb +16 -0
  67. data/spec/br_documents/ie/df_spec.rb +43 -0
  68. data/spec/br_documents/ie/es_spec.rb +16 -0
  69. data/spec/br_documents/ie/factory_spec.rb +202 -0
  70. data/spec/br_documents/ie/go_spec.rb +43 -0
  71. data/spec/br_documents/ie/ma_spec.rb +16 -0
  72. data/spec/br_documents/ie/mg_spec.rb +43 -0
  73. data/spec/br_documents/ie/ms_spec.rb +16 -0
  74. data/spec/br_documents/ie/mt_spec.rb +49 -0
  75. data/spec/br_documents/ie/pa_spec.rb +43 -0
  76. data/spec/br_documents/ie/pb_spec.rb +16 -0
  77. data/spec/br_documents/ie/pe_spec.rb +62 -0
  78. data/spec/br_documents/ie/pi_spec.rb +16 -0
  79. data/spec/br_documents/ie/pr_spec.rb +36 -0
  80. data/spec/br_documents/ie/rj_spec.rb +43 -0
  81. data/spec/br_documents/ie/rn_spec.rb +62 -0
  82. data/spec/br_documents/ie/ro_spec.rb +62 -0
  83. data/spec/br_documents/ie/rr_spec.rb +43 -0
  84. data/spec/br_documents/ie/rs_spec.rb +41 -0
  85. data/spec/br_documents/ie/sc_spec.rb +43 -0
  86. data/spec/br_documents/ie/se_spec.rb +16 -0
  87. data/spec/br_documents/ie/shared_examples_for_pattern1.rb +33 -0
  88. data/spec/br_documents/ie/shared_examples_for_to_remove_all_masks.rb +16 -0
  89. data/spec/br_documents/ie/sp_spec.rb +45 -0
  90. data/spec/br_documents/ie/to_spec.rb +100 -0
  91. data/spec/{ie_validator_spec.rb → br_documents/ie_validator_spec.rb} +12 -9
  92. data/spec/br_documents/suframa_spec.rb +73 -0
  93. data/spec/br_documents/suframa_validator_spec.rb +36 -0
  94. data/spec/spec_helper.rb +6 -6
  95. data/spec/support/utilities.rb +2 -2
  96. metadata +177 -99
  97. data/.circleci/config.yml +0 -42
  98. data/spec/cnpj_cpf/cnpj_spec.rb +0 -59
  99. data/spec/cnpj_cpf/cpf_spec.rb +0 -59
  100. data/spec/cnpj_validator_spec.rb +0 -36
  101. data/spec/cpf_validator_spec.rb +0 -36
  102. data/spec/ie/ac_spec.rb +0 -43
  103. data/spec/ie/al_spec.rb +0 -36
  104. data/spec/ie/am_spec.rb +0 -43
  105. data/spec/ie/ap_spec.rb +0 -36
  106. data/spec/ie/ba_spec.rb +0 -69
  107. data/spec/ie/ce_spec.rb +0 -16
  108. data/spec/ie/df_spec.rb +0 -43
  109. data/spec/ie/es_spec.rb +0 -16
  110. data/spec/ie/factory_spec.rb +0 -203
  111. data/spec/ie/go_spec.rb +0 -43
  112. data/spec/ie/ma_spec.rb +0 -16
  113. data/spec/ie/mg_spec.rb +0 -43
  114. data/spec/ie/ms_spec.rb +0 -16
  115. data/spec/ie/mt_spec.rb +0 -44
  116. data/spec/ie/pa_spec.rb +0 -43
  117. data/spec/ie/pb_spec.rb +0 -16
  118. data/spec/ie/pe_spec.rb +0 -62
  119. data/spec/ie/pi_spec.rb +0 -16
  120. data/spec/ie/pr_spec.rb +0 -36
  121. data/spec/ie/rj_spec.rb +0 -43
  122. data/spec/ie/rn_spec.rb +0 -62
  123. data/spec/ie/ro_spec.rb +0 -62
  124. data/spec/ie/rr_spec.rb +0 -43
  125. data/spec/ie/rs_spec.rb +0 -41
  126. data/spec/ie/sc_spec.rb +0 -43
  127. data/spec/ie/se_spec.rb +0 -16
  128. data/spec/ie/shared_examples_for_pattern1.rb +0 -33
  129. data/spec/ie/shared_examples_for_to_remove_all_masks.rb +0 -17
  130. data/spec/ie/sp_spec.rb +0 -45
  131. data/spec/ie/to_spec.rb +0 -100
@@ -1,17 +1,18 @@
1
- require_relative "base"
2
- require_relative "../commons/mod14"
1
+ require_relative 'base'
2
+ require_relative '../commons/mod14'
3
3
 
4
4
  module BrDocuments
5
5
  module IE
6
6
  class RO < Base
7
7
  include Commons::Mod14
8
8
 
9
- private
9
+ protected
10
+
10
11
  def format_ie(number)
11
- if number.gsub(/(\.)|(\-)/, "").length == 9
12
- number.sub(/(\d{3})(\d{5})(\d{1})/, "\\1.\\2-\\3")
12
+ if number.gsub(/(\.)|(\-)/, '').length == 9
13
+ number.sub(/(\d{3})(\d{5})(\d{1})/, '\\1.\\2-\\3')
13
14
  else
14
- number.sub(/(\d{13})(\d{1})/, "\\1-\\2")
15
+ number.sub(/(\d{13})(\d{1})/, '\\1-\\2')
15
16
  end
16
17
  end
17
18
 
@@ -19,6 +20,12 @@ module BrDocuments
19
20
  valid_old_format or valid_new_format
20
21
  end
21
22
 
23
+ def valid_check_digit?
24
+ valid_old_digital_check or valid_new_digital_check
25
+ end
26
+
27
+ private
28
+
22
29
  def valid_old_format
23
30
  regex = /^(\d{3}\.\d{5}\-\d{1})$|^(\d{9})$/
24
31
  regex.match(@number).present?
@@ -29,24 +36,20 @@ module BrDocuments
29
36
  regex.match(@number).present?
30
37
  end
31
38
 
32
- def valid_digital_check?
33
- valid_old_digital_check or valid_new_digital_check
34
- end
35
-
36
39
  def valid_old_digital_check
37
40
  weight = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
38
41
  remove_mask!
39
- @number[-1].eql? generate_digital_check(@number[-6, 6], weight).to_s
42
+ @number[-1] == generate_check_digit(@number[-6, 6], weight).to_s
40
43
  end
41
44
 
42
45
  def valid_new_digital_check
43
46
  weight = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
44
47
  remove_mask!
45
- @number[-1].eql? generate_digital_check(@number, weight).to_s
48
+ @number[-1] == generate_check_digit(@number, weight).to_s
46
49
  end
47
50
 
48
51
  def remove_mask!
49
- @number.gsub!(/[\.\/-]/, "")
52
+ @number.gsub!(/[\.\/-]/, '')
50
53
  end
51
54
  end
52
55
  end
@@ -1,4 +1,4 @@
1
- require_relative "pattern1"
1
+ require_relative 'pattern1'
2
2
 
3
3
  module BrDocuments
4
4
  module IE
@@ -10,11 +10,12 @@ module BrDocuments
10
10
  end
11
11
 
12
12
  private
13
+
13
14
  def format_ie(number)
14
- number.sub(/(\d{8})(\d{1})/, "\\1-\\2")
15
+ number.sub(/(\d{8})(\d{1})/, '\\1-\\2')
15
16
  end
16
17
 
17
- def generate_digital_check(values, weights)
18
+ def generate_check_digit(values, weights)
18
19
  sum = reduce_weights(values, weights)
19
20
  sum % 9
20
21
  end
@@ -1,4 +1,4 @@
1
- require_relative "pattern1"
1
+ require_relative 'pattern1'
2
2
 
3
3
  module BrDocuments
4
4
  module IE
@@ -10,8 +10,9 @@ module BrDocuments
10
10
  end
11
11
 
12
12
  private
13
+
13
14
  def format_ie(number)
14
- number.sub(/(\d{3})(\d{7})/, "\\1/\\2")
15
+ number.sub(/(\d{3})(\d{7})/, '\\1/\\2')
15
16
  end
16
17
  end
17
18
  end
@@ -1,4 +1,4 @@
1
- require_relative "pattern1"
1
+ require_relative 'pattern1'
2
2
 
3
3
  module BrDocuments
4
4
  module IE
@@ -9,8 +9,9 @@ module BrDocuments
9
9
  end
10
10
 
11
11
  private
12
+
12
13
  def format_ie(number)
13
- number.sub(/(\d{3})(\d{3})(\d{3})/, "\\1.\\2.\\3")
14
+ number.sub(/(\d{3})(\d{3})(\d{3})/, '\\1.\\2.\\3')
14
15
  end
15
16
  end
16
17
  end
@@ -1,11 +1,12 @@
1
- require_relative "pattern1"
1
+ require_relative 'pattern1'
2
2
 
3
3
  module BrDocuments
4
4
  module IE
5
5
  class SE < Pattern1
6
6
  private
7
+
7
8
  def format_ie(number)
8
- number.sub(/(\d{8})(\d{1})/, "\\1-\\2")
9
+ number.sub(/(\d{8})(\d{1})/, '\\1-\\2')
9
10
  end
10
11
  end
11
12
  end
@@ -1,17 +1,18 @@
1
- require_relative "base"
2
- require_relative "../commons/mod11"
1
+ require_relative 'base'
2
+ require_relative '../commons/mod11'
3
3
 
4
4
  module BrDocuments
5
5
  module IE
6
6
  class SP < Base
7
7
  include Commons::Mod11
8
8
 
9
- private
9
+ protected
10
+
10
11
  def format_ie(number)
11
- if number.gsub(/(\-)|(\.)|(\/)/, "").length == 13
12
- number.sub(/(\w{1})(\d{8})(\d{1})(\d{3})/, "\\1-\\2.\\3/\\4")
12
+ if number.gsub(/(\-)|(\.)|(\/)/, '').length == 13
13
+ number.sub(/(\w{1})(\d{8})(\d{1})(\d{3})/, '\\1-\\2.\\3/\\4')
13
14
  else
14
- number.sub(/(\d{3})(\d{3})(\d{3})(\d{3})/, "\\1.\\2.\\3.\\4")
15
+ number.sub(/(\d{3})(\d{3})(\d{3})(\d{3})/, '\\1.\\2.\\3.\\4')
15
16
  end
16
17
  end
17
18
 
@@ -20,33 +21,35 @@ module BrDocuments
20
21
  regex.match(@number).present?
21
22
  end
22
23
 
23
- def valid_digital_check?
24
- if @number[0].eql? "P"
24
+ def valid_check_digit?
25
+ if @number[0] == 'P'
25
26
  valid_rural_producer_digital_check?
26
27
  else
27
28
  valid_standard_digital_check?
28
29
  end
29
30
  end
30
31
 
32
+ private
33
+
31
34
  def valid_standard_digital_check?
32
- @number.gsub!(/[\.\/P-]/, "")
35
+ @number.gsub!(/[\.\/P-]/, '')
33
36
 
34
37
  weight1 = [1, 3, 4, 5, 6, 7, 8, 10]
35
38
  weight2 = [3, 2, 10, 9, 8, 7, 6, 5, 4, 3, 2]
36
39
 
37
- dc1 = generate_digital_check(weight1)
38
- dc2 = generate_digital_check(weight2)
40
+ dc1 = generate_check_digit(weight1)
41
+ dc2 = generate_check_digit(weight2)
39
42
 
40
43
  (@number[8] == dc1) and (@number[11] == dc2)
41
44
  end
42
45
 
43
46
  def valid_rural_producer_digital_check?
44
- @number.gsub!(/[\.\/P-]/, "")
47
+ @number.gsub!(/[\.\/P-]/, '')
45
48
  weight9 = [1, 3, 4, 5, 6, 7, 8, 10]
46
- @number[8] == generate_digital_check(weight9)
49
+ @number[8] == generate_check_digit(weight9)
47
50
  end
48
51
 
49
- def generate_digital_check(weights)
52
+ def generate_check_digit(weights)
50
53
  sum = reduce_weights(@number, weights)
51
54
  mod = sum % 11
52
55
  mod.to_s[-1]
@@ -1,11 +1,11 @@
1
- require_relative "pattern1"
1
+ require_relative 'pattern1'
2
2
 
3
3
  module BrDocuments
4
4
  module IE
5
5
  class TO < Pattern1
6
6
  def initialize(number)
7
7
  super
8
- if number.gsub(/(\.)|(\-)/, "").length == 9
8
+ if number.gsub(/(\.)|(\-)/, '').length == 9
9
9
  @mask = /^(\d{2}\.\d{6}\-\d{1})$|^(\d{9})$/
10
10
  @weight = [9, 8, 7, 6, 5, 4, 3, 2]
11
11
  else
@@ -15,11 +15,12 @@ module BrDocuments
15
15
  end
16
16
 
17
17
  private
18
+
18
19
  def format_ie(number)
19
- if number.gsub(/(\.)|(\-)/, "").length == 9
20
- number.sub(/(\d{2})(\d{6})(\d{1})/, "\\1.\\2-\\3")
20
+ if number.gsub(/(\.)|(\-)/, '').length == 9
21
+ number.sub(/(\d{2})(\d{6})(\d{1})/, '\\1.\\2-\\3')
21
22
  else
22
- number.sub(/(\d{2})(\d{2})(\d{6})(\d{1})/, "\\1.\\2.\\3-\\4")
23
+ number.sub(/(\d{2})(\d{2})(\d{6})(\d{1})/, '\\1.\\2.\\3-\\4')
23
24
  end
24
25
  end
25
26
  end
@@ -7,13 +7,13 @@ class IeValidator < ActiveModel::EachValidator
7
7
  end
8
8
 
9
9
  private
10
+
10
11
  def ie_present?(value)
11
12
  value.present?
12
13
  end
13
14
 
14
15
  def attribute_uf_was_configured_at_validator?(record)
15
- record.errors.add(:base,
16
- I18n.t("validator.ie.uf.no_configured")) unless options[:uf].present?
16
+ record.errors.add(:base, I18n.t('validator.ie.uf.no_configured')) if options[:uf].blank?
17
17
 
18
18
  options[:uf].present?
19
19
  end
@@ -22,8 +22,8 @@ class IeValidator < ActiveModel::EachValidator
22
22
  begin
23
23
  uf = read_uf(record)
24
24
  rescue NoMethodError
25
- record.errors.add(:base, I18n.t("validator.ie.uf.no_present",
26
- uf: options[:uf])
25
+ record.errors.add(
26
+ :base, I18n.t('validator.ie.uf.no_present', uf: options[:uf])
27
27
  )
28
28
  end
29
29
 
@@ -33,8 +33,8 @@ class IeValidator < ActiveModel::EachValidator
33
33
  def ie_valid?(record, attribute, value)
34
34
  begin
35
35
  record.errors.add(attribute, :invalid) unless number_valid?(record, value)
36
- rescue ArgumentError => ex
37
- record.errors.add(attribute, ex.message)
36
+ rescue ArgumentError => e
37
+ record.errors.add(attribute, e.message)
38
38
  end
39
39
  record.errors.messages.empty?
40
40
  end
@@ -47,7 +47,7 @@ class IeValidator < ActiveModel::EachValidator
47
47
 
48
48
  def read_uf(record)
49
49
  attribute = record
50
- options[:uf].split("#").each do | field |
50
+ options[:uf].split('#').each do |field|
51
51
  attribute = attribute.send(field)
52
52
  end
53
53
  attribute
@@ -0,0 +1,46 @@
1
+ require_relative './commons/mod11'
2
+
3
+ module BrDocuments
4
+ class Suframa
5
+ include BrDocuments::Commons::Mod11
6
+
7
+ def initialize(number)
8
+ @number = number
9
+ end
10
+
11
+ def formatted
12
+ valid? ? format_number : ''
13
+ end
14
+
15
+ def valid?
16
+ valid_pattern? &&
17
+ !sequence_of_equal_numbers? &&
18
+ valid_check_digit?
19
+ end
20
+
21
+ private
22
+
23
+ def valid_pattern?
24
+ /^(\d{2}\.\d{4}\.\d{3})$|^(\d{9})$/.match(@number).present?
25
+ end
26
+
27
+ def sequence_of_equal_numbers?
28
+ number_without_mask.chars.uniq.length == 1
29
+ end
30
+
31
+ def number_without_mask
32
+ @number_without_mask ||= @number.delete('.')
33
+ end
34
+
35
+ def valid_check_digit?
36
+ weights = [9, 8, 7, 6, 5, 4, 3, 2]
37
+
38
+ check_digit = generate_check_digit(number_without_mask, weights)
39
+ number_without_mask[8] == check_digit.to_s
40
+ end
41
+
42
+ def format_number
43
+ @number.sub(/(\d{2})(\d{4})(\d{3})/, '\\1.\\2.\\3')
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,8 @@
1
+ class SuframaValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ return if value.blank?
4
+
5
+ suframa = BrDocuments::Suframa.new(value)
6
+ record.errors.add(attribute, :invalid) unless suframa.valid?
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module BrDocuments
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.2'.freeze
3
3
  end
data/lib/br_documents.rb CHANGED
@@ -1,5 +1,5 @@
1
- require "active_model"
1
+ require 'active_model'
2
2
 
3
- Dir[File.dirname(__FILE__) + "/**/*.rb"].each { |f| require f }
3
+ Dir["#{File.dirname(__FILE__)}/**/*.rb"].sort.each { |f| require f }
4
4
 
5
- I18n.load_path << File.expand_path("../../config/locales/pt-BR.yml", __FILE__)
5
+ I18n.load_path << File.expand_path('../config/locales/pt-BR.yml', __dir__)
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDocuments::CnpjCpf::Cnpj do
4
+ describe '#formatted' do
5
+ it 'returns a formatted number' do
6
+ cnpj = described_class.new('04001155000101')
7
+ expect(cnpj.formatted).to eq '04.001.155/0001-01'
8
+ end
9
+
10
+ context 'when is invalid' do
11
+ it 'returns an empty string' do
12
+ cnpj = described_class.new('123')
13
+ expect(cnpj.formatted).to eq ''
14
+ end
15
+ end
16
+ end
17
+
18
+ it 'is invalid with malformed number' do
19
+ ['242.2818/50001-54', '35.611.011/000192'].each do |number|
20
+ cnpj = described_class.new(number)
21
+ expect(cnpj).not_to be_valid
22
+ end
23
+ end
24
+
25
+ it 'is invalid with a number longer than 14' do
26
+ ['24.228.185/0001-544', '936710360001881'].each do |number|
27
+ cnpj = described_class.new(number)
28
+ expect(cnpj).not_to be_valid
29
+ end
30
+ end
31
+
32
+ it 'is invalid with a number shorter than 14' do
33
+ ['24.228.185/0001-5', '9367103600018'].each do |number|
34
+ cnpj = described_class.new(number)
35
+ expect(cnpj).not_to be_valid
36
+ end
37
+ end
38
+
39
+ it 'is invalid with a sequence of the same number' do
40
+ ['11.111.111/1111-11', '22222222222222'].each do |number|
41
+ cnpj = described_class.new(number)
42
+ expect(cnpj).not_to be_valid
43
+ end
44
+ end
45
+
46
+ it 'is invalid with invalid check number' do
47
+ ['04.001.155/0001-03', '85961757000101'].each do |number|
48
+ cnpj = described_class.new(number)
49
+ expect(cnpj).not_to be_valid
50
+ end
51
+ end
52
+
53
+ it 'is valid with correct number' do
54
+ ['04.001.155/0001-01', '85961757000102'].each do |number|
55
+ cnpj = described_class.new(number)
56
+ expect(cnpj).to be_valid
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrDocuments::CnpjCpf::Cpf do
4
+ describe '#formatted' do
5
+ it 'returns a formatted number' do
6
+ cpf = described_class.new('11144477735')
7
+ expect(cpf.formatted).to eq '111.444.777-35'
8
+ end
9
+
10
+ context 'when is invalid' do
11
+ it 'returns an empty string' do
12
+ cpf = described_class.new('123')
13
+ expect(cpf.formatted).to eq ''
14
+ end
15
+ end
16
+ end
17
+
18
+ it 'is invalid with malformed number' do
19
+ ['111.126.491.07', '482.261.15-663', '111444.777-35'].each do |number|
20
+ cpf = described_class.new(number)
21
+ expect(cpf).not_to be_valid
22
+ end
23
+ end
24
+
25
+ it 'is invalid with a number longer than 11' do
26
+ ['045.769.421-150', '308514217766'].each do |number|
27
+ cpf = described_class.new(number)
28
+ expect(cpf).not_to be_valid
29
+ end
30
+ end
31
+
32
+ it 'is invalid with a number shorter than 11' do
33
+ ['111.444.777-3', '1234567890'].each do |number|
34
+ cpf = described_class.new(number)
35
+ expect(cpf).not_to be_valid
36
+ end
37
+ end
38
+
39
+ it 'is invalid with a sequence of the same number' do
40
+ ['111.111.111-11', '22222222222'].each do |number|
41
+ cpf = described_class.new(number)
42
+ expect(cpf).not_to be_valid
43
+ end
44
+ end
45
+
46
+ it 'is invalid with invalid check number' do
47
+ ['111.111.111-22', '2222222233'].each do |number|
48
+ cpf = described_class.new(number)
49
+ expect(cpf).not_to be_valid
50
+ end
51
+ end
52
+
53
+ it 'is valid with correct number' do
54
+ ['111.444.777-35', '01233254120'].each do |number|
55
+ cpf = described_class.new(number)
56
+ expect(cpf).to be_valid
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe CnpjValidator do
4
+ subject { described_class.new(attributes: 'cnpj') }
5
+
6
+ let(:mock) { instance_double('model') }
7
+
8
+ before do
9
+ allow(mock).to receive(:errors).and_return([])
10
+ allow(mock.errors).to receive(:messages).and_return({})
11
+ allow(mock.errors).to receive(:add) do |attribute, error|
12
+ mock.errors.messages[attribute] = [error]
13
+ end
14
+ end
15
+
16
+ context 'when Cnpj is valid' do
17
+ it "doesn't add errors in model" do
18
+ subject.validate_each(mock, 'cnpj', '85961757000102')
19
+ expect(mock.errors.messages).to be_empty
20
+ end
21
+ end
22
+
23
+ context 'when Cnpj is blank' do
24
+ it "doesn't add errors in model" do
25
+ subject.validate_each(mock, 'cnpj', '')
26
+ expect(mock.errors.messages).to be_empty
27
+ end
28
+ end
29
+
30
+ context 'when Cnpj is invalid' do
31
+ it 'adds errors in model' do
32
+ subject.validate_each(mock, 'cnpj', '85961757000103')
33
+ expect(mock.errors.messages).not_to be_empty
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe CpfValidator do
4
+ subject { described_class.new(attributes: 'cpf') }
5
+
6
+ let(:mock) { instance_double('model') }
7
+
8
+ before do
9
+ allow(mock).to receive(:errors).and_return([])
10
+ allow(mock.errors).to receive(:messages).and_return({})
11
+ allow(mock.errors).to receive(:add) do |attribute, error|
12
+ mock.errors.messages[attribute] = [error]
13
+ end
14
+ end
15
+
16
+ context 'when Cpf is valid' do
17
+ it "doesn't add errors in model" do
18
+ subject.validate_each(mock, 'cpf', '01233254120')
19
+ expect(mock.errors.messages).to be_empty
20
+ end
21
+ end
22
+
23
+ context 'when Cpf is blank' do
24
+ it "doesn't add errors in model" do
25
+ subject.validate_each(mock, 'cpf', '')
26
+ expect(mock.errors.messages).to be_empty
27
+ end
28
+ end
29
+
30
+ context 'when Cpf is invalid' do
31
+ it 'adds errors in model' do
32
+ subject.validate_each(mock, 'cpf', '01233254121')
33
+ expect(mock.errors.messages).not_to be_empty
34
+ end
35
+ end
36
+ end
@@ -1,7 +1,7 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe BrDocuments::Gtin do
4
- describe "#valid?" do
4
+ describe '#valid?' do
5
5
  context 'when the checksum is valid' do
6
6
  context 'when the GTIN has 8 digits' do
7
7
  subject { described_class.new('12345618') }
@@ -36,14 +36,14 @@ describe BrDocuments::Gtin do
36
36
  context 'when the number of digits is different of 8, 13 or 14' do
37
37
  subject { described_class.new('12345678901234560') }
38
38
 
39
- it { is_expected.to_not be_valid }
39
+ it { is_expected.not_to be_valid }
40
40
  end
41
41
  end
42
42
 
43
43
  context 'when the checksum is invald' do
44
44
  subject { described_class.new('1145678548712') }
45
45
 
46
- it { is_expected.to_not be_valid }
46
+ it { is_expected.not_to be_valid }
47
47
  end
48
48
  end
49
49
  end
@@ -1,46 +1,46 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe GtinValidator do
4
- let(:record) { double("model") }
4
+ subject { described_class.new(attributes: 'gtin') }
5
+
6
+ let(:record) { instance_double('model') }
5
7
 
6
8
  before do
7
9
  allow(record).to receive(:errors).and_return([])
8
10
  allow(record.errors).to receive(:messages).and_return({})
9
- allow(record.errors).to receive(:add) do | attribute, error |
11
+ allow(record.errors).to receive(:add) do |attribute, error|
10
12
  record.errors.messages[attribute] = [error]
11
13
  end
12
14
  end
13
15
 
14
- subject { GtinValidator.new(attributes: "gtin") }
15
-
16
- context "when GTIN code is valid" do
17
- before { subject.validate_each(record, "gtin", "1243658721548") }
16
+ context 'when GTIN code is valid' do
17
+ before { subject.validate_each(record, 'gtin', '1243658721548') }
18
18
 
19
19
  it "doesn't add errors in model" do
20
20
  expect(record.errors.messages).to be_empty
21
21
  end
22
22
  end
23
23
 
24
- context "when GTIN is blank" do
25
- before { subject.validate_each(record, "gtin", "") }
24
+ context 'when GTIN is blank' do
25
+ before { subject.validate_each(record, 'gtin', '') }
26
26
 
27
27
  it "doesn't add errors in model" do
28
28
  expect(record.errors.messages).to be_empty
29
29
  end
30
30
  end
31
31
 
32
- context "when GTIN is nil" do
33
- before { subject.validate_each(record, "gtin", nil) }
32
+ context 'when GTIN is nil' do
33
+ before { subject.validate_each(record, 'gtin', nil) }
34
34
 
35
35
  it "doesn't add errors in model" do
36
36
  expect(record.errors.messages).to be_empty
37
37
  end
38
38
  end
39
39
 
40
- context "when GTIN is invalid" do
41
- before { subject.validate_each(record, "gtin", "253667853") }
40
+ context 'when GTIN is invalid' do
41
+ before { subject.validate_each(record, 'gtin', '253667853') }
42
42
 
43
- it "adds errors in model" do
43
+ it 'adds errors in model' do
44
44
  expect(record.errors.messages).to include 'gtin' => [:invalid]
45
45
  end
46
46
  end