br_documents 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/config.yml +54 -0
  3. data/.rubocop.yml +65 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +76 -42
  6. data/README.md +33 -0
  7. data/Rakefile +3 -3
  8. data/br_documents.gemspec +23 -19
  9. data/lib/br_documents.rb +3 -3
  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 +1 -1
  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/suframa.rb +60 -0
  52. data/lib/br_documents/suframa_validator.rb +8 -0
  53. data/lib/br_documents/version.rb +1 -1
  54. data/spec/cnpj_cpf/cnpj_spec.rb +21 -21
  55. data/spec/cnpj_cpf/cpf_spec.rb +21 -21
  56. data/spec/cnpj_validator_spec.rb +12 -12
  57. data/spec/cpf_validator_spec.rb +12 -12
  58. data/spec/gtin/gtin_spec.rb +2 -2
  59. data/spec/gtin_validator_spec.rb +13 -13
  60. data/spec/ie/ac_spec.rb +16 -16
  61. data/spec/ie/al_spec.rb +14 -14
  62. data/spec/ie/am_spec.rb +16 -16
  63. data/spec/ie/ap_spec.rb +14 -14
  64. data/spec/ie/ba_spec.rb +28 -28
  65. data/spec/ie/ce_spec.rb +9 -9
  66. data/spec/ie/df_spec.rb +16 -16
  67. data/spec/ie/es_spec.rb +9 -9
  68. data/spec/ie/factory_spec.rb +88 -89
  69. data/spec/ie/go_spec.rb +16 -16
  70. data/spec/ie/ma_spec.rb +9 -9
  71. data/spec/ie/mg_spec.rb +16 -16
  72. data/spec/ie/ms_spec.rb +9 -9
  73. data/spec/ie/mt_spec.rb +17 -17
  74. data/spec/ie/pa_spec.rb +16 -16
  75. data/spec/ie/pb_spec.rb +9 -9
  76. data/spec/ie/pe_spec.rb +27 -27
  77. data/spec/ie/pi_spec.rb +9 -9
  78. data/spec/ie/pr_spec.rb +14 -14
  79. data/spec/ie/rj_spec.rb +16 -16
  80. data/spec/ie/rn_spec.rb +27 -27
  81. data/spec/ie/ro_spec.rb +27 -27
  82. data/spec/ie/rr_spec.rb +16 -16
  83. data/spec/ie/rs_spec.rb +16 -16
  84. data/spec/ie/sc_spec.rb +16 -16
  85. data/spec/ie/se_spec.rb +9 -9
  86. data/spec/ie/shared_examples_for_pattern1.rb +11 -11
  87. data/spec/ie/shared_examples_for_to_remove_all_masks.rb +7 -8
  88. data/spec/ie/sp_spec.rb +19 -19
  89. data/spec/ie/to_spec.rb +35 -35
  90. data/spec/ie_validator_spec.rb +7 -5
  91. data/spec/spec_helper.rb +6 -6
  92. data/spec/suframa/suframa_spec.rb +109 -0
  93. data/spec/suframa_validator_spec.rb +36 -0
  94. data/spec/support/utilities.rb +2 -2
  95. metadata +86 -23
  96. data/.circleci/config.yml +0 -42
@@ -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')) unless options[:uf].present?
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,60 @@
1
+ require_relative '../commons/mod11'
2
+
3
+ # rubocop:disable Style/ClassAndModuleChildren
4
+ class BrDocuments::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
+ valid_activity_sector? &&
20
+ valid_administrative_unit?
21
+ end
22
+
23
+ private
24
+
25
+ def valid_pattern?
26
+ /^(\d{2}\.\d{4}\.\d{3})$|^(\d{9})$/.match(@number).present?
27
+ end
28
+
29
+ def sequence_of_equal_numbers?
30
+ number_without_mask.split('').uniq.length == 1
31
+ end
32
+
33
+ def number_without_mask
34
+ @number_without_mask ||= @number.gsub('.', '')
35
+ end
36
+
37
+ def valid_check_digit?
38
+ weights = [9, 8, 7, 6, 5, 4, 3, 2]
39
+
40
+ check_digit = generate_check_digit(number_without_mask, weights)
41
+ number_without_mask[8] == check_digit.to_s
42
+ end
43
+
44
+ def valid_activity_sector?
45
+ activity_sector = number_without_mask[0] + number_without_mask[1]
46
+
47
+ ['01', '02', '10', '11', '20', '60'].include?(activity_sector)
48
+ end
49
+
50
+ def valid_administrative_unit?
51
+ administrative_unit = number_without_mask[6] + number_without_mask[7]
52
+
53
+ ['01', '10', '30'].include?(administrative_unit)
54
+ end
55
+
56
+ def format_number
57
+ @number.sub(/(\d{2})(\d{4})(\d{3})/, '\\1.\\2.\\3')
58
+ end
59
+ end
60
+ # rubocop:enable Style/ClassAndModuleChildren
@@ -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.0'.freeze
3
3
  end
@@ -1,57 +1,57 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe BrDocuments::CnpjCpf::Cnpj do
4
- describe "#formatted" do
5
- it "returns a formatted number" do
6
- cnpj = BrDocuments::CnpjCpf::Cnpj.new("04001155000101")
7
- expect(cnpj.formatted).to eq "04.001.155/0001-01"
4
+ describe '#formatted' do
5
+ it 'returns a formatted number' do
6
+ cnpj = BrDocuments::CnpjCpf::Cnpj.new('04001155000101')
7
+ expect(cnpj.formatted).to eq '04.001.155/0001-01'
8
8
  end
9
9
 
10
- context "when is invalid" do
11
- it "returns an empty string" do
12
- cnpj = BrDocuments::CnpjCpf::Cnpj.new("123")
13
- expect(cnpj.formatted).to eq ""
10
+ context 'when is invalid' do
11
+ it 'returns an empty string' do
12
+ cnpj = BrDocuments::CnpjCpf::Cnpj.new('123')
13
+ expect(cnpj.formatted).to eq ''
14
14
  end
15
15
  end
16
16
  end
17
17
 
18
- it "is invalid with malformed number" do
19
- ["242.2818/50001-54", "35.611.011/000192"].each do |number|
18
+ it 'is invalid with malformed number' do
19
+ ['242.2818/50001-54', '35.611.011/000192'].each do |number|
20
20
  cnpj = BrDocuments::CnpjCpf::Cnpj.new(number)
21
21
  expect(cnpj).to_not be_valid
22
22
  end
23
23
  end
24
24
 
25
- it "is invalid with a number longer than 14" do
26
- ["24.228.185/0001-544", "936710360001881"].each do |number|
25
+ it 'is invalid with a number longer than 14' do
26
+ ['24.228.185/0001-544', '936710360001881'].each do |number|
27
27
  cnpj = BrDocuments::CnpjCpf::Cnpj.new(number)
28
28
  expect(cnpj).to_not be_valid
29
29
  end
30
30
  end
31
31
 
32
- it "is invalid with a number shorter than 14" do
33
- ["24.228.185/0001-5", "9367103600018"].each do |number|
32
+ it 'is invalid with a number shorter than 14' do
33
+ ['24.228.185/0001-5', '9367103600018'].each do |number|
34
34
  cnpj = BrDocuments::CnpjCpf::Cnpj.new(number)
35
35
  expect(cnpj).to_not be_valid
36
36
  end
37
37
  end
38
38
 
39
- it "is invalid with a sequence of the same number" do
40
- ["11.111.111/1111-11", "22222222222222"].each do |number|
39
+ it 'is invalid with a sequence of the same number' do
40
+ ['11.111.111/1111-11', '22222222222222'].each do |number|
41
41
  cnpj = BrDocuments::CnpjCpf::Cnpj.new(number)
42
42
  expect(cnpj).to_not be_valid
43
43
  end
44
44
  end
45
45
 
46
- it "is invalid with invalid check number" do
47
- ["04.001.155/0001-03", "85961757000101"].each do |number|
46
+ it 'is invalid with invalid check number' do
47
+ ['04.001.155/0001-03', '85961757000101'].each do |number|
48
48
  cnpj = BrDocuments::CnpjCpf::Cnpj.new(number)
49
49
  expect(cnpj).to_not be_valid
50
50
  end
51
51
  end
52
52
 
53
- it "is valid with correct number" do
54
- ["04.001.155/0001-01", "85961757000102"].each do |number|
53
+ it 'is valid with correct number' do
54
+ ['04.001.155/0001-01', '85961757000102'].each do |number|
55
55
  cnpj = BrDocuments::CnpjCpf::Cnpj.new(number)
56
56
  expect(cnpj).to be_valid
57
57
  end
@@ -1,57 +1,57 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe BrDocuments::CnpjCpf::Cpf do
4
- describe "#formatted" do
5
- it "returns a formatted number" do
6
- cpf = BrDocuments::CnpjCpf::Cpf.new("11144477735")
7
- expect(cpf.formatted).to eq "111.444.777-35"
4
+ describe '#formatted' do
5
+ it 'returns a formatted number' do
6
+ cpf = BrDocuments::CnpjCpf::Cpf.new('11144477735')
7
+ expect(cpf.formatted).to eq '111.444.777-35'
8
8
  end
9
9
 
10
- context "when is invalid" do
11
- it "returns an empty string" do
12
- cpf = BrDocuments::CnpjCpf::Cpf.new("123")
13
- expect(cpf.formatted).to eq ""
10
+ context 'when is invalid' do
11
+ it 'returns an empty string' do
12
+ cpf = BrDocuments::CnpjCpf::Cpf.new('123')
13
+ expect(cpf.formatted).to eq ''
14
14
  end
15
15
  end
16
16
  end
17
17
 
18
- it "is invalid with malformed number" do
19
- ["111.126.491.07", "482.261.15-663", "111444.777-35"].each do |number|
18
+ it 'is invalid with malformed number' do
19
+ ['111.126.491.07', '482.261.15-663', '111444.777-35'].each do |number|
20
20
  cpf = BrDocuments::CnpjCpf::Cpf.new(number)
21
21
  expect(cpf).to_not be_valid
22
22
  end
23
23
  end
24
24
 
25
- it "is invalid with a number longer than 11" do
26
- ["045.769.421-150", "308514217766"].each do |number|
25
+ it 'is invalid with a number longer than 11' do
26
+ ['045.769.421-150', '308514217766'].each do |number|
27
27
  cpf = BrDocuments::CnpjCpf::Cpf.new(number)
28
28
  expect(cpf).to_not be_valid
29
29
  end
30
30
  end
31
31
 
32
- it "is invalid with a number shorter than 11" do
33
- ["111.444.777-3", "1234567890"].each do |number|
32
+ it 'is invalid with a number shorter than 11' do
33
+ ['111.444.777-3', '1234567890'].each do |number|
34
34
  cpf = BrDocuments::CnpjCpf::Cpf.new(number)
35
35
  expect(cpf).to_not be_valid
36
36
  end
37
37
  end
38
38
 
39
- it "is invalid with a sequence of the same number" do
40
- ["111.111.111-11", "22222222222"].each do |number|
39
+ it 'is invalid with a sequence of the same number' do
40
+ ['111.111.111-11', '22222222222'].each do |number|
41
41
  cpf = BrDocuments::CnpjCpf::Cpf.new(number)
42
42
  expect(cpf).to_not be_valid
43
43
  end
44
44
  end
45
45
 
46
- it "is invalid with invalid check number" do
47
- ["111.111.111-22", "2222222233"].each do |number|
46
+ it 'is invalid with invalid check number' do
47
+ ['111.111.111-22', '2222222233'].each do |number|
48
48
  cpf = BrDocuments::CnpjCpf::Cpf.new(number)
49
49
  expect(cpf).to_not be_valid
50
50
  end
51
51
  end
52
52
 
53
- it "is valid with correct number" do
54
- ["111.444.777-35", "01233254120"].each do |number|
53
+ it 'is valid with correct number' do
54
+ ['111.444.777-35', '01233254120'].each do |number|
55
55
  cpf = BrDocuments::CnpjCpf::Cpf.new(number)
56
56
  expect(cpf).to be_valid
57
57
  end
@@ -1,35 +1,35 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe CnpjValidator do
4
4
  before(:each) do
5
- @validator = CnpjValidator.new(attributes: "cnpj")
6
- @mock = double("model")
5
+ @validator = CnpjValidator.new(attributes: 'cnpj')
6
+ @mock = double('model')
7
7
  allow(@mock).to receive(:errors).and_return([])
8
8
  allow(@mock.errors).to receive(:messages).and_return({})
9
- allow(@mock.errors).to receive(:add) do | attribute, error |
10
- @mock.errors.messages[attribute] = [error]
9
+ allow(@mock.errors).to receive(:add) do |attribute, error|
10
+ @mock.errors.messages[attribute] = [error]
11
11
  end
12
12
  end
13
13
 
14
14
  subject { @validator }
15
15
 
16
- context "when Cnpj is valid" do
16
+ context 'when Cnpj is valid' do
17
17
  it "doesn't add errors in model" do
18
- subject.validate_each(@mock, "cnpj", "85961757000102")
18
+ subject.validate_each(@mock, 'cnpj', '85961757000102')
19
19
  expect(@mock.errors.messages).to be_empty
20
20
  end
21
21
  end
22
22
 
23
- context "when Cnpj is blank" do
23
+ context 'when Cnpj is blank' do
24
24
  it "doesn't add errors in model" do
25
- subject.validate_each(@mock, "cnpj", "")
25
+ subject.validate_each(@mock, 'cnpj', '')
26
26
  expect(@mock.errors.messages).to be_empty
27
27
  end
28
28
  end
29
29
 
30
- context "when Cnpj is invalid" do
31
- it "adds errors in model" do
32
- subject.validate_each(@mock, "cnpj", "85961757000103")
30
+ context 'when Cnpj is invalid' do
31
+ it 'adds errors in model' do
32
+ subject.validate_each(@mock, 'cnpj', '85961757000103')
33
33
  expect(@mock.errors.messages).to_not be_empty
34
34
  end
35
35
  end
@@ -1,35 +1,35 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe CpfValidator do
4
4
  before(:each) do
5
- @validator = CpfValidator.new(attributes: "cpf")
6
- @mock = double("model")
5
+ @validator = CpfValidator.new(attributes: 'cpf')
6
+ @mock = double('model')
7
7
  allow(@mock).to receive(:errors).and_return([])
8
8
  allow(@mock.errors).to receive(:messages).and_return({})
9
- allow(@mock.errors).to receive(:add) do | attribute, error |
10
- @mock.errors.messages[attribute] = [error]
9
+ allow(@mock.errors).to receive(:add) do |attribute, error|
10
+ @mock.errors.messages[attribute] = [error]
11
11
  end
12
12
  end
13
13
 
14
14
  subject { @validator }
15
15
 
16
- context "when Cpf is valid" do
16
+ context 'when Cpf is valid' do
17
17
  it "doesn't add errors in model" do
18
- subject.validate_each(@mock, "cpf", "01233254120")
18
+ subject.validate_each(@mock, 'cpf', '01233254120')
19
19
  expect(@mock.errors.messages).to be_empty
20
20
  end
21
21
  end
22
22
 
23
- context "when Cpf is blank" do
23
+ context 'when Cpf is blank' do
24
24
  it "doesn't add errors in model" do
25
- subject.validate_each(@mock, "cpf", "")
25
+ subject.validate_each(@mock, 'cpf', '')
26
26
  expect(@mock.errors.messages).to be_empty
27
27
  end
28
28
  end
29
29
 
30
- context "when Cpf is invalid" do
31
- it "adds errors in model" do
32
- subject.validate_each(@mock, "cpf", "01233254121")
30
+ context 'when Cpf is invalid' do
31
+ it 'adds errors in model' do
32
+ subject.validate_each(@mock, 'cpf', '01233254121')
33
33
  expect(@mock.errors.messages).to_not be_empty
34
34
  end
35
35
  end