br_boleto 1.2.2 → 2.0.0

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