br_boleto 1.2.2 → 2.0.0

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 (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