br_boleto 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +278 -98
  5. data/br_boleto.gemspec +5 -3
  6. data/lib/br_boleto/active_model_base.rb +1 -1
  7. data/lib/br_boleto/association/have_conta.rb +109 -0
  8. data/lib/br_boleto/association/have_pagador.rb +38 -0
  9. data/lib/br_boleto/association/have_pagamentos.rb +44 -0
  10. data/lib/br_boleto/boleto/base.rb +50 -379
  11. data/lib/br_boleto/boleto/caixa.rb +28 -143
  12. data/lib/br_boleto/boleto/sicoob.rb +24 -144
  13. data/lib/br_boleto/conta/base.rb +288 -0
  14. data/lib/br_boleto/conta/caixa.rb +109 -0
  15. data/lib/br_boleto/conta/sicoob.rb +64 -0
  16. data/lib/br_boleto/helper/default_codes.rb +33 -0
  17. data/lib/br_boleto/helper/format_value.rb +1 -0
  18. data/lib/br_boleto/helper/number.rb +30 -0
  19. data/lib/br_boleto/pagador.rb +82 -0
  20. data/lib/br_boleto/remessa/base.rb +28 -50
  21. data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
  22. data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
  23. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
  24. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
  25. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
  26. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
  27. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
  28. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
  29. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
  30. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
  31. data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
  32. data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
  33. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
  34. data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
  35. data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
  36. data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
  37. data/lib/br_boleto/remessa/lote.rb +1 -23
  38. data/lib/br_boleto/remessa/pagamento.rb +188 -51
  39. data/lib/br_boleto/retorno/base.rb +9 -0
  40. data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
  41. data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
  42. data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
  43. data/lib/br_boleto/retorno/pagamento.rb +12 -6
  44. data/lib/br_boleto/string_methods.rb +8 -2
  45. data/lib/br_boleto/validations.rb +19 -0
  46. data/lib/br_boleto/version.rb +3 -3
  47. data/lib/br_boleto.rb +38 -8
  48. data/lib/config/locales/br-boleto-en.yml +89 -0
  49. data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
  50. data/test/br_boleto/association/have_conta_test.rb +319 -0
  51. data/test/br_boleto/association/have_pagador_test.rb +110 -0
  52. data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
  53. data/test/br_boleto/boleto/base_test.rb +127 -201
  54. data/test/br_boleto/boleto/caixa_test.rb +58 -72
  55. data/test/br_boleto/boleto/sicoob_test.rb +88 -147
  56. data/test/br_boleto/conta/base_test.rb +490 -0
  57. data/test/br_boleto/conta/caixa_test.rb +154 -0
  58. data/test/br_boleto/conta/sicoob_test.rb +144 -0
  59. data/test/br_boleto/helper/number_test.rb +29 -0
  60. data/test/br_boleto/pagador_test.rb +158 -0
  61. data/test/br_boleto/remessa/base_test.rb +37 -62
  62. data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
  63. data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
  64. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
  65. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
  66. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
  67. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
  68. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
  69. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
  70. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
  71. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
  72. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
  73. data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
  74. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
  75. data/test/br_boleto/remessa/lote_test.rb +2 -41
  76. data/test/br_boleto/remessa/pagamento_test.rb +186 -188
  77. data/test/br_boleto/retorno/base_test.rb +0 -1
  78. data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
  79. data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
  80. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
  81. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
  82. data/test/br_boleto/retorno/pagamento_test.rb +6 -6
  83. data/test/factories/boleto/base.rb +9 -7
  84. data/test/factories/boleto/boleto_caixa.rb +2 -9
  85. data/test/factories/boleto/boleto_sicoob.rb +10 -8
  86. data/test/factories/conta/base.rb +10 -0
  87. data/test/factories/conta/caixa.rb +15 -0
  88. data/test/factories/conta/sicoob.rb +16 -0
  89. data/test/factories/pagador.rb +15 -0
  90. data/test/factories/remessa/base.rb +0 -6
  91. data/test/factories/remessa/cnab240/base.rb +0 -10
  92. data/test/factories/remessa/cnab240/caixa.rb +1 -6
  93. data/test/factories/remessa/cnab240/sicoob.rb +1 -10
  94. data/test/factories/remessa/cnab400/base.rb +8 -0
  95. data/test/factories/remessa/cnab400/sicoob.rb +8 -0
  96. data/test/factories/remessa/pagamento.rb +8 -7
  97. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
  98. data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
  99. data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
  100. data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
  101. data/test/inheritance/boleto_test.rb +4 -1
  102. data/test/inheritance/sicoob_test.rb +23 -7
  103. data/test/test_helper.rb +70 -0
  104. metadata +63 -6
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+
3
+ class HavePagamentosTest < BrBoleto::ActiveModelBase
4
+ include BrBoleto::HavePagamentos
5
+ end
6
+
7
+ describe BrBoleto::HavePagamentos do
8
+ subject { HavePagamentosTest.new(pagamentos: [pagamento]) }
9
+ let(:pagamento) { BrBoleto::Remessa::Pagamento.new(nosso_numero: '123', data_vencimento: Date.tomorrow, valor_documento: 100.60) }
10
+
11
+ it "por padrão nao deve validar nada a não ser o nosso_numero, data_vencimento e valor_documento" do
12
+ wont_be_message_error(:base)
13
+ end
14
+
15
+ it "deve haver ao menos 1 pagamento" do
16
+ wont allow_value([]).for(:pagamentos).with_message(:blank)
17
+ end
18
+ it "não deve ser válidose houver algum pagamento inválido" do
19
+ wont allow_value([FactoryGirl.build(:remessa_pagamento, nosso_numero: nil)]).for(:pagamentos)
20
+ end
21
+ it "deve ser válido se passar apenas um pagamento sem Array" do
22
+ pagamento_valido = FactoryGirl.build(:remessa_pagamento)
23
+ must allow_value(pagamento_valido).for(:pagamentos)
24
+ end
25
+ it "se setar apenas 1 pagamento sem array deve retornar um array de 1 posicao" do
26
+ subject.pagamentos = pagamento
27
+ subject.pagamentos.size.must_equal 1
28
+ subject.pagamentos.is_a?(Array).must_equal true
29
+ subject.pagamentos[0].must_equal pagamento
30
+ end
31
+ it "posso setar mais que 1 pagamento" do
32
+ pagamento2 = FactoryGirl.build(:remessa_pagamento)
33
+ subject.pagamentos = [pagamento, pagamento2]
34
+ subject.pagamentos.size.must_equal 2
35
+ subject.pagamentos.is_a?(Array).must_equal true
36
+ subject.pagamentos[0].must_equal pagamento
37
+ subject.pagamentos[1].must_equal pagamento2
38
+ end
39
+
40
+ it "posso incrementar os pagamentos com <<" do
41
+ pagamento2 = FactoryGirl.build(:remessa_pagamento, valor_documento: 0.50)
42
+ subject.pagamentos = pagamento
43
+ subject.pagamentos.size.must_equal 1
44
+ subject.pagamentos << pagamento2
45
+ subject.pagamentos.size.must_equal 2
46
+ subject.pagamentos.is_a?(Array).must_equal true
47
+ subject.pagamentos[0].must_equal pagamento
48
+ subject.pagamentos[1].must_equal pagamento2
49
+ end
50
+
51
+ it "o metodo pagamentos deve considerar apenas objetos'Pagamento" do
52
+ pagamento2 = FactoryGirl.build(:remessa_pagamento, valor_documento: 0.50)
53
+ subject.pagamentos << 'abc'
54
+ subject.pagamentos << pagamento2
55
+ subject.pagamentos << 123
56
+
57
+ subject.pagamentos.size.must_equal 2
58
+ subject.pagamentos.must_include pagamento
59
+ subject.pagamentos.must_include pagamento2
60
+ end
61
+
62
+ context "o valor setado nas validações devem obedecer a classe que inclui a conta. Mesmo que a conta tenha uma validação diferente" do
63
+ before do
64
+ subject.pagamentos = [pagamento]
65
+ pagamento.valid_tipo_impressao_required = true
66
+ pagamento.valid_cod_desconto_length = 6
67
+ pagamento.valid_emissao_boleto_length = 1
68
+ pagamento.valid_distribuicao_boleto_length = 2
69
+ end
70
+
71
+ context "Se os metodos do objeto que tem os pagamentos tiverem valor nos seus metodos deve permanecer esses valores" do
72
+ it '#tipo_impressao' do
73
+ subject.pagamento_valid_tipo_impressao_required = false
74
+ pagamento.tipo_impressao = nil
75
+ wont_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:tipo_impressao)} #{get_message(:blank, {})}")
76
+ end
77
+ it '#cod_desconto' do
78
+ subject.pagamento_valid_cod_desconto_length = 4
79
+ pagamento.cod_desconto = '123'
80
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:cod_desconto)} #{get_message(:custom_length_is, {count: 4})}")
81
+ end
82
+ it '#emissao_boleto' do
83
+ subject.pagamento_valid_emissao_boleto_length = 4
84
+ pagamento.emissao_boleto = '123'
85
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:emissao_boleto)} #{get_message(:custom_length_is, {count: 4})}")
86
+ end
87
+ it '#distribuicao_boleto' do
88
+ subject.pagamento_valid_distribuicao_boleto_length = 4
89
+ pagamento.distribuicao_boleto = '123'
90
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:distribuicao_boleto)} #{get_message(:custom_length_is, {count: 4})}")
91
+ end
92
+ end
93
+
94
+ context "Deve considerar as validações setadas nos pagamentos se não houver os metodos sobrescritos no objeto que tem os pagamentos" do
95
+ it '#tipo_impressao' do
96
+ pagamento.tipo_impressao = nil
97
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:tipo_impressao)} #{get_message(:blank, {})}")
98
+ end
99
+ it '#cod_desconto' do
100
+ pagamento.cod_desconto = '123'
101
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:cod_desconto)} #{get_message(:custom_length_is, {count: 6})}")
102
+ end
103
+ it '#emissao_boleto' do
104
+ pagamento.emissao_boleto = '123'
105
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:emissao_boleto)} #{get_message(:custom_length_is, {count: 1})}")
106
+ end
107
+ it '#distribuicao_boleto' do
108
+ pagamento.distribuicao_boleto = '123'
109
+ must_be_message_error(:pagamentos, "#{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(:distribuicao_boleto)} #{get_message(:custom_length_is, {count: 2})}")
110
+ end
111
+ end
112
+ end
113
+ end
@@ -3,232 +3,130 @@ require 'test_helper'
3
3
  describe BrBoleto::Boleto::Base do
4
4
  subject { FactoryGirl.build(:boleto_base) }
5
5
 
6
- it { must validate_numericality_of(:valor_documento).is_less_than_or_equal_to(99999999.99) }
7
-
8
- describe "model_name" do
9
- it "must return BrBoleto::Boleto::Base" do
10
- BrBoleto::Boleto::Base.model_name.must_equal 'BrBoleto::Boleto::Base'
11
- end
6
+ before do
7
+ subject.stubs(:conta_class).returns(BrBoleto::Conta::Sicoob)
12
8
  end
13
9
 
14
- describe "human_attribute_name" do
15
- it "must respond_to internationalization attribute" do
16
- BrBoleto::Boleto::Base.human_attribute_name(:same_thing).must_equal "Same thing"
17
- end
10
+ it "deve herdar de ActiveModelBase" do
11
+ subject.must_be_kind_of BrBoleto::ActiveModelBase
18
12
  end
19
13
 
20
- describe "to_partial_path" do
21
- it "must return the path from class name" do
22
- subject.to_partial_path.must_equal 'br_boleto/base'
23
- end
14
+ it "deve ter o module HaveConta incluso" do
15
+ subject.class.included_modules.must_include BrBoleto::HaveConta
24
16
  end
25
17
 
26
- describe "to_model" do
27
- it "must returns the same object for comparison purposes" do
28
- subject.to_model.must_equal subject
29
- end
18
+ it "deve ter o module HavePagador incluso" do
19
+ subject.class.included_modules.must_include BrBoleto::HavePagador
30
20
  end
31
21
 
32
- describe "#tipo_cobranca_formatada" do
33
- it "default é nil" do
34
- subject.tipo_cobranca_formatada.must_be_nil
35
- end
36
- end
22
+ describe '#validations' do
23
+ it { must validate_presence_of(:valor_documento) }
24
+ it { must validate_presence_of(:numero_documento) }
25
+ it { must validate_presence_of(:data_vencimento) }
37
26
 
38
- context '#initialize' do
39
- context "when passing a Hash" do
40
- before do
41
- @object = subject.class.new({
42
- numero_documento: '123',
43
- valor_documento: 101.99,
44
- data_vencimento: Date.new(2015, 07, 10),
45
- carteira: '175',
46
- agencia: '98',
47
- conta_corrente: '98701',
48
- cedente: 'Nome da razao social',
49
- sacado: 'Teste',
50
- documento_sacado: '725.275.005-10',
51
- endereco_sacado: 'Rua teste, 23045',
52
- instrucoes1: 'Lembrar de algo 1',
53
- instrucoes2: 'Lembrar de algo 2',
54
- instrucoes3: 'Lembrar de algo 3',
55
- instrucoes4: 'Lembrar de algo 4',
56
- instrucoes5: 'Lembrar de algo 5',
57
- instrucoes6: 'Lembrar de algo 6',
58
- })
27
+ context "tamanho maximo do numero_documento" do
28
+ it "por padrão deve ter o tamanho máximo de 6 digitos" do
29
+ subject.send(:valid_numero_documento_maximum).must_equal 6
30
+ subject.numero_documento = '1234567'
31
+ must_be_message_error(:numero_documento, :custom_length_maximum, {count: 6})
59
32
  end
60
- it{ @object.numero_documento.must_equal '000123' }
61
- it{ @object.valor_documento.must_equal 101.99 }
62
- it{ @object.data_vencimento.must_equal Date.new(2015, 07, 10) }
63
- it{ @object.carteira.must_equal '175' }
64
- it{ @object.agencia.must_equal '0098' }
65
- it{ @object.conta_corrente.must_equal '98701' }
66
- it{ @object.codigo_moeda.must_equal '9' }
67
- it{ @object.cedente.must_equal 'Nome da razao social' }
68
- it{ @object.especie.must_equal 'R$' }
69
- it{ @object.especie_documento.must_equal 'DM' }
70
- it{ @object.data_documento.must_equal Date.today }
71
- it{ @object.sacado.must_equal 'Teste' }
72
- it{ @object.documento_sacado.must_equal '72527500510' }
73
- it{ @object.endereco_sacado.must_equal 'Rua teste, 23045'}
74
- it{ @object.local_pagamento.must_equal 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO' }
75
- it{ @object.instrucoes1.must_equal 'Lembrar de algo 1'}
76
- it{ @object.instrucoes2.must_equal 'Lembrar de algo 2'}
77
- it{ @object.instrucoes3.must_equal 'Lembrar de algo 3'}
78
- it{ @object.instrucoes4.must_equal 'Lembrar de algo 4'}
79
- it{ @object.instrucoes5.must_equal 'Lembrar de algo 5'}
80
- it{ @object.instrucoes6.must_equal 'Lembrar de algo 6'}
81
- end
82
-
83
- context "when passing a block" do
84
- before do
85
- @object = subject.class.new do |boleto|
86
- boleto.numero_documento = '187390'
87
- boleto.valor_documento = 1
88
- boleto.data_vencimento = Date.new(2012, 10, 10)
89
- boleto.carteira = '109'
90
- boleto.agencia = '0914'
91
- boleto.conta_corrente = '82369'
92
- boleto.codigo_cedente = '90182'
93
- boleto.endereco_cedente = 'Rua Itapaiuna, 2434'
94
- boleto.cedente = 'Nome da razao social'
95
- boleto.documento_cedente = '62.526.713/0001-40'
96
- boleto.sacado = 'Teste'
97
- boleto.instrucoes1 = 'Lembrar de algo 1'
98
- boleto.instrucoes2 = 'Lembrar de algo 2'
99
- boleto.instrucoes3 = 'Lembrar de algo 3'
100
- boleto.instrucoes4 = 'Lembrar de algo 4'
101
- boleto.instrucoes5 = 'Lembrar de algo 5'
102
- boleto.instrucoes6 = 'Lembrar de algo 6'
103
- end
33
+ it "se mudar o valor do metodo valid_numero_documento_maximum dev validar o tamanho maximo a com o valor setado" do
34
+ subject.stubs(:valid_numero_documento_maximum).returns(4)
35
+ subject.numero_documento = '1234567'
36
+ must_be_message_error(:numero_documento, :custom_length_maximum, {count: 4})
104
37
  end
105
-
106
- it {@object.numero_documento.must_equal '187390' }
107
- it {@object.valor_documento.must_equal 1 }
108
- it {@object.carteira.must_equal '109' }
109
- it {@object.agencia.must_equal '0914' }
110
- it {@object.conta_corrente.must_equal '82369' }
111
- it {@object.codigo_moeda.must_equal '9' }
112
- it {@object.codigo_cedente.must_equal '090182' }
113
- it {@object.endereco_cedente.must_equal 'Rua Itapaiuna, 2434' }
114
- it {@object.cedente.must_equal 'Nome da razao social' }
115
- it {@object.documento_cedente.must_equal '62526713000140' }
116
- it {@object.sacado.must_equal 'Teste' }
117
- it {@object.aceite.must_equal true }
118
- it {@object.instrucoes1.must_equal 'Lembrar de algo 1' }
119
- it {@object.instrucoes2.must_equal 'Lembrar de algo 2' }
120
- it {@object.instrucoes3.must_equal 'Lembrar de algo 3' }
121
- it {@object.instrucoes4.must_equal 'Lembrar de algo 4' }
122
- it {@object.instrucoes5.must_equal 'Lembrar de algo 5' }
123
- it {@object.instrucoes6.must_equal 'Lembrar de algo 6' }
124
- end
125
- end
126
-
127
- describe "#documento_cedente" do
128
- context "com CPF" do
129
- before do
130
- subject.documento_cedente = 2273542143
38
+ it "se não tiver valor setado em valid_numero_documento_maximum, não deve validar" do
39
+ subject.stubs(:valid_numero_documento_maximum).returns(nil)
40
+ subject.numero_documento = '1234567'
41
+ wont_be_message_error(:numero_documento)
131
42
  end
132
- it "deve preencher com zeros a esquerda se for menor que 11" do
133
- subject.documento_cedente.must_equal '02273542143'
134
- end
135
- it "deve remover a formatacao" do
136
- subject.documento_cedente = '022.735.421-43'
137
- subject.documento_cedente.must_equal '02273542143'
43
+ end
44
+ context "#valor_documento" do
45
+ it "por padrão deve ter a validação de tamanho maximo com 99999999.99" do
46
+ must validate_numericality_of(:valor_documento).is_less_than_or_equal_to(99999999.99)
138
47
  end
139
- describe "metodo documento_cedente_formatado " do
140
- it { subject.documento_cedente_formatado.must_equal '022.735.421-43' }
48
+ it "deve validar o valor maximo a partir do metodo valid_valor_documento_tamanho_maximo" do
49
+ subject.stubs(:valid_valor_documento_tamanho_maximo).returns(100.00)
50
+ must validate_numericality_of(:valor_documento).is_less_than_or_equal_to(100.0)
141
51
  end
142
- describe "metodo documento_cedente_formatado_com_label " do
143
- it { subject.documento_cedente_formatado_com_label.must_equal 'CPF 022.735.421-43' }
52
+ it "não deve validar o valor maximo se o metodo valid_valor_documento_tamanho_maximo estiver nil" do
53
+ subject.stubs(:valid_valor_documento_tamanho_maximo).returns(nil)
54
+ wont validate_numericality_of(:valor_documento)
144
55
  end
145
56
  end
146
57
 
147
- context "com CNPJ" do
148
- before do
149
- subject.documento_cedente = 9372490000121
150
- end
151
- it "deve preencher com zeros a esquerda se tamanho for 12" do
152
- subject.documento_cedente = 123456789012
153
- subject.documento_cedente.must_equal '00123456789012'
154
- end
155
- it "deve preencher com zeros a esquerda se tamanho for 13" do
156
- subject.documento_cedente = 9372490000121
157
- subject.documento_cedente.must_equal '09372490000121'
158
- end
159
- it "deve remover a formatacao" do
160
- subject.documento_cedente = '09.372.490/0001-21'
161
- subject.documento_cedente.must_equal '09372490000121'
162
- end
163
- describe "metodo documento_cedente_formatado " do
164
- it { subject.documento_cedente_formatado.must_equal '09.372.490/0001-21' }
165
- end
166
- describe "metodo documento_cedente_formatado_com_label " do
167
- it { subject.documento_cedente_formatado_com_label.must_equal 'CNPJ 09.372.490/0001-21' }
168
- end
58
+ it "data_vencimento deve ser uma data" do
59
+ subject.data_vencimento = 13
60
+ must_be_message_error :data_vencimento, :invalid
61
+ subject.data_vencimento = '13'
62
+ must_be_message_error :data_vencimento, :invalid
63
+ subject.data_vencimento = Time.current
64
+ must_be_message_error :data_vencimento, :invalid
65
+
66
+ subject.data_vencimento = Date.current
67
+ wont_be_message_error :data_vencimento, :invalid
169
68
  end
170
69
  end
171
70
 
172
- describe "#documento_sacado" do
173
- context "com CPF" do
174
- before do
175
- subject.documento_sacado = 2273542143
176
- end
177
- it "deve preencher com zeros a esquerda se for menor que 11" do
178
- subject.documento_sacado.must_equal '02273542143'
179
- end
180
- it "deve remover a formatacao" do
181
- subject.documento_sacado = '022.735.421-43'
182
- subject.documento_sacado.must_equal '02273542143'
183
- end
184
- describe "metodo documento_sacado_formatado " do
185
- it { subject.documento_sacado_formatado.must_equal '022.735.421-43' }
186
- end
187
- describe "metodo documento_sacado_formatado_com_label " do
188
- it { subject.documento_sacado_formatado_com_label.must_equal 'CPF 022.735.421-43' }
189
- end
71
+ describe "#default_values" do
72
+ it 'for codigo_moeda' do
73
+ subject.class.new.codigo_moeda.must_equal '9'
74
+ end
75
+ it 'for especie' do
76
+ subject.class.new.especie.must_equal 'R$'
190
77
  end
78
+ it 'for especie_documento' do
79
+ subject.class.new.especie_documento.must_equal 'DM'
80
+ end
81
+ it 'for local_pagamento' do
82
+ subject.class.new.local_pagamento.must_equal 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO'
83
+ end
84
+ it 'for data_documento' do
85
+ subject.class.new.data_documento.must_equal Date.current
86
+ end
87
+ it 'for aceite' do
88
+ subject.class.new.aceite.must_equal false
89
+ end
90
+ end
191
91
 
192
- context "com CNPJ" do
193
- before do
194
- subject.documento_sacado = 9372490000121
195
- end
196
- it "deve preencher com zeros a esquerda se tamanho for 12" do
197
- subject.documento_sacado = 123456789012
198
- subject.documento_sacado.must_equal '00123456789012'
199
- end
200
- it "deve preencher com zeros a esquerda se tamanho for 13" do
201
- subject.documento_sacado = 9372490000121
202
- subject.documento_sacado.must_equal '09372490000121'
203
- end
204
- it "deve remover a formatacao" do
205
- subject.documento_sacado = '09.372.490/0001-21'
206
- subject.documento_sacado.must_equal '09372490000121'
207
- end
208
- describe "metodo documento_sacado_formatado " do
209
- it { subject.documento_sacado_formatado.must_equal '09.372.490/0001-21' }
210
- end
211
- describe "metodo documento_sacado_formatado_com_label " do
212
- it { subject.documento_sacado_formatado_com_label.must_equal 'CNPJ 09.372.490/0001-21' }
213
- end
92
+ describe '#numero_documento' do
93
+ it "deve ajustar o tamanho do numero conforme valid_numero_documento_maximum" do
94
+ subject.numero_documento = 354
95
+ subject.numero_documento.must_equal '000354'
96
+
97
+ subject.stubs(:valid_numero_documento_maximum).returns(4)
98
+ subject.numero_documento.must_equal '0354'
99
+
100
+ subject.stubs(:valid_numero_documento_maximum).returns(nil)
101
+ subject.numero_documento.must_equal 354
214
102
  end
215
103
  end
216
104
 
217
- context "#carteira_formatada" do
218
- it "returns 'carteira' as default" do
219
- subject.stubs(:carteira).returns('Foo')
220
- subject.carteira_formatada.must_equal 'Foo'
105
+ describe "#parcelas" do
106
+ it "se não tiver parcelas setadas, deve retornar 001" do
107
+ subject.parcelas = ''
108
+ subject.parcelas.must_equal "001"
109
+ end
110
+ it "deve permitir a modificação do número de parcelas" do
111
+ subject.parcelas = 2
112
+ subject.parcelas.must_equal "002"
113
+ end
114
+ end
115
+
116
+ describe "to_partial_path" do
117
+ it "must return the path from class name" do
118
+ subject.to_partial_path.must_equal 'br_boleto/base'
221
119
  end
222
120
  end
223
121
 
224
122
  describe "#valor_documento_formatado" do
225
- context "when period" do
123
+ context "valor maior que 100" do
226
124
  before { subject.stubs(:valor_documento).returns(123.45) }
227
125
 
228
126
  it {subject.valor_formatado_para_codigo_de_barras.must_equal '0000012345' }
229
127
  end
230
128
 
231
- context "when less than ten" do
129
+ context "valor menor que 100" do
232
130
  before { subject.stubs(:valor_documento).returns(5.0) }
233
131
 
234
132
  it {subject.valor_formatado_para_codigo_de_barras.must_equal '0000000500'}
@@ -285,21 +183,49 @@ describe BrBoleto::Boleto::Base do
285
183
  end
286
184
  end
287
185
 
288
- it "#codigo_banco" do
289
- assert_raises NotImplementedError do
290
- subject.codigo_banco
186
+ describe '#codigo_de_barras' do
187
+ it 'deve montar o código de barras com o codigo_de_barras_padrao e codigo_de_barras_do_banco' do
188
+ subject.expects(:codigo_de_barras_padrao).returns(''.rjust(18, '1'))
189
+ subject.expects(:codigo_de_barras_do_banco).returns(''.rjust(25, '3'))
190
+ subject.expects(:digito_codigo_de_barras).returns('2')
191
+
192
+ subject.codigo_de_barras.must_equal '1111211111111111111'+''.ljust(25, '3')
291
193
  end
292
194
  end
293
195
 
294
- it "#digito_codigo_banco" do
295
- assert_raises NotImplementedError do
296
- subject.digito_codigo_banco
196
+ describe '#codigo_de_barras_padrao' do
197
+ it "deve montar a parte do codigo de barras padrão para todos os bancos" do
198
+ subject.data_vencimento = Date.parse('21/02/2025') # dia 21/02/2025 vai parar de funcionar
199
+ subject.codigo_moeda = '8'
200
+ subject.valor_documento = 5_123.05
201
+ subject.conta.expects(:codigo_banco).returns('554')
202
+
203
+ resul = subject.codigo_de_barras_padrao
204
+ resul.size.must_equal 18
205
+ resul[0..2].must_equal '554' # Código do banco
206
+ resul[ 3 ].must_equal '8' # Código da moeda
207
+ resul[4..7].must_equal '9999' # Fator de vencimento
208
+ resul[8..17].must_equal '0000512305' # Valor do documento
297
209
  end
298
210
  end
299
211
 
300
- it "#agencia_codigo_cedente" do
301
- assert_raises NotImplementedError do
302
- subject.agencia_codigo_cedente
212
+ describe '#digito_codigo_de_barras' do
213
+ it "deve calcular o digito pelo Modulo11FatorDe2a9 com os valores de codigo_de_barras_padrao e codigo_de_barras_do_banco" do
214
+ subject.expects(:codigo_de_barras_padrao).returns('123456')
215
+ subject.expects(:codigo_de_barras_do_banco).returns('789012')
216
+ BrBoleto::Calculos::Modulo11FatorDe2a9.expects(:new).with('123456789012').returns(7)
217
+
218
+ subject.digito_codigo_de_barras.must_equal 7
219
+ end
220
+ end
221
+
222
+ describe '#linha_digitavel' do
223
+ it "deve gerar a linha_digitavel a partir do calculo LinhaDigitavel passando o codigo de barras" do
224
+ subject.expects(:codigo_de_barras).returns('CODIGOBARRAS')
225
+
226
+ BrBoleto::Calculos::LinhaDigitavel.expects(:new).with('CODIGOBARRAS').returns('LinhaDigitavel')
227
+
228
+ subject.linha_digitavel.must_equal 'LinhaDigitavel'
303
229
  end
304
230
  end
305
231