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,144 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Conta::Sicoob do
4
+ subject { FactoryGirl.build(:conta_sicoob) }
5
+
6
+ it "deve herdar de Conta::Base" do
7
+ subject.class.superclass.must_equal BrBoleto::Conta::Base
8
+ end
9
+ context "valores padrões" do
10
+ it "deve setar a carteira com '1' " do
11
+ subject.class.new.carteira.must_equal '1'
12
+ end
13
+ it "deve setar a modalidade com '01' " do
14
+ subject.class.new.modalidade.must_equal '01'
15
+ end
16
+ it "deve setar a valid_modalidade_required com true " do
17
+ subject.class.new.valid_modalidade_required.must_equal true
18
+ end
19
+ it "deve setar a valid_modalidade_length com 2 " do
20
+ subject.class.new.valid_modalidade_length.must_equal 2
21
+ end
22
+ it "deve setar a valid_agencia_length com 4 " do
23
+ subject.class.new.valid_agencia_length.must_equal 4
24
+ end
25
+ it "deve setar a valid_carteira_required com true " do
26
+ subject.class.new.valid_carteira_required.must_equal true
27
+ end
28
+ it "deve setar a valid_carteira_length com 1 " do
29
+ subject.class.new.valid_carteira_length.must_equal 1
30
+ end
31
+ it "deve setar a valid_conta_corrente_required com true " do
32
+ subject.class.new.valid_conta_corrente_required.must_equal true
33
+ end
34
+ it "deve setar a valid_conta_corrente_maximum com 8 " do
35
+ subject.class.new.valid_conta_corrente_maximum.must_equal 8
36
+ end
37
+ it "deve setar a valid_codigo_cedente_maximum com 6 " do
38
+ subject.class.new.valid_codigo_cedente_maximum.must_equal 6
39
+ end
40
+ end
41
+ describe "Validations" do
42
+ it { must validate_presence_of(:agencia) }
43
+ it { must validate_presence_of(:razao_social) }
44
+ it { must validate_presence_of(:cpf_cnpj) }
45
+ it do
46
+ subject.agencia_dv = 21
47
+ must_be_message_error(:agencia_dv, :custom_length_is, {count: 1})
48
+ end
49
+
50
+ context 'Validações padrões da modalidade' do
51
+ subject { BrBoleto::Conta::Sicoob.new }
52
+ it { must validate_presence_of(:modalidade) }
53
+ it 'Tamanho deve ser de 2' do
54
+ subject.modalidade = '1'
55
+ must_be_message_error(:modalidade, :custom_length_is, {count: 2})
56
+ end
57
+ it "valores aceitos" do
58
+ subject.modalidade = '04'
59
+ must_be_message_error(:modalidade, :custom_inclusion, {list: '01, 02, 03'})
60
+ end
61
+ end
62
+ context 'Validações padrões da carteira' do
63
+ subject { BrBoleto::Conta::Sicoob.new }
64
+ it { must validate_presence_of(:carteira) }
65
+ it 'Tamanho deve ser de 1' do
66
+ subject.carteira = '132'
67
+ must_be_message_error(:carteira, :custom_length_is, {count: 1})
68
+ end
69
+ it "valores aceitos" do
70
+ subject.carteira = '04'
71
+ must_be_message_error(:carteira, :custom_inclusion, {list: '1, 3'})
72
+ end
73
+ end
74
+ context 'Validações padrões da conta_corrente' do
75
+ subject { BrBoleto::Conta::Sicoob.new }
76
+ it { must validate_presence_of(:conta_corrente) }
77
+ it 'Tamanho deve ter o tamanho maximo de 8' do
78
+ subject.conta_corrente = '123456789'
79
+ must_be_message_error(:conta_corrente, :custom_length_maximum, {count: 8})
80
+ end
81
+ end
82
+ context 'Validações padrões da codigo_cedente' do
83
+ subject { BrBoleto::Conta::Sicoob.new }
84
+ it 'Tamanho deve ter o tamanho maximo de 6' do
85
+ subject.codigo_cedente = '1234567'
86
+ must_be_message_error(:convenio, :custom_length_maximum, {count: 6})
87
+ end
88
+ end
89
+ end
90
+
91
+ it "codigo do banco" do
92
+ subject.codigo_banco.must_equal '756'
93
+ end
94
+ it '#codigo_banco_dv' do
95
+ subject.codigo_banco_dv.must_equal '0'
96
+ end
97
+
98
+ describe "#nome_banco" do
99
+ it "valor padrão para o nome_banco" do
100
+ subject.nome_banco.must_equal 'SICOOB'
101
+ end
102
+ it "deve ser possível mudar o valor do nome do banco" do
103
+ subject.nome_banco = 'MEU'
104
+ subject.nome_banco.must_equal 'MEU'
105
+ end
106
+ end
107
+
108
+ it "#versao_layout_arquivo_cnab_240" do
109
+ subject.versao_layout_arquivo_cnab_240.must_equal '081'
110
+ end
111
+ it "#versao_layout_lote_cnab_240" do
112
+ subject.versao_layout_lote_cnab_240.must_equal '040'
113
+ end
114
+
115
+ describe '#agencia_dv' do
116
+ it "deve ser personalizavel pelo usuario" do
117
+ subject.agencia_dv = 88
118
+ subject.agencia_dv.must_equal 88
119
+ end
120
+ it "se não passar valor deve calcular automatico" do
121
+ subject.agencia = '1234'
122
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('1234').returns(stub(to_s: 5))
123
+
124
+ subject.agencia_dv.must_equal 5
125
+ end
126
+ end
127
+
128
+
129
+ describe '#conta_corrente_dv' do
130
+ it "deve ser personalizavel pelo usuario" do
131
+ subject.conta_corrente_dv = 88
132
+ subject.conta_corrente_dv.must_equal 88
133
+ end
134
+ it "se não passar valor deve calcular automatico" do
135
+ subject.conta_corrente_dv = nil
136
+ subject.conta_corrente = '6688'
137
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.expects(:new).with('00006688').returns(stub(to_s: 5))
138
+
139
+ subject.conta_corrente_dv.must_equal 5
140
+ end
141
+ end
142
+
143
+
144
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Helper::Number do
4
+ describe '#formata_valor_monetario' do
5
+ it "deve remover a pontuação do número" do
6
+ BrBoleto::Helper::Number.new(7_658.478654).formata_valor_monetario(8).must_equal '00765848'
7
+ BrBoleto::Helper::Number.new(850.2).formata_valor_monetario(13).must_equal '0000000085020'
8
+ end
9
+ it "se o numero estiver nil deve retornar zeros" do
10
+ BrBoleto::Helper::Number.new(nil).formata_valor_monetario(13).must_equal '0000000000000'
11
+ end
12
+ end
13
+
14
+ describe '#formata_valor_percentual' do
15
+ it "deve preencher com zeros a direiva ai inves da esquerda" do
16
+ BrBoleto::Helper::Number.new(2.55).formata_valor_percentual.must_equal '025500'
17
+ BrBoleto::Helper::Number.new(850.2).formata_valor_percentual(10).must_equal '8502000000'
18
+ BrBoleto::Helper::Number.new(10.47).formata_valor_percentual(5).must_equal '10470'
19
+ end
20
+ end
21
+
22
+ describe '#get_percent_by_total' do
23
+ it "deve retornar o percentual representado pelo numero a partir do valor passado por parâmetro" do
24
+ BrBoleto::Helper::Number.new(10.47).get_percent_by_total(194.87, 4).must_equal 5.3728
25
+ BrBoleto::Helper::Number.new(4.20).get_percent_by_total(325.45 ).must_equal 1.290521
26
+ BrBoleto::Helper::Number.new(0.77).get_percent_by_total(8.5, 2 ).must_equal 9.06
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,158 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Pagador do
4
+ subject { FactoryGirl.build(:pagador) }
5
+
6
+ describe "validations" do
7
+ it { must validate_presence_of(:nome) }
8
+ it { must validate_presence_of(:cpf_cnpj) }
9
+ context "validação de presença do endereço" do
10
+ context "por padrão não deve ser obrigatorio" do
11
+ it { wont validate_presence_of(:endereco) }
12
+ it { wont validate_presence_of(:bairro) }
13
+ it { wont validate_presence_of(:cep) }
14
+ it { wont validate_presence_of(:cidade) }
15
+ it { wont validate_presence_of(:uf) }
16
+ end
17
+ context "se setar o valid_endereco_required então valida a presença do endereço" do
18
+ before { subject.valid_endereco_required = true }
19
+ it { must validate_presence_of(:endereco) }
20
+ it { must validate_presence_of(:bairro) }
21
+ it { must validate_presence_of(:cep) }
22
+ it { must validate_presence_of(:cidade) }
23
+ it { must validate_presence_of(:uf) }
24
+ end
25
+
26
+ end
27
+ end
28
+
29
+ it "cep deve retornar apenas numeros" do
30
+ subject.cep = '89A885-3L69'
31
+ subject.cep.must_equal '89885369'
32
+ end
33
+
34
+ describe "#cpf_cnpj" do
35
+ it "se setar o cnpj com a pontuação deve sempre retornar apenas os numeros" do
36
+ subject.cpf_cnpj = '84.059.146/0001-00'
37
+ subject.cpf_cnpj.must_equal '84059146000100'
38
+ end
39
+ it "se setar o CPF com a pontuação deve sempre retornar apenas os numeros" do
40
+ subject.cpf_cnpj = '725.211.506-22'
41
+ subject.cpf_cnpj.must_equal '72521150622'
42
+ end
43
+ end
44
+
45
+ describe "#tipo_cpf_cnpj" do
46
+ context "#CPF retorna 01" do
47
+ it "por padrão deve retornar 01 (com 2 digitos)" do
48
+ subject.cpf_cnpj = '725.211.506-22'
49
+ subject.tipo_cpf_cnpj.must_equal '01'
50
+ end
51
+ it "posso passar a quantidade de digitos a retornar" do
52
+ subject.cpf_cnpj = '83944180313'
53
+ subject.tipo_cpf_cnpj(1).must_equal '1'
54
+ end
55
+ end
56
+ context "#CNPJ retorna 02" do
57
+ it "por padrão deve retornar 02 (com 2 digitos)" do
58
+ subject.cpf_cnpj = '84059146000100'
59
+ subject.tipo_cpf_cnpj.must_equal '02'
60
+ end
61
+ it "posso passar a quantidade de digitos a retornar" do
62
+ subject.cpf_cnpj = '32.131.445/0001-05'
63
+ subject.tipo_cpf_cnpj(1).must_equal '2'
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "#cpf_cnpj_formatado" do
69
+ it "deve retornar o cnpj com a pontuação correta" do
70
+ subject.cpf_cnpj = '84059146000100'
71
+ subject.cpf_cnpj_formatado.must_equal '84.059.146/0001-00'
72
+ end
73
+ it "deve retornar o CPF com a pontuação correta" do
74
+ subject.cpf_cnpj = '72521150622'
75
+ subject.cpf_cnpj_formatado.must_equal '725.211.506-22'
76
+ end
77
+ end
78
+
79
+ describe "#cpf_cnpj_formatado_com_label" do
80
+ it "deve retornar o cnpj com a pontuação correta e com o label CNPJ" do
81
+ subject.cpf_cnpj = '84059146000100'
82
+ subject.cpf_cnpj_formatado_com_label.must_equal 'CNPJ 84.059.146/0001-00'
83
+ end
84
+ it "deve retornar o CPF com a pontuação correta e com o label CPF" do
85
+ subject.cpf_cnpj = '72521150622'
86
+ subject.cpf_cnpj_formatado_com_label.must_equal 'CPF 725.211.506-22'
87
+ end
88
+ end
89
+
90
+ describe "Avalista" do
91
+ describe "#documento_avalista" do
92
+ it "se setar o cnpj com a pontuação deve sempre retornar apenas os numeros" do
93
+ subject.documento_avalista = '84.059.146/0001-00'
94
+ subject.documento_avalista.must_equal '84059146000100'
95
+ end
96
+ it "se setar o CPF com a pontuação deve sempre retornar apenas os numeros" do
97
+ subject.documento_avalista = '725.211.506-22'
98
+ subject.documento_avalista.must_equal '72521150622'
99
+ end
100
+ end
101
+
102
+ describe "#tipo_documento_avalista" do
103
+ context "#CPF retorna 01" do
104
+ it "por padrão deve retornar 01 (com 2 digitos)" do
105
+ subject.documento_avalista = '725.211.506-22'
106
+ subject.tipo_documento_avalista.must_equal '01'
107
+ end
108
+ it "posso passar a quantidade de digitos a retornar" do
109
+ subject.documento_avalista = '83944180313'
110
+ subject.tipo_documento_avalista(1).must_equal '1'
111
+ end
112
+ end
113
+ context "#CNPJ retorna 02" do
114
+ it "por padrão deve retornar 02 (com 2 digitos)" do
115
+ subject.documento_avalista = '84059146000100'
116
+ subject.tipo_documento_avalista.must_equal '02'
117
+ end
118
+ it "posso passar a quantidade de digitos a retornar" do
119
+ subject.documento_avalista = '32.131.445/0001-05'
120
+ subject.tipo_documento_avalista(1).must_equal '2'
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "#documento_avalista_formatado" do
126
+ it "deve retornar o cnpj com a pontuação correta" do
127
+ subject.documento_avalista = '84059146000100'
128
+ subject.documento_avalista_formatado.must_equal '84.059.146/0001-00'
129
+ end
130
+ it "deve retornar o CPF com a pontuação correta" do
131
+ subject.documento_avalista = '72521150622'
132
+ subject.documento_avalista_formatado.must_equal '725.211.506-22'
133
+ end
134
+ end
135
+
136
+ describe "#documento_avalista_formatado_com_label" do
137
+ it "deve retornar o cnpj com a pontuação correta e com o label CNPJ" do
138
+ subject.documento_avalista = '84059146000100'
139
+ subject.documento_avalista_formatado_com_label.must_equal 'CNPJ 84.059.146/0001-00'
140
+ end
141
+ it "deve retornar o CPF com a pontuação correta e com o label CPF" do
142
+ subject.documento_avalista = '72521150622'
143
+ subject.documento_avalista_formatado_com_label.must_equal 'CPF 725.211.506-22'
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#endereco_formatado' do
149
+ it "deve trazer todo o endereço se estiver completo" do
150
+ subject.assign_attributes(endereco: 'RUA 45', bairro: 'BAIRRO', cep: '89885-000', cidade: 'São Carlos', uf: 'SC')
151
+ subject.endereco_formatado.must_equal 'RUA 45 - BAIRRO - 89885-000 - São Carlos-SC'
152
+ end
153
+ it "Desconsidera os valores vazios" do
154
+ subject.assign_attributes(endereco: 'RUA 45', bairro: '', cep: '', cidade: 'São Carlos', uf: 'SC')
155
+ subject.endereco_formatado.must_equal 'RUA 45 - São Carlos-SC'
156
+ end
157
+ end
158
+ end
@@ -2,79 +2,54 @@ require 'test_helper'
2
2
 
3
3
  describe BrBoleto::Remessa::Base do
4
4
  subject { FactoryGirl.build(:remessa_base) }
5
- let(:lote) { FactoryGirl.build(:remessa_lote) }
5
+ before do
6
+ subject.stubs(:conta_class).returns BrBoleto::Conta::Sicoob
7
+ end
6
8
  describe "validations" do
7
- it { must validate_presence_of(:nome_empresa) }
8
-
9
- it { must validate_inclusion_of(:aceite).in_array(%w(a A n N)).with_message("valor deve ser A(aceito) ou N(não ceito)") }
10
- it { wont allow_value('x').for(:aceite) }
11
- it { wont allow_value('q').for(:aceite) }
9
+ it { must validate_presence_of(:sequencial_remessa) }
12
10
  end
13
11
 
14
- describe "#lotes" do
15
- it "deve haver ao menos 1 lote" do
16
- wont allow_value([]).for(:lotes).with_message("não pode estar vazio.")
17
- end
18
- it "deve ser um objeto lote" do
19
- wont allow_value(FactoryGirl.build(:boleto_sicoob)).for(:lotes).with_message("cada item deve ser um objeto Lote.")
20
- end
21
- it "deve ser válido com um lote válido" do
22
- must allow_value([lote]).for(:lotes)
23
- end
24
- it "não deve ser válido se houver algum lote inválido" do
25
- wont allow_value([FactoryGirl.build(:remessa_lote, pagamentos: [])]).for(:lotes)
26
- end
27
- it "deve ser válido se passar apenas um lote sem Array" do
28
- must allow_value(lote).for(:lotes)
29
- end
30
- it "se setar apenas 1 lote sem array deve retornar um array de 1 posicao" do
31
- subject.lotes = lote
32
- subject.lotes.size.must_equal 1
33
- subject.lotes.is_a?(Array).must_equal true
34
- subject.lotes[0].must_equal lote
35
- end
36
- it "posso setar mais que 1 lote" do
37
- lote2 = FactoryGirl.build(:remessa_lote)
38
- subject.lotes = [lote, lote2]
39
- subject.lotes.size.must_equal 2
40
- subject.lotes.is_a?(Array).must_equal true
41
- subject.lotes[0].must_equal lote
42
- subject.lotes[1].must_equal lote2
43
- end
12
+ it "deve ter incluso o module HaveConta" do
13
+ subject.class.included_modules.must_include BrBoleto::HaveConta
14
+ end
44
15
 
45
- it "posso incrementar os lotes com <<" do
46
- lote2 = FactoryGirl.build(:remessa_lote)
47
- subject.lotes = lote
48
- subject.lotes.size.must_equal 1
49
- subject.lotes << lote2
50
- subject.lotes.size.must_equal 2
51
- subject.lotes.is_a?(Array).must_equal true
52
- subject.lotes[0].must_equal lote
53
- subject.lotes[1].must_equal lote2
54
- end
16
+ it "wont be persisted?" do
17
+ subject.persisted?.must_equal false
55
18
  end
56
19
 
57
- describe "#default_values" do
58
- it "for aceite" do
59
- object = subject.class.new()
60
- object.aceite.must_equal 'N'
20
+ describe "#data_geracao" do
21
+ it "deve pegar a data com 8 posições do atributo data_hora_arquivo" do
22
+ subject.data_hora_arquivo = Time.parse("30/12/2015 01:02:03")
23
+ subject.data_geracao.must_equal "30122015"
24
+ end
25
+ it "Posso escolher o formato em que a data virá" do
26
+ subject.data_hora_arquivo = Time.parse("25/08/2017 01:02:03")
27
+ subject.data_geracao('%m%d%y').must_equal "082517"
61
28
  end
62
29
  end
63
30
 
64
- it "wont be persisted?" do
65
- subject.persisted?.must_equal false
31
+ describe "#hora_geracao" do
32
+ it "deve pegar a hora minuto e segundo da data_hora_arquivo" do
33
+ subject.data_hora_arquivo = Time.parse("30/12/2015 01:02:03")
34
+ subject.hora_geracao.must_equal "010203"
35
+ end
36
+ it "deve permitir passar o formato por parametro" do
37
+ subject.data_hora_arquivo = Time.parse("04/12/1991 03:30:51")
38
+ subject.hora_geracao('%H%M').must_equal "0330"
39
+ end
66
40
  end
67
41
 
68
- describe "#nome_empresa_formatada" do
69
- it "deve adicionar valor em branco no final se for menor que 30 caracteres" do
70
- subject.nome_empresa = '1234567890'
71
- subject.nome_empresa_formatada.size.must_equal 30
72
- subject.nome_empresa_formatada.must_equal('1234567890'.ljust(30, ' '))
73
- end
74
- it "deve retornar no maximo 30 caracteres se for maior que 30" do
75
- subject.nome_empresa = '0123456'.ljust(35, 'A')
76
- subject.nome_empresa_formatada.size.must_equal 30
77
- subject.nome_empresa_formatada.must_equal('0123456'.ljust(30, 'A'))
42
+ describe "#data_hora_arquivo" do
43
+ it "se for nil deve pegar o time now" do
44
+ subject.data_hora_arquivo = nil
45
+ now = Time.now
46
+ Time.expects(:current).returns(now)
47
+ subject.data_hora_arquivo.must_equal now
48
+ end
49
+ it "se passar um date_time deve converter para time" do
50
+ now = DateTime.now
51
+ subject.data_hora_arquivo = now
52
+ subject.data_hora_arquivo.must_equal now.to_time
78
53
  end
79
54
  end
80
55
  end
@@ -11,70 +11,93 @@ require 'br_boleto/remessa/cnab240/helper/trailer_lote_test'
11
11
  describe BrBoleto::Remessa::Cnab240::Base do
12
12
  subject { FactoryGirl.build(:remessa_cnab240_base, lotes: lote) }
13
13
  let(:pagamento) { FactoryGirl.build(:remessa_pagamento) }
14
- let(:lote) { FactoryGirl.build(:remessa_lote, pagamentos: pagamento) }
14
+ let(:lote) { FactoryGirl.build(:remessa_lote, pagamentos: pagamento) }
15
15
 
16
- context "validations" do
17
- it { must validate_presence_of(:documento_cedente) }
18
- it { must validate_presence_of(:convenio) }
16
+ before do
17
+ subject.stubs(:conta_class).returns(BrBoleto::Conta::Sicoob)
18
+ subject.stubs(:conta).returns FactoryGirl.build(:conta_sicoob)
19
+ end
19
20
 
20
- it { must validate_length_of(:codigo_carteira ).is_equal_to(1).with_message("deve ter 1 dígito.") }
21
- it { must validate_length_of(:forma_cadastramento).is_equal_to(1).with_message("deve ter 1 dígito.") }
22
- it { must validate_length_of(:emissao_boleto ).is_equal_to(1).with_message("deve ter 1 dígito.") }
23
- it { must validate_length_of(:distribuicao_boleto).is_equal_to(1).with_message("deve ter 1 dígito.") }
24
- it { must validate_length_of(:especie_titulo ).is_equal_to(2).with_message("deve ter 2 dígitos.") }
21
+ context "TESTE DAS PARTES DO ARQUIVO" do
22
+ # Em cada banco pode incluir esses modules para testar sobrescrevendo os testes específicos
23
+ include Helper::HeaderArquivoTest
24
+ include Helper::HeaderLoteTest
25
+ include Helper::SegmentoPTest
26
+ include Helper::SegmentoQTest
27
+ include Helper::SegmentoRTest
28
+ include Helper::SegmentoSTest
29
+ include Helper::TrailerArquivoTest
30
+ include Helper::TrailerLoteTest
25
31
  end
26
32
 
27
- describe "#default_values" do
28
- it "for codigo_carteira" do
29
- object = subject.class.new()
30
- object.codigo_carteira.must_equal '1'
33
+ describe "Validações personalizadas para os pagamentos dos lotes" do
34
+ it 'pagamento_valid_emissao_boleto_length' do
35
+ subject.pagamento_valid_emissao_boleto_length.must_equal 1
36
+ pagamento.emissao_boleto = '123'
37
+ pagamentos_must_be_msg_error(pagamento, :emissao_boleto, :custom_length_is, {count: 1})
31
38
  end
32
- it "for forma_cadastramento" do
33
- object = subject.class.new()
34
- object.forma_cadastramento.must_equal '1'
35
- end
36
- it "deve continuar com o default da superclass" do
37
- object = subject.class.new()
38
- object.aceite.must_equal 'N'
39
+ it 'pagamento_valid_distribuicao_boleto_length' do
40
+ subject.pagamento_valid_distribuicao_boleto_length.must_equal 1
41
+ pagamento.distribuicao_boleto = '123'
42
+ pagamentos_must_be_msg_error(pagamento, :distribuicao_boleto, :custom_length_is, {count: 1})
39
43
  end
44
+
45
+ private
46
+
47
+ def pagamentos_must_be_msg_error(pagamento, attr_validation, msg_key, options_msg={})
48
+ must_be_message_error(:base, "#{BrBoleto::Remessa::Lote.human_attribute_name(:pagamentos)} #{pagamento.nosso_numero}: #{BrBoleto::Remessa::Pagamento.human_attribute_name(attr_validation)} #{get_message(msg_key, options_msg)}")
49
+ end
40
50
  end
41
51
 
42
- describe "#tipo_inscricao" do
43
- it "se for cpf deve retornar 1" do
44
- subject.documento_cedente = '12345678901'
45
- subject.tipo_inscricao.must_equal '1'
52
+ describe "#lotes" do
53
+ it "deve haver ao menos 1 lote" do
54
+ wont allow_value([]).for(:lotes).with_message(:blank)
46
55
  end
47
- it "se for cnpj deve retornar 2" do
48
- subject.documento_cedente = '12345678901234'
49
- subject.tipo_inscricao.must_equal '2'
56
+ it "deve ser válido com um lote válido" do
57
+ must allow_value([lote]).for(:lotes)
50
58
  end
51
- end
52
-
53
- describe "#data_hora_arquivo" do
54
- it "se for nil deve pegar o time now" do
55
- subject.data_hora_arquivo = nil
56
- now = Time.now
57
- Time.stubs(:now).returns(now)
58
- subject.data_hora_arquivo.must_equal now
59
+ it "não deve ser válido se houver algum lote inválido" do
60
+ subject.lotes = [FactoryGirl.build(:remessa_lote, pagamentos: [])]
61
+ must_be_message_error(:base)
59
62
  end
60
- it "se passar um date_time deve converter para time" do
61
- now = DateTime.now
62
- subject.data_hora_arquivo = now
63
- subject.data_hora_arquivo.must_equal now.to_time
63
+ it "deve ser válido se passar apenas um lote sem Array" do
64
+ must allow_value(lote).for(:lotes)
65
+ end
66
+ it "se setar apenas 1 lote sem array deve retornar um array de 1 posicao" do
67
+ subject.lotes = lote
68
+ subject.lotes.size.must_equal 1
69
+ subject.lotes.is_a?(Array).must_equal true
70
+ subject.lotes[0].must_equal lote
71
+ end
72
+ it "posso setar mais que 1 lote" do
73
+ lote2 = FactoryGirl.build(:remessa_lote)
74
+ subject.lotes = [lote, lote2]
75
+ subject.lotes.size.must_equal 2
76
+ subject.lotes.is_a?(Array).must_equal true
77
+ subject.lotes[0].must_equal lote
78
+ subject.lotes[1].must_equal lote2
64
79
  end
65
- end
66
80
 
67
- describe "#data_geracao" do
68
- it "deve pegar a data com 8 posições do atributo data_hora_arquivo" do
69
- subject.data_hora_arquivo = Time.parse("30/12/2015 01:02:03")
70
- subject.data_geracao.must_equal "30122015"
81
+ it "posso incrementar os lotes com <<" do
82
+ lote2 = FactoryGirl.build(:remessa_lote)
83
+ subject.lotes = lote
84
+ subject.lotes.size.must_equal 1
85
+ subject.lotes << lote2
86
+ subject.lotes.size.must_equal 2
87
+ subject.lotes.is_a?(Array).must_equal true
88
+ subject.lotes[0].must_equal lote
89
+ subject.lotes[1].must_equal lote2
71
90
  end
72
- end
73
91
 
74
- describe "#hora_geracao" do
75
- it "deve pegar a hora minuto e segundo da data_hora_arquivo" do
76
- subject.data_hora_arquivo = Time.parse("30/12/2015 01:02:03")
77
- subject.hora_geracao.must_equal "010203"
92
+ it "retorna apenas objetos de Lote" do
93
+ lote2 = FactoryGirl.build(:remessa_lote)
94
+ subject.lotes << 123
95
+ subject.lotes << lote2
96
+ subject.lotes << '123'
97
+
98
+ subject.lotes.size.must_equal 2
99
+ subject.lotes.must_include lote
100
+ subject.lotes.must_include lote2
78
101
  end
79
102
  end
80
103
 
@@ -92,36 +115,12 @@ describe BrBoleto::Remessa::Cnab240::Base do
92
115
  end
93
116
  end
94
117
 
95
- it "#versao_layout_arquivo" do
96
- assert_raises NotImplementedError do
97
- subject.versao_layout_arquivo
98
- end
99
- end
100
-
101
- it "#versao_layout_lote" do
102
- assert_raises NotImplementedError do
103
- subject.versao_layout_lote
104
- end
105
- end
106
-
107
118
  it "#convenio_lote" do
108
119
  assert_raises NotImplementedError do
109
120
  subject.convenio_lote(lote)
110
121
  end
111
122
  end
112
123
 
113
- it "#nome_banco" do
114
- assert_raises NotImplementedError do
115
- subject.nome_banco
116
- end
117
- end
118
-
119
- it "#codigo_banco" do
120
- assert_raises NotImplementedError do
121
- subject.codigo_banco
122
- end
123
- end
124
-
125
124
  it "#informacoes_da_conta" do
126
125
  assert_raises NotImplementedError do
127
126
  subject.informacoes_da_conta
@@ -133,12 +132,6 @@ describe BrBoleto::Remessa::Cnab240::Base do
133
132
  subject.codigo_convenio
134
133
  end
135
134
  end
136
-
137
- it "#digito_agencia" do
138
- assert_raises NotImplementedError do
139
- subject.digito_agencia
140
- end
141
- end
142
135
  end
143
136
 
144
137
  context "#complemento_trailer_lote" do
@@ -146,21 +139,8 @@ describe BrBoleto::Remessa::Cnab240::Base do
146
139
  subject.complemento_trailer_lote(nil, nil).must_equal ''.rjust(217, ' ')
147
140
  end
148
141
  end
149
- context "TESTE DAS PARTES DO ARQUIVO" do
150
- # Em cada banco pode incluir esses modules para testar sobrescrevendo os testes específicos
151
-
152
- include Helper::HeaderArquivoTest
153
- include Helper::HeaderLoteTest
154
- include Helper::SegmentoPTest
155
- include Helper::SegmentoQTest
156
- include Helper::SegmentoRTest
157
- include Helper::SegmentoSTest
158
- include Helper::TrailerArquivoTest
159
- include Helper::TrailerLoteTest
160
- end
142
+
161
143
  context "MONTAGEM DO ARQUIVO " do
162
-
163
-
164
144
  before do
165
145
  # Stub nos metodos que devem ser sobrescritos nos bancos
166
146
  subject.stubs(:complemento_header_arquivo).returns( ''.rjust(29, ' '))
@@ -194,7 +174,7 @@ describe BrBoleto::Remessa::Cnab240::Base do
194
174
  subject.expects(:monta_lote).with(lote_2, 2).returns(["LOTE_lote_2"])
195
175
  resultado = subject.dados_do_arquivo
196
176
  resultado[10..21].must_equal "\nLOTE_LOTE_1"
197
- resultado[22..33].must_equal "\nLOTE_LOTE_2"
177
+ resultado[22..33].must_equal "\nLOTE_LOTE_2"
198
178
  end
199
179
 
200
180
  it "com 1 lote" do
@@ -401,5 +381,5 @@ describe BrBoleto::Remessa::Cnab240::Base do
401
381
  end
402
382
  end
403
383
  end
404
-
384
+
405
385
  end