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,179 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Sicoob do
4
+ subject { FactoryGirl.build(:remessa_cnab400_sicoob, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_sicoob) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do sicoob" do
10
+ BrBoleto::Remessa::Cnab400::Sicoob.new.conta_class.must_equal BrBoleto::Conta::Sicoob
11
+ end
12
+
13
+ it "deve herdar de Cnab400::Base" do
14
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab400::Base
15
+ end
16
+
17
+ describe '#informacoes_da_conta' do
18
+ it "deve retornar com 20 caracteres" do
19
+ subject.informacoes_da_conta(:detalhe).size.must_equal 20
20
+ end
21
+ it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
22
+ conta.agencia = 1234
23
+ conta.agencia_dv = 1
24
+ conta.codigo_cedente = 123456
25
+ conta.codigo_cedente_dv = 2
26
+ result = subject.informacoes_da_conta(:detalhe)
27
+
28
+ result[0..3].must_equal '1234' # Agencia
29
+ result[4].must_equal '1' # DV Agencia
30
+ result[5..12].must_equal '00123456'# DV Agencia
31
+ result[13].must_equal '2' # DV Agencia
32
+ result[14..19].must_equal '000000'
33
+ end
34
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
35
+ conta.agencia = 3321
36
+ conta.agencia_dv = 3
37
+ conta.codigo_cedente = 1234567890123
38
+ conta.codigo_cedente_dv = 2
39
+ result = subject.informacoes_da_conta(:header)
40
+
41
+ result[0..3].must_equal '3321' # Agencia
42
+ result[4].must_equal '3' # DV Agencia
43
+ result[5..12].must_equal '12345678'# DV Agencia
44
+ result[13].must_equal '2' # DV Agencia
45
+ result[14..19].must_equal ' '
46
+ end
47
+ end
48
+
49
+ describe '#complemento_registro' do
50
+ it "deve retornar o sequencial da remessa com 7 posições e mais 287 brancos" do
51
+ subject.sequencial_remessa = 4758
52
+ subject.complemento_registro.size.must_equal 294
53
+ subject.complemento_registro.must_equal '0004758'.ljust(294, ' ')
54
+ end
55
+ end
56
+
57
+ describe '#dados_do_pagamento' do
58
+ it "deve ter o tamanho de 14 digitos" do
59
+ subject.dados_do_pagamento(pagamento).size.must_equal 14
60
+ end
61
+ it "deve retornar os nosso numero e a parcela" do
62
+ pagamento.assign_attributes(nosso_numero: 4578, parcela: 3)
63
+ result = subject.dados_do_pagamento(pagamento)
64
+ result[0..11].must_equal '000000004578'
65
+ result[12..13].must_equal '03'
66
+ end
67
+ end
68
+
69
+ describe '#detalhe_posicao_077_108' do
70
+ it "deve ter o tamanho de 32 digitos" do
71
+ subject.detalhe_posicao_077_108(pagamento, 4).size.must_equal 32
72
+ end
73
+ it "deve conter as informações nas posições corretas" do
74
+ pagamento.assign_attributes(tipo_emissao: 2)
75
+ subject.conta.modalidade = '0333333'
76
+ result = subject.detalhe_posicao_077_108(pagamento, 4)
77
+ result[0..1].must_equal '00' # 077 078 002 9(02) Grupo de V
78
+ result[2..4].must_equal ''.rjust(3, ' ') # 079 081 003 X(03) Complement
79
+ result[5].must_equal ' ' # 082 082 001 X(01) "Indicativ
80
+ result[6..8].must_equal ''.rjust(3, ' ') # 083 085 003 X(03) Prefixo do
81
+ result[9..11].must_equal '000' # 086 088 003 9(03) Variação d
82
+ result[12].must_equal '0' # 089 089 001 9(01) Conta Cauç
83
+ result[13..17].must_equal ''.rjust(5, '0') # 090 094 005 9(05) "Número do
84
+ result[18].must_equal '0' # 095 095 001 X(01) "DV do con
85
+ result[19..24].must_equal ''.rjust(6, '0') # 096 101 006 9(06) Numero do
86
+ result[25..28].must_equal ''.rjust(4, ' ') # 102 105 004 X(04) Complement
87
+ result[29].must_equal "2" # tipo_emissao
88
+ result[30..31].must_equal '03' #modalidade
89
+ result.size.must_equal 32
90
+ end
91
+ end
92
+
93
+ describe '#informacoes_do_pagamento' do
94
+ it "deve ter o tamanho de 40 digitos" do
95
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
96
+ end
97
+ it "deve conter as informações nas posições corretas" do
98
+ conta.agencia = 4587
99
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
100
+ pagamento.data_vencimento = Date.parse('05/08/2029')
101
+ pagamento.valor_documento = 47.56
102
+ pagamento.especie_titulo = 12
103
+ pagamento.aceite = true
104
+ pagamento.data_emissao = Date.parse('15/09/2017')
105
+ result = subject.informacoes_do_pagamento(pagamento, 4)
106
+ result.size.must_equal 40
107
+
108
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
109
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
110
+ result[19..21].must_equal '756' # Número Banco: "756"
111
+ result[22..25].must_equal "4587" # Prefixo da Cooperativa: vide e-mail enviado com os dados do processo de homologação
112
+ result[ 26 ].must_equal "4" # Dígito Verificador do Prefixo: vide e-mail enviado com os dados do processo de homologação
113
+ result[27..28].must_equal "12" # Espécie do Título
114
+ result[ 29 ].must_equal "1" # "Aceite do Título: "0" = Sem aceite "1" = Com aceite"
115
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
116
+ result[36..37].must_equal '00' # Primeira instrução codificada:
117
+ result[38..39].must_equal '00' # Segunda instrução: vide SEQ 33
118
+ end
119
+ end
120
+
121
+ describe '#detalhe_multas_e_juros_do_pagamento' do
122
+ it "deve ter o tamanho de 58 digitos" do
123
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
124
+ end
125
+ it "deve conter as informações nas posições corretas" do
126
+ pagamento.expects(:percentual_juros_formatado).with(6).returns('025000')
127
+ pagamento.expects(:percentual_multa_formatado).with(6).returns('045000')
128
+ pagamento.tipo_emissao = '2'
129
+ pagamento.data_desconto = Date.parse('21/03/2018')
130
+ pagamento.valor_desconto = 4.3
131
+ pagamento.codigo_moeda = 9
132
+ pagamento.valor_abatimento = 56.47
133
+
134
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
135
+ result.size.must_equal 58
136
+
137
+ result[00..05].must_equal '025000'
138
+ result[06..11].must_equal '045000'
139
+ result[ 12 ].must_equal "2"
140
+ result[13..18].must_equal "210318"
141
+ result[19..31].must_equal '0000000000430'
142
+ result[ 32 ].must_equal "9"
143
+ result[33..44].must_equal ''.ljust(12 ,'0')
144
+ result[45..57].must_equal '0000000005647'
145
+ end
146
+ end
147
+
148
+ describe '#informacoes_do_sacado' do
149
+ it "deve ter o tamanho de 176 digitos" do
150
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
151
+ end
152
+ it "deve conter as informações nas posições corretas" do
153
+ # pagador.tipo_cpf_cnpj = '1'
154
+ pagador.cpf_cnpj = '12345678901'
155
+ pagador.nome = 'nome pagador'
156
+ pagador.endereco = 'rua'
157
+ pagador.bairro = 'bairro'
158
+ pagador.cep = '89885-001'
159
+ pagador.cidade = 'São Carlos'
160
+ pagador.uf = 'SC'
161
+ pagador.nome_avalista = 'Avalista'
162
+
163
+ result = subject.informacoes_do_sacado(pagamento, 2)
164
+ result.size.must_equal 176
165
+
166
+ result[00..01].must_equal "01" # "Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
167
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
168
+ result[16..55].must_equal 'nome pagador'.ljust(40, ' ') # Nome do Pagador
169
+ result[56..92].must_equal 'rua'.ljust(37, ' ') # Endereço do Pagador
170
+ result[93..107].must_equal 'bairro'.ljust(15, ' ') # Bairro do Pagador
171
+ result[108..115].must_equal '89885001' # CEP do Pagador
172
+ result[116..130].must_equal 'São Carlos'.ljust(15, ' ') # Cidade do Pagador
173
+ result[131..132].must_equal 'SC' # UF do Pagador
174
+ result[133..172].must_equal 'Avalista'.ljust(40, ' ') # Observações/Mensagem ou Sacador/Avalista
175
+ result[173..174].must_equal "00" # "Número de Dias Para Protesto: Quantidade dias para envio protesto. Se = "0", utilizar dias protesto padrão do cliente cadastrado na cooperativa
176
+ result[ 175 ].must_equal " " # Complemento do Registro: Brancos
177
+ end
178
+ end
179
+ end
@@ -4,46 +4,7 @@ describe BrBoleto::Remessa::Lote do
4
4
  subject { FactoryGirl.build(:remessa_lote) }
5
5
  let(:pagamento) { FactoryGirl.build(:remessa_pagamento) }
6
6
 
7
- describe "#pagamentos" do
8
- it "deve haver ao menos 1 pagamento" do
9
- wont allow_value([]).for(:pagamentos).with_message("não pode estar vazio.")
10
- end
11
- it "deve ser um objeto pagamento" do
12
- wont allow_value([subject.class.new()]).for(:pagamentos).with_message("cada item deve ser um objeto Pagamento.")
13
- end
14
- it "deve ser válido com um pagamento válido" do
15
- must allow_value([pagamento]).for(:pagamentos)
16
- end
17
- it "não deve ser válidose houver algum pagamento inválido" do
18
- wont allow_value([FactoryGirl.build(:remessa_pagamento, cep_sacado: nil)]).for(:pagamentos)
19
- end
20
- it "deve ser válido se passar apenas um pagamento sem Array" do
21
- must allow_value(pagamento).for(:pagamentos)
22
- end
23
- it "se setar apenas 1 pagamento sem array deve retornar um array de 1 posicao" do
24
- subject.pagamentos = pagamento
25
- subject.pagamentos.size.must_equal 1
26
- subject.pagamentos.is_a?(Array).must_equal true
27
- subject.pagamentos[0].must_equal pagamento
28
- end
29
- it "posso setar mais que 1 pagamento" do
30
- pagamento2 = FactoryGirl.build(:remessa_pagamento)
31
- subject.pagamentos = [pagamento, pagamento2]
32
- subject.pagamentos.size.must_equal 2
33
- subject.pagamentos.is_a?(Array).must_equal true
34
- subject.pagamentos[0].must_equal pagamento
35
- subject.pagamentos[1].must_equal pagamento2
36
- end
37
-
38
- it "posso incrementar os pagamentos com <<" do
39
- pagamento2 = FactoryGirl.build(:remessa_pagamento, valor_documento: 0.50)
40
- subject.pagamentos = pagamento
41
- subject.pagamentos.size.must_equal 1
42
- subject.pagamentos << pagamento2
43
- subject.pagamentos.size.must_equal 2
44
- subject.pagamentos.is_a?(Array).must_equal true
45
- subject.pagamentos[0].must_equal pagamento
46
- subject.pagamentos[1].must_equal pagamento2
47
- end
7
+ it "deve ter incluso o module HavePagamentos" do
8
+ subject.class.included_modules.must_include BrBoleto::HavePagamentos
48
9
  end
49
10
  end
@@ -2,141 +2,169 @@
2
2
  require 'test_helper'
3
3
 
4
4
  describe BrBoleto::Remessa::Pagamento do
5
-
6
- class Shoulda::Matchers::ActiveModel::ValidateLengthOfMatcher
7
- # Sobrescrevo o método que gera a string para validar o tamanho
8
- # Pois o CEP só aceita números
9
- def string_of_length(length)
10
- '8' * length
11
- end
12
- end
13
-
14
5
  subject { FactoryGirl.build(:remessa_pagamento) }
6
+
7
+ it "deve conter o mdule HavePagador" do
8
+ subject.class.included_modules.must_include BrBoleto::HavePagador
9
+ end
15
10
 
16
11
 
17
12
  describe "validations" do
18
13
  it { must validate_presence_of(:nosso_numero) }
19
14
  it { must validate_presence_of(:data_vencimento) }
20
15
  it { must validate_presence_of(:valor_documento) }
21
- it { must validate_presence_of(:documento_sacado) }
22
- it { must validate_presence_of(:nome_sacado) }
23
- it { must validate_presence_of(:endereco_sacado) }
24
- it { must validate_presence_of(:cep_sacado) }
25
- it { must validate_presence_of(:cidade_sacado) }
26
- it { must validate_presence_of(:uf_sacado) }
27
- it { must validate_presence_of(:bairro_sacado) }
28
- it { must validate_presence_of(:tipo_impressao) }
29
16
 
30
- it { must validate_length_of(:cep_sacado).is_equal_to(8).with_message("deve ter 8 dígitos.") }
31
- it { must validate_length_of(:cod_desconto).is_equal_to(1).with_message("deve ter 1 dígito.") }
32
- end
17
+ describe '#tipo_impressao' do
18
+ it { wont validate_presence_of(:tipo_impressao) }
33
19
 
34
- context "default_values" do
35
- it "for data_emissao" do
36
- object = subject.class.new()
37
- object.data_emissao.must_equal Date.current
38
- end
39
- it "for valor_mora" do
40
- object = subject.class.new()
41
- object.valor_mora.must_equal 0.0
42
- end
43
- it "for valor_desconto" do
44
- object = subject.class.new()
45
- object.valor_desconto.must_equal 0.0
46
- end
47
- it "for valor_iof" do
48
- object = subject.class.new()
49
- object.valor_iof.must_equal 0.0
50
- end
51
- it "for valor_abatimento" do
52
- object = subject.class.new()
53
- object.valor_abatimento.must_equal 0.0
54
- end
55
- it "for nome_avalista" do
56
- object = subject.class.new()
57
- object.nome_avalista.must_equal ''
58
- end
59
- it "for cod_desconto" do
60
- object = subject.class.new()
61
- object.cod_desconto.must_equal '0'
62
- end
63
- it "for tipo_impressao" do
64
- object = subject.class.new()
65
- object.tipo_impressao.must_equal '1'
66
- end
67
- it "for desconto_2_codigo" do
68
- object = subject.class.new()
69
- object.desconto_2_codigo.must_equal '0'
20
+ it "se valid_tipo_impressao_required for true deve validar a obrigatoriedade do tipo de tipo_impressao" do
21
+ subject.valid_tipo_impressao_required = true
22
+ must validate_presence_of(:tipo_impressao)
23
+ end
24
+
70
25
  end
71
- it "for desconto_2_valor" do
72
- object = subject.class.new()
73
- object.desconto_2_valor.must_equal 0.0
26
+
27
+ describe '#cod_desconto' do
28
+ before { subject.cod_desconto = '555' }
29
+
30
+ it { wont_be_message_error(:cod_desconto) }
31
+ it "se valid_cod_desconto_length tiver valor validar a partir do valor setado" do
32
+ subject.valid_cod_desconto_length = 2
33
+ must_be_message_error(:cod_desconto, :custom_length_is, {count: 2})
34
+ end
74
35
  end
75
- it "for desconto_3_codigo" do
76
- object = subject.class.new()
77
- object.desconto_3_codigo.must_equal '0'
36
+
37
+ describe '#emissao_boleto' do
38
+ before { subject.emissao_boleto = '555' }
39
+
40
+ it { wont_be_message_error(:emissao_boleto) }
41
+ it "se valid_emissao_boleto_length tiver valor validar a partir do valor setado" do
42
+ subject.valid_emissao_boleto_length = 2
43
+ must_be_message_error(:emissao_boleto, :custom_length_is, {count: 2})
44
+ end
78
45
  end
79
- it "for desconto_3_valor" do
80
- object = subject.class.new()
81
- object.desconto_3_valor.must_equal 0.0
46
+
47
+ describe '#distribuicao_boleto' do
48
+ before { subject.distribuicao_boleto = '555' }
49
+
50
+ it { wont_be_message_error(:distribuicao_boleto) }
51
+ it "se valid_distribuicao_boleto_length tiver valor validar a partir do valor setado" do
52
+ subject.valid_distribuicao_boleto_length = 2
53
+ must_be_message_error(:distribuicao_boleto, :custom_length_is, {count: 2})
54
+ end
82
55
  end
83
- it "for codigo_multa" do
84
- object = subject.class.new()
85
- object.codigo_multa.must_equal '3'
56
+ end
57
+
58
+ describe "#percentual_multa" do
59
+ it "deve retornar o percentual representativo do valor_multa para o valor_documento utilizando" do
60
+ subject.assign_attributes(valor_multa: 7.47, valor_documento: 78.98)
61
+ subject.percentual_multa.must_equal 9.458091
62
+ end
63
+ it "deve utilizar o metodo get_percent_by_total de Helper::Number para gerar o percentual" do
64
+ subject.assign_attributes(valor_multa: 8.47, valor_documento: 100.00)
65
+ numero = BrBoleto::Helper::Number.new(50.0)
66
+ BrBoleto::Helper::Number.expects(:new).returns(numero)
67
+ numero.expects(:get_percent_by_total).with(100.00).returns(10.47)
68
+
69
+ subject.percentual_multa.must_equal 10.47
86
70
  end
87
- it "for valor_multa" do
88
- object = subject.class.new()
89
- object.valor_multa.must_equal 0.0
71
+ end
72
+
73
+ describe "#percentual_juros" do
74
+ it "deve retornar o percentual representativo do valor_juros para o valor_documento utilizando" do
75
+ subject.assign_attributes(valor_juros: 7.47, valor_documento: 78.98)
76
+ subject.percentual_juros.must_equal 9.458091
77
+ end
78
+ it "deve utilizar o metodo get_percent_by_total de Helper::Number para gerar o percentual" do
79
+ subject.assign_attributes(valor_juros: 8.47, valor_documento: 100.00)
80
+ numero = BrBoleto::Helper::Number.new(50.0)
81
+ BrBoleto::Helper::Number.expects(:new).returns(numero)
82
+ numero.expects(:get_percent_by_total).with(100.00).returns(10.47)
83
+
84
+ subject.percentual_juros.must_equal 10.47
90
85
  end
91
- it "for codigo_juros" do
92
- object = subject.class.new()
93
- object.codigo_juros.must_equal '3'
86
+ end
87
+
88
+ describe '#moeda_real?' do
89
+ it "se a moeda for 9 então deve retornar true" do
90
+ subject.codigo_moeda = 9
91
+ subject.moeda_real?.must_equal true
94
92
  end
95
- it "for valor_juros" do
96
- object = subject.class.new()
97
- object.valor_juros.must_equal 0.0
93
+ it "se a moeda for diferente de 9 então deve retornar false" do
94
+ subject.codigo_moeda = 8
95
+ subject.moeda_real?.must_equal false
98
96
  end
97
+ end
99
98
 
99
+ it "se o codigo_moeda não tiver valor setado deve assumir '9'" do
100
+ subject.codigo_moeda = 10
101
+ subject.codigo_moeda.must_equal 10
102
+ subject.codigo_moeda = nil
103
+ subject.codigo_moeda.must_equal '9'
100
104
  end
101
105
 
102
- describe "#assign_attributes" do
103
- it "posso setar varios atributos" do
104
- subject.assign_attributes({cep_sacado: "89809-360", cidade_sacado: "Valor", uf_sacado: "OK"})
105
- subject.cep_sacado.must_equal '89809360'
106
- subject.cidade_sacado.must_equal 'Valor'
107
- subject.uf_sacado.must_equal 'OK'
108
- end
109
- it "nao deve sobrescrever os valores já setados com os valores padrões" do
110
- subject.cod_desconto = '9'
111
- subject.assign_attributes(valor_desconto: 500.88)
112
- subject.cod_desconto.must_equal '9'
113
- subject.valor_desconto.must_equal 500.88
114
- end
106
+ it "se não for setado uma parcela deve assumir 1" do
107
+ subject.parcela = 10
108
+ subject.parcela.must_equal 10
109
+ subject.parcela = nil
110
+ subject.parcela.must_equal '1'
115
111
  end
116
112
 
117
- describe "initialize com bloco" do
118
- subject do
119
- BrBoleto::Remessa::Pagamento.new do |bl|
120
- bl.nosso_numero = "999777"
121
- bl.valor_documento = 789.44
122
- end
123
- end
124
- it { subject.nosso_numero.must_equal '999777' }
125
- it { subject.valor_documento.must_equal 789.44 }
113
+ it "nosso_numero deve retornar apenas numeros" do
114
+ subject.nosso_numero = 'A1!@#$%*()-234vc.,;-56789o0'
115
+ subject.nosso_numero.must_equal '1234567890'
126
116
  end
127
117
 
128
- describe "#formata_data" do
129
- it "quando passar um valor nil" do
130
- subject.send(:formata_data, nil).must_equal '00000000'
118
+ describe "default_values" do
119
+ let(:object) { subject.class.new() }
120
+ it "for data_emissao" do object.data_emissao.must_equal Date.today end
121
+ it "for valor_mora" do object.valor_mora.must_equal 0.0 end
122
+ it "for valor_desconto" do object.valor_desconto.must_equal 0.0 end
123
+ it "for valor_iof" do object.valor_iof.must_equal 0.0 end
124
+ it "for valor_abatimento" do object.valor_abatimento.must_equal 0.0 end
125
+ it "for cod_desconto" do object.cod_desconto.must_equal '0' end
126
+ it "for desconto_2_codigo" do object.desconto_2_codigo.must_equal '0' end
127
+ it "for desconto_2_valor" do object.desconto_2_valor.must_equal 0.0 end
128
+ it "for desconto_3_codigo" do object.desconto_3_codigo.must_equal '0' end
129
+ it "for desconto_3_valor" do object.desconto_3_valor.must_equal 0.0 end
130
+ it "for codigo_multa" do object.codigo_multa.must_equal '3' end
131
+ it "for codigo_juros" do object.codigo_juros.must_equal '3' end
132
+ it "for valor_multa" do object.valor_multa.must_equal 0.0 end
133
+ it "for valor_juros" do object.valor_juros.must_equal 0.0 end
134
+ it "for parcela" do object.parcela.must_equal '1' end
135
+ it "for tipo_impressao" do object.tipo_impressao.must_equal '1' end
136
+ it "for tipo_emissao" do object.tipo_emissao.must_equal '2' end
137
+ it "for identificacao_ocorrencia" do object.identificacao_ocorrencia.must_equal '01' end
138
+ it "for especie_titulo" do object.especie_titulo.must_equal '01' end
139
+ it "for codigo_moeda" do object.codigo_moeda.must_equal '9' end
140
+ it "for forma_cadastramento" do object.forma_cadastramento.must_equal '0' end
141
+ it "for emissao_boleto" do object.emissao_boleto.must_equal '2' end
142
+ it "for distribuicao_boleto" do object.distribuicao_boleto.must_equal '2' end
143
+ end
144
+
145
+ describe "#data_vencimento_formatado" do
146
+ it "deve chamar o metodo formata_data com padrão de formato %d%m%Y" do
147
+ subject.data_vencimento = Date.current
148
+ subject.expects(:formata_data).with(Date.current, "%d%m%Y").returns("123456")
149
+ subject.data_vencimento_formatado.must_equal '123456'
131
150
  end
132
- it "quando passar um valor nil mas passar outro formato para a data" do
133
- subject.send(:formata_data, nil, "%d%m%y").must_equal '000000'
151
+ it "deve chamar o metodo formata_data com o parametro passado" do
152
+ subject.data_vencimento = Date.current
153
+ subject.expects(:formata_data).with(Date.current, "%d%m%y").returns("123456")
154
+ subject.data_vencimento_formatado("%d%m%y").must_equal '123456'
134
155
  end
135
- it "deve formatar a data com padrão ddmmyyyy" do
136
- subject.send(:formata_data, Date.parse('30/12/2017')).must_equal '30122017'
156
+ end
157
+
158
+ describe "#data_emissao_formatado" do
159
+ it "deve chamar o metodo formata_data com padrão de formato %d%m%Y" do
160
+ subject.data_emissao = Date.current
161
+ subject.expects(:formata_data).with(Date.current, "%d%m%Y").returns("123456")
162
+ subject.data_emissao_formatado.must_equal '123456'
137
163
  end
138
- it "deve formatar a data com formato passado por parametro" do
139
- subject.send(:formata_data, Date.parse('30/12/2017'), "%d%m%y").must_equal '301217'
164
+ it "deve chamar o metodo formata_data com o parametro passado" do
165
+ subject.data_emissao = Date.current
166
+ subject.expects(:formata_data).with(Date.current, "%d%m%y").returns("123456")
167
+ subject.data_emissao_formatado("%d%m%y").must_equal '123456'
140
168
  end
141
169
  end
142
170
 
@@ -233,8 +261,6 @@ describe BrBoleto::Remessa::Pagamento do
233
261
  end
234
262
  end
235
263
 
236
-
237
-
238
264
  describe "#valor_documento_formatado" do
239
265
  context "com padrao de tamanho = 13 digitos" do
240
266
  it "deve formatar o valor removendo separador de casas decimais e aredondando para 2 casas decimais" do
@@ -310,89 +336,61 @@ describe BrBoleto::Remessa::Pagamento do
310
336
  end
311
337
  end
312
338
 
313
- describe "#tipo_documento_sacado" do
314
- it "quand documento_sacado for nil" do
315
- subject.documento_sacado = nil
316
- subject.tipo_documento_sacado.must_equal '0'
317
- end
318
- context "com padrao de tamanho = 2" do
319
- it "deve ser 02 (CPF) se for menor que 14 digitos e maior que 11" do
320
- subject.documento_sacado = '123456789012'
321
- subject.tipo_documento_sacado.must_equal '02'
322
- end
323
- it "deve ser 01 (CPF) se for igual a 11" do
324
- subject.documento_sacado = '12345678901'
325
- subject.tipo_documento_sacado.must_equal '01'
326
- end
327
- it "deve ser 01 (CPF) se for menor que 11" do
328
- subject.documento_sacado = '1234567890'
329
- subject.tipo_documento_sacado.must_equal '01'
330
- end
331
- it "deve ser 02 (CNPJ/CGC) se for igual a 14 digitos" do
332
- subject.documento_sacado = '12345678901234'
333
- subject.tipo_documento_sacado.must_equal '02'
334
- end
335
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos" do
336
- subject.documento_sacado = '123456789012345'
337
- subject.tipo_documento_sacado.must_equal '02'
338
- end
339
+ describe '#percentual_multa_formatado' do
340
+ let(:number) { BrBoleto::Helper::Number.new(5.47) }
341
+ it "deve formatar o valor no formato de valores em percentual" do
342
+ subject.stubs(:percentual_multa).returns(72.50)
343
+ number
344
+ BrBoleto::Helper::Number.expects(:new).with(72.50).returns(number)
345
+ number.expects(:formata_valor_percentual).with(6).returns('123')
346
+ subject.percentual_multa_formatado.must_equal '123000'
347
+ end
348
+ it "deve considerar o tamanho pelo parametro para formatar o valor" do
349
+ subject.stubs(:percentual_multa).returns(4.0)
350
+ number
351
+ BrBoleto::Helper::Number.expects(:new).with(4.0).returns(number)
352
+ number.expects(:formata_valor_percentual).with(3).returns('1234')
353
+ subject.percentual_multa_formatado(3).must_equal '123'
354
+ end
355
+ it "deve gerar o valor corretamente - Teste sem MOCK" do
356
+ subject.stubs(:percentual_multa).returns(2.87)
357
+ subject.percentual_multa_formatado(5).must_equal '02870'
339
358
  end
340
- context "passando um tamanho por parâmetro" do
341
- it "deve ser 2 (CNPJ) se for menor que 14 digitos e maior que 11 com tamanho=1" do
342
- subject.documento_sacado = '1234567890123'
343
- subject.tipo_documento_sacado(1).must_equal '2'
344
- end
345
- it "deve ser 002 (CNPJ/CGC) se for igual a 14 digitos e tamanho = 3" do
346
- subject.documento_sacado = '12345678901234'
347
- subject.tipo_documento_sacado(3).must_equal '002'
348
- end
349
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos e tamanho = 2" do
350
- subject.documento_sacado = '123456789012345'
351
- subject.tipo_documento_sacado(2).must_equal '02'
352
- end
359
+ end
360
+ describe '#percentual_juros_formatado' do
361
+ let(:number) { BrBoleto::Helper::Number.new(5.47) }
362
+ it "deve formatar o valor no formato de valores em percentual" do
363
+ subject.stubs(:percentual_juros).returns(7.50)
364
+ number
365
+ BrBoleto::Helper::Number.expects(:new).with(7.50).returns(number)
366
+ number.expects(:formata_valor_percentual).with(6).returns('123')
367
+ subject.percentual_juros_formatado.must_equal '123000'
368
+ end
369
+ it "deve considerar o tamanho pelo parametro para formatar o valor" do
370
+ subject.stubs(:percentual_juros).returns(9.87)
371
+ number
372
+ BrBoleto::Helper::Number.expects(:new).with(9.87).returns(number)
373
+ number.expects(:formata_valor_percentual).with(3).returns('1234')
374
+ subject.percentual_juros_formatado(3).must_equal '123'
375
+ end
376
+ it "deve gerar o valor corretamente - Teste sem MOCK" do
377
+ subject.stubs(:percentual_juros).returns(12.438)
378
+ subject.percentual_juros_formatado(7).must_equal '1243800'
353
379
  end
354
380
  end
355
381
 
356
- describe "#tipo_documento_avalista" do
357
- it "quand documento_avalista for nil" do
358
- subject.documento_avalista = nil
359
- subject.tipo_documento_avalista.must_equal '0'
360
- end
361
- context "com padrao de tamanho = 2" do
362
- it "deve ser 02 (CNPJ) se for menor que 14 digitos e maior que 11" do
363
- subject.documento_avalista = '1234567890123'
364
- subject.tipo_documento_avalista.must_equal '02'
365
- end
366
- it "deve ser 01 (CPF) se for igual a 11" do
367
- subject.documento_avalista = '12345678901'
368
- subject.tipo_documento_avalista.must_equal '01'
369
- end
370
- it "deve ser 01 (CPF) se for menor que 11" do
371
- subject.documento_avalista = '1234567890'
372
- subject.tipo_documento_avalista.must_equal '01'
373
- end
374
- it "deve ser 02 (CNPJ/CGC) se for igual a 14 digitos" do
375
- subject.documento_avalista = '12345678901234'
376
- subject.tipo_documento_avalista.must_equal '02'
377
- end
378
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos" do
379
- subject.documento_avalista = '123456789012345'
380
- subject.tipo_documento_avalista.must_equal '02'
381
- end
382
+ describe "#formata_data" do
383
+ it "quando passar um valor nil" do
384
+ subject.send(:formata_data, nil).must_equal '00000000'
382
385
  end
383
- context "passando um tamanho por parâmetro" do
384
- it "deve ser 2 (CNPJ) se for menor que 14 digitos e maior que 11 com tamanho=1" do
385
- subject.documento_avalista = '1234567890123'
386
- subject.tipo_documento_avalista(1).must_equal '2'
387
- end
388
- it "deve ser 002 (CNPJ/CGC) se for igual a 14 digitos e tamanho = 3" do
389
- subject.documento_avalista = '12345678901234'
390
- subject.tipo_documento_avalista(3).must_equal '002'
391
- end
392
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos e tamanho = 2" do
393
- subject.documento_avalista = '123456789012345'
394
- subject.tipo_documento_avalista(2).must_equal '02'
395
- end
386
+ it "quando passar um valor nil mas passar outro formato para a data" do
387
+ subject.send(:formata_data, nil, "%d%m%y").must_equal '000000'
388
+ end
389
+ it "deve formatar a data com padrão ddmmyyyy" do
390
+ subject.send(:formata_data, Date.parse('30/12/2017')).must_equal '30122017'
391
+ end
392
+ it "deve formatar a data com formato passado por parametro" do
393
+ subject.send(:formata_data, Date.parse('30/12/2017'), "%d%m%y").must_equal '301217'
396
394
  end
397
395
  end
398
396
  end
@@ -1,6 +1,5 @@
1
1
  require 'test_helper'
2
2
 
3
- require 'pry'
4
3
  describe BrBoleto::Retorno::Base do
5
4
 
6
5
  subject { BrBoleto::Retorno::Base.new('') }