br_boleto 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +278 -98
  5. data/br_boleto.gemspec +5 -3
  6. data/lib/br_boleto/active_model_base.rb +1 -1
  7. data/lib/br_boleto/association/have_conta.rb +109 -0
  8. data/lib/br_boleto/association/have_pagador.rb +38 -0
  9. data/lib/br_boleto/association/have_pagamentos.rb +44 -0
  10. data/lib/br_boleto/boleto/base.rb +50 -379
  11. data/lib/br_boleto/boleto/caixa.rb +28 -143
  12. data/lib/br_boleto/boleto/sicoob.rb +24 -144
  13. data/lib/br_boleto/conta/base.rb +288 -0
  14. data/lib/br_boleto/conta/caixa.rb +109 -0
  15. data/lib/br_boleto/conta/sicoob.rb +64 -0
  16. data/lib/br_boleto/helper/default_codes.rb +33 -0
  17. data/lib/br_boleto/helper/format_value.rb +1 -0
  18. data/lib/br_boleto/helper/number.rb +30 -0
  19. data/lib/br_boleto/pagador.rb +82 -0
  20. data/lib/br_boleto/remessa/base.rb +28 -50
  21. data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
  22. data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
  23. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
  24. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
  25. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
  26. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
  27. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
  28. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
  29. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
  30. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
  31. data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
  32. data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
  33. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
  34. data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
  35. data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
  36. data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
  37. data/lib/br_boleto/remessa/lote.rb +1 -23
  38. data/lib/br_boleto/remessa/pagamento.rb +188 -51
  39. data/lib/br_boleto/retorno/base.rb +9 -0
  40. data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
  41. data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
  42. data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
  43. data/lib/br_boleto/retorno/pagamento.rb +12 -6
  44. data/lib/br_boleto/string_methods.rb +8 -2
  45. data/lib/br_boleto/validations.rb +19 -0
  46. data/lib/br_boleto/version.rb +3 -3
  47. data/lib/br_boleto.rb +38 -8
  48. data/lib/config/locales/br-boleto-en.yml +89 -0
  49. data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
  50. data/test/br_boleto/association/have_conta_test.rb +319 -0
  51. data/test/br_boleto/association/have_pagador_test.rb +110 -0
  52. data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
  53. data/test/br_boleto/boleto/base_test.rb +127 -201
  54. data/test/br_boleto/boleto/caixa_test.rb +58 -72
  55. data/test/br_boleto/boleto/sicoob_test.rb +88 -147
  56. data/test/br_boleto/conta/base_test.rb +490 -0
  57. data/test/br_boleto/conta/caixa_test.rb +154 -0
  58. data/test/br_boleto/conta/sicoob_test.rb +144 -0
  59. data/test/br_boleto/helper/number_test.rb +29 -0
  60. data/test/br_boleto/pagador_test.rb +158 -0
  61. data/test/br_boleto/remessa/base_test.rb +37 -62
  62. data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
  63. data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
  64. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
  65. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
  66. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
  67. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
  68. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
  69. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
  70. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
  71. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
  72. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
  73. data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
  74. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
  75. data/test/br_boleto/remessa/lote_test.rb +2 -41
  76. data/test/br_boleto/remessa/pagamento_test.rb +186 -188
  77. data/test/br_boleto/retorno/base_test.rb +0 -1
  78. data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
  79. data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
  80. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
  81. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
  82. data/test/br_boleto/retorno/pagamento_test.rb +6 -6
  83. data/test/factories/boleto/base.rb +9 -7
  84. data/test/factories/boleto/boleto_caixa.rb +2 -9
  85. data/test/factories/boleto/boleto_sicoob.rb +10 -8
  86. data/test/factories/conta/base.rb +10 -0
  87. data/test/factories/conta/caixa.rb +15 -0
  88. data/test/factories/conta/sicoob.rb +16 -0
  89. data/test/factories/pagador.rb +15 -0
  90. data/test/factories/remessa/base.rb +0 -6
  91. data/test/factories/remessa/cnab240/base.rb +0 -10
  92. data/test/factories/remessa/cnab240/caixa.rb +1 -6
  93. data/test/factories/remessa/cnab240/sicoob.rb +1 -10
  94. data/test/factories/remessa/cnab400/base.rb +8 -0
  95. data/test/factories/remessa/cnab400/sicoob.rb +8 -0
  96. data/test/factories/remessa/pagamento.rb +8 -7
  97. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
  98. data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
  99. data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
  100. data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
  101. data/test/inheritance/boleto_test.rb +4 -1
  102. data/test/inheritance/sicoob_test.rb +23 -7
  103. data/test/test_helper.rb +70 -0
  104. metadata +63 -6
@@ -0,0 +1,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