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