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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- 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
|
-
|
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(:
|
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
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
46
|
-
|
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 "#
|
58
|
-
it "
|
59
|
-
|
60
|
-
|
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
|
-
|
65
|
-
|
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 "#
|
69
|
-
it "
|
70
|
-
subject.
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
subject.
|
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
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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 "
|
28
|
-
it
|
29
|
-
|
30
|
-
|
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
|
33
|
-
|
34
|
-
|
35
|
-
|
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 "#
|
43
|
-
it "
|
44
|
-
|
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 "
|
48
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
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
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
68
|
-
|
69
|
-
subject.
|
70
|
-
subject.
|
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
|
-
|
75
|
-
|
76
|
-
subject.
|
77
|
-
subject.
|
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
|
-
|
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
|