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,89 @@
1
+ en:
2
+ activemodel:
3
+ errors:
4
+ messages:
5
+ custom_length_maximum:
6
+ one: "must have no more than 1 digit"
7
+ other: "must have a maximum of %{count} digits"
8
+ custom_length_minimum:
9
+ one: "must be at least 1 digit"
10
+ other: "must have at least %{count} digits"
11
+ custom_length_is:
12
+ one: "must have 1 digit"
13
+ other: "must have %{count} digits"
14
+ custom_inclusion: 'must contain one of the following values: %{list}'
15
+ at_least_one: must be at least 1
16
+ attributes:
17
+ br_boleto/pagador:
18
+ nome: Name
19
+ cpf_cnpj: 'CPF/CNPJ'
20
+ endereco: Street
21
+ bairro: District
22
+ cep: Zip code
23
+ cidade: City
24
+ uf: UF
25
+ nome_avalista: Guarantor
26
+ documento_avalista: 'CPF/CNPJ Guarantor'
27
+ br_boleto/boleto/base:
28
+ data_vencimento: Validity
29
+ numero_documento: Document number
30
+ valor_documento: Document value
31
+ conta_corrente: Current account
32
+ codigo_moeda: Currency code
33
+ especie: Kind of money
34
+ especie_documento: Kind of Document
35
+ data_documento: Document date
36
+ local_pagamento: Payment place
37
+ aceite: Acceptance
38
+ instrucoes1: Message 1
39
+ instrucoes2: Message 2
40
+ instrucoes3: Message 3
41
+ instrucoes4: Message 4
42
+ instrucoes5: Message 5
43
+ instrucoes6: Message 6
44
+ parcelas: Plots
45
+ br_boleto/conta/base:
46
+ modalidade: Modality
47
+ razao_social: Company name
48
+ cpf_cnpj: CNPJ
49
+ endereco: Address
50
+ carteira: Carteira
51
+ agencia: Agency
52
+ agencia_dv: DV Agency
53
+ conta_corrente: Conta corrente
54
+ conta_corrente_dv: DV Conta corrente
55
+ convenio: Convênio
56
+ convenio_dv: Dígito do convênio
57
+ codigo_cedente: Código do cedente
58
+ codigo_cedente_dv: Dígito código cedente
59
+ nome_banco: Nome do banco
60
+ br_boleto/remessa/pagamento:
61
+ nosso_numero: Nosso número
62
+ numero_documento: Número do documento
63
+ data_vencimento: Data de vencimento
64
+ data_emissao: Data emissão
65
+ valor_documento: Valor do documento
66
+ tipo_impressao: Tipo de impressão
67
+ cod_primeira_instrucao: Cód. 1ª instrução
68
+ cod_segunda_instrucao: Cód. 2ª instrução
69
+ valor_mora: Valor mora
70
+ data_desconto: Data do desconto
71
+ valor_desconto: Valor de desconto
72
+ cod_desconto: Código de desconto
73
+ valor_iof: Valor IOF
74
+ valor_abatimento: Valor de abatimento
75
+ desconto_2_codigo: Código do 2° desconto
76
+ desconto_3_codigo: Código do 3° desconto
77
+ codigo_multa: Código da multa
78
+ valor_multa: Valor da multa
79
+ codigo_juros: Cpodigo do juros
80
+ valor_juros: Valor do juros
81
+ parcela: Parcela
82
+ tipo_emissao: Tipo de emissão
83
+ identificacao_ocorrencia: ID Ocorrência
84
+ especie_titulo: Espécie do título
85
+ aceite: Aceite
86
+ codigo_moeda: Código moeda
87
+ forma_cadastramento: Forma de cadastramento
88
+ emissao_boleto: Emissão do boleto
89
+ distribuicao_boleto: Tipo de distribuição do boleto
@@ -0,0 +1,89 @@
1
+ pt-BR:
2
+ activemodel:
3
+ errors:
4
+ messages:
5
+ custom_length_maximum:
6
+ one: "deve ter no máximo 1 dígito"
7
+ other: "deve ter no máximo %{count} dígitos"
8
+ custom_length_minimum:
9
+ one: "deve ter no mínimo 1 dígito"
10
+ other: "deve ter no mínimo %{count} dígitos"
11
+ custom_length_is:
12
+ one: "deve ter 1 dígito"
13
+ other: "deve ter %{count} dígitos"
14
+ custom_inclusion: 'deve conter um dos valores a seguir: %{list}'
15
+ at_least_one: deve ter no mínimo 1
16
+ attributes:
17
+ br_boleto/pagador:
18
+ nome: Nome
19
+ cpf_cnpj: 'CPF/CNPJ'
20
+ endereco: Rua
21
+ bairro: Bairro
22
+ cep: CEP
23
+ cidade: Cidade
24
+ uf: UF
25
+ nome_avalista: Avalista
26
+ documento_avalista: CPF/CNPJ Avalista
27
+ br_boleto/boleto/base:
28
+ data_vencimento: Vencimento
29
+ numero_documento: Número do documento
30
+ valor_documento: Valor
31
+ conta_corrente: Conta corrente
32
+ codigo_moeda: Código da moeda
33
+ especie: Espécie
34
+ especie_documento: Espécie Doc.
35
+ data_documento: Data do documento
36
+ local_pagamento: Local de pagamento
37
+ aceite: Aceite
38
+ instrucoes1: Mensagem 1
39
+ instrucoes2: Mensagem 2
40
+ instrucoes3: Mensagem 3
41
+ instrucoes4: Mensagem 4
42
+ instrucoes5: Mensagem 5
43
+ instrucoes6: Mensagem 6
44
+ parcelas: Parcelas
45
+ br_boleto/conta/base:
46
+ modalidade: Modalidade
47
+ razao_social: Razão social
48
+ cpf_cnpj: CNPJ
49
+ endereco: Endereço
50
+ carteira: Carteira
51
+ agencia: Agência
52
+ agencia_dv: DV Agência
53
+ conta_corrente: Conta corrente
54
+ conta_corrente_dv: DV Conta corrente
55
+ convenio: Convênio
56
+ convenio_dv: Dígito do convênio
57
+ codigo_cedente: Código do cedente
58
+ codigo_cedente_dv: Dígito código cedente
59
+ nome_banco: Nome do banco
60
+ br_boleto/remessa/pagamento:
61
+ nosso_numero: Nosso número
62
+ numero_documento: Número do documento
63
+ data_vencimento: Data de vencimento
64
+ data_emissao: Data emissão
65
+ valor_documento: Valor do documento
66
+ tipo_impressao: Tipo de impressão
67
+ cod_primeira_instrucao: Cód. 1ª instrução
68
+ cod_segunda_instrucao: Cód. 2ª instrução
69
+ valor_mora: Valor mora
70
+ data_desconto: Data do desconto
71
+ valor_desconto: Valor de desconto
72
+ cod_desconto: Código de desconto
73
+ valor_iof: Valor IOF
74
+ valor_abatimento: Valor de abatimento
75
+ desconto_2_codigo: Código do 2° desconto
76
+ desconto_3_codigo: Código do 3° desconto
77
+ codigo_multa: Código da multa
78
+ valor_multa: Valor da multa
79
+ codigo_juros: Cpodigo do juros
80
+ valor_juros: Valor do juros
81
+ parcela: Parcela
82
+ tipo_emissao: Tipo de emissão
83
+ identificacao_ocorrencia: ID Ocorrência
84
+ especie_titulo: Espécie do título
85
+ aceite: Aceite
86
+ codigo_moeda: Código moeda
87
+ forma_cadastramento: Forma de cadastramento
88
+ emissao_boleto: Emissão do boleto
89
+ distribuicao_boleto: Tipo de distribuição do boleto
@@ -0,0 +1,319 @@
1
+ require 'test_helper'
2
+
3
+ class HaveContaTest < BrBoleto::ActiveModelBase
4
+ include BrBoleto::HaveConta
5
+ end
6
+
7
+ describe BrBoleto::HaveConta do
8
+ subject { HaveContaTest.new(conta: {agencia_dv: 1, agencia: '1235', razao_social: 'Razao', cpf_cnpj: '12345678901'}) }
9
+
10
+ before { HaveContaTest.any_instance.stubs(:conta_class).returns(BrBoleto::Conta::Base) }
11
+
12
+ it "Sempre deve vir instanciado um objeto da classe definida em conta_class" do
13
+ subject.conta.must_be_kind_of BrBoleto::Conta::Base
14
+ end
15
+
16
+ it "se setar outro objeto que não seja da class definida em conta_class deve ignorar e instanciar a classe correta" do
17
+ HaveContaTest.any_instance.stubs(:conta_class).returns(String)
18
+ have_conta = HaveContaTest.new
19
+ have_conta.conta = 123
20
+ have_conta.conta.must_equal ''
21
+ have_conta.conta = '123'
22
+ have_conta.conta.must_equal '123'
23
+
24
+ have_conta.stubs(:conta_class).returns(Array)
25
+ have_conta.conta = '123'
26
+ have_conta.conta.must_equal []
27
+ have_conta.conta = [123]
28
+ have_conta.conta.must_equal [123]
29
+ end
30
+
31
+ it "Deve ser possivel inicializar o objeto passando a conta como bloco" do
32
+ result = HaveContaTest.new do |hav|
33
+ hav.conta do |co|
34
+ co.razao_social = 'Empresa banco'
35
+ co.cpf_cnpj = '074.554.663-87'
36
+ co.agencia = '6695'
37
+ end
38
+ end
39
+ result.conta.razao_social.must_equal 'Empresa banco'
40
+ result.conta.cpf_cnpj.must_equal '07455466387'
41
+ result.conta.agencia.must_equal '6695'
42
+ end
43
+
44
+ it "Deve ser possivel editar a conta com um bloco" do
45
+ subject.conta.razao_social = 'razao_1'
46
+ subject.conta do |co|
47
+ co.razao_social = 'razao_2'
48
+ co.agencia = '0456'
49
+ end
50
+ subject.conta.razao_social.must_equal 'razao_2'
51
+ subject.conta.agencia.must_equal '0456'
52
+ end
53
+
54
+ it "Deve ser possivel inicializar o objeto passando a conta como hash" do
55
+ result = HaveContaTest.new({
56
+ conta: {
57
+ razao_social: 'Empresa banco',
58
+ cpf_cnpj: '074.554.663-87',
59
+ agencia: '3456',
60
+ }
61
+ })
62
+ result.conta.razao_social.must_equal 'Empresa banco'
63
+ result.conta.cpf_cnpj.must_equal '07455466387'
64
+ result.conta.agencia.must_equal '3456'
65
+ end
66
+
67
+ it "Deve ser possivel editar a conta com um hash" do
68
+ subject.conta.cpf_cnpj = '12345678901'
69
+ subject.conta.razao_social = 'razao_1'
70
+ subject.conta = {
71
+ razao_social: 'razao_2',
72
+ agencia: '1234',
73
+ }
74
+ subject.conta.razao_social.must_equal 'razao_2'
75
+ subject.conta.agencia.must_equal '1234'
76
+ subject.conta.cpf_cnpj.must_equal '12345678901'
77
+ end
78
+
79
+ it "#conta_class deve ser implementada nas subclasses" do
80
+ HaveContaTest.any_instance.unstub(:conta_class)
81
+ assert_raises NotImplementedError do
82
+ subject.conta_class
83
+ end
84
+ end
85
+
86
+ it "por padrão nao deve validar nada" do
87
+ wont_be_message_error(:base)
88
+ end
89
+
90
+ it 'Validação para conta_corrente' do
91
+ subject.stubs(:valid_conta_corrente_length).returns (5)
92
+ subject.stubs(:valid_conta_corrente_minimum).returns (5)
93
+ subject.stubs(:valid_conta_corrente_maximum).returns (5)
94
+ subject.stubs(:valid_conta_corrente_required).returns(true)
95
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:blank, {})}")
96
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_is, {count: 5}) }")
97
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_minimum, {count: 5}) }")
98
+ subject.conta.conta_corrente = '123456'
99
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_maximum, {count: 5}) }")
100
+ end
101
+
102
+ it 'Validação para modalidade' do
103
+ subject.stubs(:valid_modalidade_length).returns (5)
104
+ subject.stubs(:valid_modalidade_minimum).returns (5)
105
+ subject.stubs(:valid_modalidade_maximum).returns (5)
106
+ subject.stubs(:valid_modalidade_required).returns (true)
107
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:blank, {})}")
108
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_is, {count: 5}) }")
109
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_minimum, {count: 5}) }")
110
+ subject.conta.modalidade = '123456'
111
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_maximum, {count: 5}) }")
112
+
113
+ subject.stubs(:valid_modalidade_inclusion).returns(['50','60'])
114
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_inclusion, {list: '50, 60'}) }")
115
+
116
+ end
117
+
118
+ it 'Validação para codigo_cedente (convênio)' do
119
+ subject.stubs(:valid_codigo_cedente_length).returns (5)
120
+ subject.stubs(:valid_codigo_cedente_minimum).returns (5)
121
+ subject.stubs(:valid_codigo_cedente_maximum).returns (5)
122
+ subject.stubs(:valid_codigo_cedente_required).returns(true)
123
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:blank, {})}")
124
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_is, {count: 5}) }")
125
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_minimum, {count: 5}) }")
126
+ subject.conta.codigo_cedente = '123456'
127
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_maximum, {count: 5}) }")
128
+ end
129
+
130
+ it 'Validação para endereco' do
131
+ subject.stubs(:valid_endereco_required).returns(true)
132
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:endereco)} #{get_message(:blank, {})}")
133
+ end
134
+
135
+ it 'Validação para carteira' do
136
+ subject.stubs(:valid_carteira_length).returns (5)
137
+ subject.stubs(:valid_carteira_minimum).returns (5)
138
+ subject.stubs(:valid_carteira_maximum).returns (5)
139
+ subject.stubs(:valid_carteira_required).returns (true)
140
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:blank, {})}")
141
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_is, {count: 5}) }")
142
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_minimum, {count: 5}) }")
143
+ subject.conta.carteira = '123456'
144
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_maximum, {count: 5}) }")
145
+
146
+ subject.stubs(:valid_carteira_inclusion).returns(['50','60'])
147
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_inclusion, {list: '50, 60'}) }")
148
+ end
149
+
150
+ it 'Validação para convenio' do
151
+ subject.stubs(:valid_convenio_length).returns (5)
152
+ subject.stubs(:valid_convenio_minimum).returns (5)
153
+ subject.stubs(:valid_convenio_maximum).returns (5)
154
+ subject.stubs(:valid_convenio_required).returns (true)
155
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:blank, {})}")
156
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_is, {count: 5}) }")
157
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_minimum, {count: 5}) }")
158
+ subject.conta.convenio = '123456'
159
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_maximum, {count: 5}) }")
160
+
161
+ subject.stubs(:valid_convenio_inclusion).returns(['50','60'])
162
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_inclusion, {list: '50, 60'}) }")
163
+ end
164
+
165
+
166
+ context "o valor setado nas validações devem obedecer a classe que inclui a conta. Mesmo que a conta tenha uma validação diferente" do
167
+ before do
168
+ subject.conta.valid_conta_corrente_length = 2
169
+ subject.conta.valid_conta_corrente_minimum = 3
170
+ subject.conta.valid_conta_corrente_maximum = 4
171
+ subject.conta.valid_conta_corrente_required = false
172
+ subject.conta.valid_modalidade_length = 6
173
+ subject.conta.valid_modalidade_minimum = 7
174
+ subject.conta.valid_modalidade_maximum = 8
175
+ subject.conta.valid_modalidade_required = true
176
+ subject.conta.valid_endereco_required = false
177
+ subject.conta.valid_carteira_length = 15
178
+ subject.conta.valid_carteira_minimum = 16
179
+ subject.conta.valid_carteira_maximum = 17
180
+ subject.conta.valid_carteira_required = false
181
+ subject.conta.valid_convenio_length = 19
182
+ subject.conta.valid_convenio_minimum = 20
183
+ subject.conta.valid_convenio_maximum = 21
184
+ subject.conta.valid_convenio_required = false
185
+
186
+ subject.conta.valid_modalidade_inclusion = ['10','20']
187
+ subject.conta.valid_carteira_inclusion = ['10','20']
188
+ subject.conta.valid_convenio_inclusion = ['10','20']
189
+ end
190
+
191
+ context "Se os metodos do objeto que temm a conta tiverem valor nos seus metodos deve permanecer esses valores" do
192
+ it '#conta_corrente' do
193
+ subject.stubs(:valid_conta_corrente_length).returns (13)
194
+ subject.stubs(:valid_conta_corrente_minimum).returns (14)
195
+ subject.stubs(:valid_conta_corrente_maximum).returns (15)
196
+ subject.stubs(:valid_conta_corrente_required).returns(true)
197
+
198
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:blank, {})}")
199
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_is, {count: 13}) }")
200
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_minimum, {count: 14}) }")
201
+ subject.conta.conta_corrente = '1'.rjust(16, '0')
202
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_maximum, {count: 15}) }")
203
+ end
204
+ it '#modalidade' do
205
+ subject.stubs(:valid_modalidade_length).returns (16)
206
+ subject.stubs(:valid_modalidade_minimum).returns (17)
207
+ subject.stubs(:valid_modalidade_maximum).returns (18)
208
+ subject.stubs(:valid_modalidade_required).returns (false)
209
+ subject.stubs(:valid_modalidade_inclusion).returns ['30','40']
210
+
211
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:blank, {})}")
212
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_is, {count: 16}) }")
213
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_minimum, {count: 17}) }")
214
+ subject.conta.modalidade = '1'.rjust(19, '0')
215
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_maximum, {count: 18}) }")
216
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_inclusion, {list: '30, 40'}) }")
217
+ end
218
+ it '#codigo_cedente (convênio)' do
219
+ subject.stubs(:valid_codigo_cedente_length).returns (19)
220
+ subject.stubs(:valid_codigo_cedente_minimum).returns (20)
221
+ subject.stubs(:valid_codigo_cedente_maximum).returns (21)
222
+ subject.stubs(:valid_codigo_cedente_required).returns(false)
223
+
224
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:blank, {})}")
225
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_is, {count: 19}) }")
226
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_minimum, {count: 20}) }")
227
+ subject.conta.codigo_cedente = '1'.rjust(22, '0')
228
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_maximum, {count: 21}) }")
229
+ end
230
+ it '#endereco' do
231
+ subject.stubs(:valid_endereco_required).returns(true)
232
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:endereco)} #{get_message(:blank, {})}")
233
+ end
234
+ it '#carteira' do
235
+ subject.stubs(:valid_carteira_length).returns (22)
236
+ subject.stubs(:valid_carteira_minimum).returns (23)
237
+ subject.stubs(:valid_carteira_maximum).returns (24)
238
+ subject.stubs(:valid_carteira_required).returns (true)
239
+ subject.stubs(:valid_carteira_inclusion).returns ['30','40']
240
+
241
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:blank, {})}")
242
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_is, {count: 22}) }")
243
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_minimum, {count: 23}) }")
244
+ subject.conta.carteira = '1'.rjust(25, '0')
245
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_maximum, {count: 24}) }")
246
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_inclusion, {list: '30, 40'}) }")
247
+ end
248
+ it '#convenio' do
249
+ subject.stubs(:valid_convenio_length).returns (25)
250
+ subject.stubs(:valid_convenio_minimum).returns (26)
251
+ subject.stubs(:valid_convenio_maximum).returns (27)
252
+ subject.stubs(:valid_convenio_required).returns (true)
253
+ subject.stubs(:valid_convenio_inclusion).returns ['30','40']
254
+
255
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:blank, {})}")
256
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_is, {count: 25}) }")
257
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_minimum, {count: 26}) }")
258
+ subject.conta.convenio = '1'.rjust(28, '0')
259
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_maximum, {count: 27}) }")
260
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_inclusion, {list: '30, 40'}) }")
261
+ end
262
+ end
263
+
264
+ context "Deve considerar as validações setadas na conta se não houver os metodos sobrescritos no objeto que tem a conta" do
265
+ it '#conta_corrente' do
266
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:blank, {})}")
267
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_is, {count: 2}) }")
268
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_minimum, {count: 3}) }")
269
+ subject.conta.conta_corrente = '1'.rjust(16, '0')
270
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:conta_corrente)} #{get_message(:custom_length_maximum, {count: 4}) }")
271
+ end
272
+
273
+ it '#modalidade' do
274
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:blank, {})}")
275
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_is, {count: 6}) }")
276
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_minimum, {count: 7}) }")
277
+ subject.conta.modalidade = '1'.rjust(19, '0')
278
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_length_maximum, {count: 8}) }")
279
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:modalidade)} #{get_message(:custom_inclusion, {list: '10, 20'}) }")
280
+ end
281
+
282
+ it '#codigo_cedente (convenio)' do
283
+ subject.conta.valid_codigo_cedente_length = 10
284
+ subject.conta.valid_codigo_cedente_minimum = 11
285
+ subject.conta.valid_codigo_cedente_maximum = 12
286
+ subject.conta.valid_codigo_cedente_required = true
287
+
288
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:blank, {})}")
289
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_is, {count: 10}) }")
290
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_minimum, {count: 11}) }")
291
+ subject.conta.codigo_cedente = '1'.rjust(22, '0')
292
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_maximum, {count: 12}) }")
293
+ end
294
+
295
+ it '#endereco' do
296
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:endereco)} #{get_message(:blank, {})}")
297
+ end
298
+
299
+ it '#carteira' do
300
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:blank, {})}")
301
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_is, {count: 15}) }")
302
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_minimum, {count: 16}) }")
303
+ subject.conta.carteira = '1'.rjust(25, '0')
304
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_length_maximum, {count: 17}) }")
305
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:carteira)} #{get_message(:custom_inclusion, {list: '10, 20'}) }")
306
+ end
307
+
308
+ it '#convenio' do
309
+ wont_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:blank, {})}")
310
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_is, {count: 19}) }")
311
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_minimum, {count: 20}) }")
312
+ subject.conta.convenio = '1'.rjust(28, '0')
313
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_length_maximum, {count: 21}) }")
314
+ must_be_message_error(:base, "#{BrBoleto::Conta::Base.human_attribute_name(:convenio)} #{get_message(:custom_inclusion, {list: '10, 20'}) }")
315
+ end
316
+
317
+ end
318
+ end
319
+ end
@@ -0,0 +1,110 @@
1
+ require 'test_helper'
2
+
3
+ class HavePagadorTest < BrBoleto::ActiveModelBase
4
+ include BrBoleto::HavePagador
5
+ end
6
+
7
+ describe BrBoleto::HavePagador do
8
+ subject { HavePagadorTest.new(pagador: {nome: 'Razão social', cpf_cnpj: '12345678901'}) }
9
+
10
+ it "por padrão nao deve validar nada" do
11
+ wont_be_message_error(:base)
12
+ end
13
+
14
+ it "Sempre deve vir instanciado um objeto da classe definida em pagador_class" do
15
+ subject.pagador.must_be_kind_of BrBoleto::Pagador
16
+ end
17
+
18
+ it "se setar outro objeto que não seja da class definida em pagador_class deve ignorar e instanciar a classe correta" do
19
+ HavePagadorTest.any_instance.stubs(:pagador_class).returns(String)
20
+ have_pag = HavePagadorTest.new
21
+ have_pag.pagador = 123
22
+ have_pag.pagador.must_equal ''
23
+ have_pag.pagador = '123'
24
+ have_pag.pagador.must_equal '123'
25
+
26
+ have_pag.stubs(:pagador_class).returns(Array)
27
+ have_pag.pagador = '123'
28
+ have_pag.pagador.must_equal []
29
+ have_pag.pagador = [123]
30
+ have_pag.pagador.must_equal [123]
31
+ end
32
+
33
+ it "Deve ser possivel inicializar o objeto passando a pagador como bloco" do
34
+ result = HavePagadorTest.new do |hav|
35
+ hav.pagador do |co|
36
+ co.nome = 'Empresa banco'
37
+ co.cpf_cnpj = '074.554.663-87'
38
+ end
39
+ end
40
+ result.pagador.nome.must_equal 'Empresa banco'
41
+ result.pagador.cpf_cnpj.must_equal '07455466387'
42
+ end
43
+
44
+ it "Deve ser possivel editar a pagador com um bloco" do
45
+ subject.pagador.nome = 'razao_1'
46
+ subject.pagador do |co|
47
+ co.nome = 'razao_2'
48
+ co.cep = '456'
49
+ end
50
+ subject.pagador.nome.must_equal 'razao_2'
51
+ subject.pagador.cep.must_equal '456'
52
+ end
53
+
54
+ it "Deve ser possivel inicializar o objeto passando a pagador como hash" do
55
+ result = HavePagadorTest.new({
56
+ pagador: {
57
+ nome: 'Empresa banco',
58
+ cpf_cnpj: '074.554.663-87',
59
+ endereco: '456',
60
+ }
61
+ })
62
+ result.pagador.nome.must_equal 'Empresa banco'
63
+ result.pagador.cpf_cnpj.must_equal '07455466387'
64
+ result.pagador.endereco.must_equal '456'
65
+ end
66
+
67
+ it "Deve ser possivel editar a pagador com um hash" do
68
+ subject.pagador.cpf_cnpj = '12345678901'
69
+ subject.pagador.nome = 'razao_1'
70
+ subject.pagador = {
71
+ nome: 'razao_2',
72
+ endereco: '456',
73
+ }
74
+ subject.pagador.nome.must_equal 'razao_2'
75
+ subject.pagador.endereco.must_equal '456'
76
+ subject.pagador.cpf_cnpj.must_equal '12345678901'
77
+ end
78
+
79
+ it 'Validação para endereco' do
80
+ subject.stubs(:valid_endereco_required).returns(true)
81
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:endereco)} #{get_message(:blank, {})}")
82
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:bairro)} #{get_message(:blank, {})}")
83
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:cep)} #{get_message(:blank, {})}")
84
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:cidade)} #{get_message(:blank, {})}")
85
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:uf)} #{get_message(:blank, {})}")
86
+ end
87
+
88
+ context "o valor setado nas validações devem obedecer a classe que inclui a pagador. Mesmo que a pagador tenha uma validação diferente" do
89
+ before do
90
+ subject.pagador.valid_endereco_required = true
91
+ end
92
+
93
+ it "Se os metodos do objeto que temm a pagador tiverem valor nos seus metodos deve permanecer esses valores" do
94
+ subject.stubs(:valid_endereco_required).returns(false)
95
+ wont_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:endereco)} #{get_message(:blank, {})}")
96
+ wont_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:bairro)} #{get_message(:blank, {})}")
97
+ wont_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:cep)} #{get_message(:blank, {})}")
98
+ wont_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:cidade)} #{get_message(:blank, {})}")
99
+ wont_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:uf)} #{get_message(:blank, {})}")
100
+ end
101
+
102
+ it "Deve considerar as validações setadas na pagador se não houver os metodos sobrescritos no objeto que tem a pagador" do
103
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:endereco)} #{get_message(:blank, {})}")
104
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:bairro)} #{get_message(:blank, {})}")
105
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:cep)} #{get_message(:blank, {})}")
106
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:cidade)} #{get_message(:blank, {})}")
107
+ must_be_message_error(:base, "#{BrBoleto::Pagador.human_attribute_name(:uf)} #{get_message(:blank, {})}")
108
+ end
109
+ end
110
+ end