cieloz 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +170 -0
- data/Rakefile +16 -0
- data/cieloz.gemspec +34 -0
- data/config/locales/en.yml +11 -0
- data/config/locales/pt-BR.yml +11 -0
- data/lib/cieloz/bandeiras.rb +22 -0
- data/lib/cieloz/builder.rb +71 -0
- data/lib/cieloz/configuracao.rb +64 -0
- data/lib/cieloz/helpers.rb +35 -0
- data/lib/cieloz/homologacao.rb +16 -0
- data/lib/cieloz/requisicao/dados_ec.rb +14 -0
- data/lib/cieloz/requisicao/resposta/erro.rb +11 -0
- data/lib/cieloz/requisicao/resposta/transacao.rb +11 -0
- data/lib/cieloz/requisicao/resposta.rb +35 -0
- data/lib/cieloz/requisicao.rb +69 -0
- data/lib/cieloz/requisicao_tid.rb +23 -0
- data/lib/cieloz/requisicao_transacao/dados_pedido.rb +32 -0
- data/lib/cieloz/requisicao_transacao/dados_portador.rb +79 -0
- data/lib/cieloz/requisicao_transacao/forma_pagamento.rb +94 -0
- data/lib/cieloz/requisicao_transacao.rb +126 -0
- data/lib/cieloz/version.rb +3 -0
- data/lib/cieloz.rb +24 -0
- data/readme/cielo_developer_guide_2.0.3.pdf +0 -0
- data/readme/cielo_guia_seguranca_ecommerce.pdf +0 -0
- data/readme/cielo_payment_states.png +0 -0
- data/readme/contrato_de_afiliacao_ao_sistema_cielo.pdf +0 -0
- data/readme/credentials.png +0 -0
- data/readme/dicas_preventivas_para_vendas_mais_seguras.pdf +0 -0
- data/readme/email_cielo.pdf +0 -0
- data/readme/lista_de_documentos_necessarios_para_afiliacao_de_vendas_pela_internet_pessoa_juridica.pdf +0 -0
- data/readme/mastercard_securecodedemo.swf +0 -0
- data/readme/supported_products.png +0 -0
- data/readme/termo_de_adesao_de_risco.pdf +0 -0
- data/readme/verified_by_visa.png +0 -0
- data/test/integration/integration_test.rb +104 -0
- data/test/minitest_helper.rb +65 -0
- data/test/unit/bandeiras_operacoes_test.rb +25 -0
- data/test/unit/builder_test.rb +212 -0
- data/test/unit/configuracao_test.rb +85 -0
- data/test/unit/requisicao_autorizacao_tid_test.rb +19 -0
- data/test/unit/requisicao_cancelamento_test.rb +25 -0
- data/test/unit/requisicao_captura_test.rb +25 -0
- data/test/unit/requisicao_consulta_test.rb +19 -0
- data/test/unit/requisicao_test.rb +84 -0
- data/test/unit/requisicao_transacao_test.rb +82 -0
- data/test/unit/validations_test.rb +358 -0
- data/test/unit/xml/dados-ec.xml +4 -0
- data/test/unit/xml/dados-pagamento.xml +5 -0
- data/test/unit/xml/dados-pedido.xml +9 -0
- data/test/unit/xml/dados-portador.xml +7 -0
- data/test/unit/xml/dados-simple_attrs.xml +4 -0
- data/test/unit/xml/erro.xml +5 -0
- data/test/unit/xml/transacao.xml +19 -0
- metadata +280 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
class Cieloz::RequisicaoTransacao
|
2
|
+
class DadosPedido
|
3
|
+
include Cieloz::Helpers
|
4
|
+
|
5
|
+
IDIOMAS = [ "PT", "EN", "ES" ] # portugues, ingles, espanhol
|
6
|
+
|
7
|
+
attr_accessor :numero, :valor, :moeda, :data_hora, :descricao, :idioma, :soft_descriptor
|
8
|
+
|
9
|
+
validates :numero, :valor, :moeda, :data_hora, presence: true
|
10
|
+
|
11
|
+
validates :numero, length: { in: 1..20 }
|
12
|
+
|
13
|
+
validates :valor, length: { in: 1..12 }
|
14
|
+
validates :valor, numericality: { only_integer: true }
|
15
|
+
|
16
|
+
validates :descricao, length: { in: 0..1024 }
|
17
|
+
validates :idioma, inclusion: { in: IDIOMAS }
|
18
|
+
validates :soft_descriptor, length: { in: 0..13 }
|
19
|
+
|
20
|
+
def attributes
|
21
|
+
{
|
22
|
+
numero: @numero,
|
23
|
+
valor: @valor,
|
24
|
+
moeda: @moeda,
|
25
|
+
data_hora: @data_hora.strftime("%Y-%m-%dT%H:%M:%S"),
|
26
|
+
descricao: @descricao,
|
27
|
+
idioma: @idioma,
|
28
|
+
soft_descriptor: @soft_descriptor
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
class Cieloz::RequisicaoTransacao
|
2
|
+
class DadosPortador
|
3
|
+
INDICADOR_NAO_INFORMADO = 0
|
4
|
+
INDICADOR_INFORMADO = 1
|
5
|
+
INDICADOR_ILEGIVEL = 2
|
6
|
+
INDICADOR_INEXISTENTE = 9
|
7
|
+
|
8
|
+
include Cieloz::Helpers
|
9
|
+
|
10
|
+
attr_accessor :numero, :nome_portador, :validade
|
11
|
+
attr_reader :indicador, :codigo_seguranca
|
12
|
+
|
13
|
+
validates :nome_portador, length: { in: 0..50 }
|
14
|
+
|
15
|
+
validates :numero, :validade, :indicador, presence: true
|
16
|
+
|
17
|
+
validates :numero, length: { is: 16 }
|
18
|
+
validates :numero, numericality: { only_integer: true }
|
19
|
+
|
20
|
+
validates :validade, length: { is: 6 }
|
21
|
+
validates :validade, format: { with: /2\d{3}(0[1-9]|1[012])/ }
|
22
|
+
validates :validade, numericality: { only_integer: true }
|
23
|
+
|
24
|
+
validates :codigo_seguranca, length: { in: 3..4 }
|
25
|
+
validates :codigo_seguranca, numericality: { only_integer: true }
|
26
|
+
|
27
|
+
def initialize attrs={}
|
28
|
+
super
|
29
|
+
indicador_nao_informado!
|
30
|
+
end
|
31
|
+
|
32
|
+
def codigo_seguranca= codigo
|
33
|
+
@indicador = INDICADOR_INFORMADO
|
34
|
+
@codigo_seguranca = codigo
|
35
|
+
end
|
36
|
+
|
37
|
+
def indicador_nao_informado!
|
38
|
+
@indicador = INDICADOR_NAO_INFORMADO
|
39
|
+
@codigo_seguranca = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def indicador_ilegivel!
|
43
|
+
@indicador = INDICADOR_ILEGIVEL
|
44
|
+
@codigo_seguranca = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def indicador_inexistente!
|
48
|
+
@indicador = INDICADOR_INEXISTENTE
|
49
|
+
@codigo_seguranca = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def attributes
|
53
|
+
{
|
54
|
+
numero: @numero,
|
55
|
+
validade: @validade,
|
56
|
+
indicador: indicador,
|
57
|
+
codigo_seguranca: @codigo_seguranca,
|
58
|
+
nome_portador: @nome_portador
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
module TEST
|
63
|
+
VISA = DadosPortador.new numero: 4012001037141112
|
64
|
+
MACSTERCARD = DadosPortador.new numero: 5453010000066167
|
65
|
+
VISA_NO_AUTH = DadosPortador.new numero: 4012001038443335
|
66
|
+
MASTERCARD_NO_AUTH = DadosPortador.new numero: 5453010000066167
|
67
|
+
AMEX = DadosPortador.new numero: 376449047333005
|
68
|
+
ELO = DadosPortador.new numero: 6362970000457013
|
69
|
+
DINERS = DadosPortador.new numero: 36490102462661
|
70
|
+
DISCOVERY = DadosPortador.new numero: 6011020000245045
|
71
|
+
|
72
|
+
constants.each { |c|
|
73
|
+
flag = const_get c
|
74
|
+
flag.validade = 201805
|
75
|
+
flag.codigo_seguranca = 123
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class Cieloz::RequisicaoTransacao
|
2
|
+
class FormaPagamento
|
3
|
+
DEBITO = "A"
|
4
|
+
CREDITO = 1
|
5
|
+
PARCELADO_LOJA = 2
|
6
|
+
PARCELADO_ADM = 3
|
7
|
+
|
8
|
+
BANDEIRAS_DEBITO = [ Cieloz::Bandeiras::VISA, Cieloz::Bandeiras::MASTERCARD ]
|
9
|
+
SUPORTAM_AUTENTICACAO = BANDEIRAS_DEBITO
|
10
|
+
|
11
|
+
BANDEIRAS_PARCELAMENTO = Cieloz::Bandeiras::ALL - [Cieloz::Bandeiras::DISCOVER]
|
12
|
+
|
13
|
+
include Cieloz::Helpers
|
14
|
+
|
15
|
+
attr_reader :bandeira, :produto, :parcelas
|
16
|
+
|
17
|
+
validates :bandeira, :produto, :parcelas, presence: true
|
18
|
+
|
19
|
+
validates :parcelas, numericality: {
|
20
|
+
only_integer: true, greater_than: 0,
|
21
|
+
less_than_or_equal_to: Cieloz::Configuracao.max_parcelas
|
22
|
+
}, if: "produto == PARCELADO_LOJA"
|
23
|
+
|
24
|
+
validates :parcelas, numericality: {
|
25
|
+
only_integer: true,
|
26
|
+
greater_than: Cieloz::Configuracao.max_parcelas,
|
27
|
+
less_than_or_equal_to: Cieloz::Configuracao.max_adm_parcelas
|
28
|
+
}, if: "produto == PARCELADO_ADM"
|
29
|
+
|
30
|
+
validates :bandeira, inclusion: { in: BANDEIRAS_DEBITO }, if: "@produto == DEBITO"
|
31
|
+
validates :bandeira, inclusion: { in: Cieloz::Bandeiras::ALL }, if: "@produto == CREDITO"
|
32
|
+
validates :bandeira, inclusion: { in: BANDEIRAS_PARCELAMENTO },
|
33
|
+
if: "[ PARCELADO_LOJA, PARCELADO_ADM ].include? @produto"
|
34
|
+
|
35
|
+
def attributes
|
36
|
+
{
|
37
|
+
bandeira: @bandeira,
|
38
|
+
produto: @produto,
|
39
|
+
parcelas: @parcelas
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def suporta_autenticacao?
|
44
|
+
SUPORTAM_AUTENTICACAO.include? @bandeira
|
45
|
+
end
|
46
|
+
|
47
|
+
def debito bandeira
|
48
|
+
set_attrs bandeira, DEBITO, 1
|
49
|
+
end
|
50
|
+
|
51
|
+
def debito?
|
52
|
+
@produto == DEBITO
|
53
|
+
end
|
54
|
+
|
55
|
+
def credito bandeira
|
56
|
+
set_attrs bandeira, CREDITO, 1
|
57
|
+
end
|
58
|
+
|
59
|
+
def parcelado bandeira, parcelas
|
60
|
+
max, max_adm = Cieloz::Configuracao.max_parcelas, Cieloz::Configuracao.max_adm_parcelas
|
61
|
+
produto = case parcelas
|
62
|
+
when (1..max) then PARCELADO_LOJA
|
63
|
+
when (max+1..max_adm) then PARCELADO_ADM
|
64
|
+
end
|
65
|
+
parcelar bandeira, parcelas, produto
|
66
|
+
end
|
67
|
+
|
68
|
+
# Utility methods that deduces what authorization method should be performed
|
69
|
+
def operacao opr, parcelas
|
70
|
+
bandeira, @metodo_autorizacao = Cieloz::Bandeiras.operacao opr
|
71
|
+
parcelado bandeira, parcelas
|
72
|
+
end
|
73
|
+
|
74
|
+
def metodo_autorizacao
|
75
|
+
@metodo_autorizacao || :autorizacao_direta
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
def set_attrs bandeira, produto, parcelas
|
80
|
+
@bandeira = bandeira
|
81
|
+
@produto = produto
|
82
|
+
@parcelas = parcelas
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
def parcelar bandeira, parcelas, produto
|
87
|
+
if parcelas == 1
|
88
|
+
credito bandeira
|
89
|
+
else
|
90
|
+
set_attrs bandeira, produto, parcelas
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
class Cieloz::RequisicaoTransacao < Cieloz::Requisicao
|
2
|
+
SOMENTE_AUTENTICAR = 0
|
3
|
+
AUTORIZAR_SE_AUTENTICADA = 1
|
4
|
+
AUTORIZAR_NAO_AUTENTICADA = 2
|
5
|
+
AUTORIZACAO_DIRETA = 3
|
6
|
+
RECORRENTE = 4
|
7
|
+
|
8
|
+
hattr_writer :dados_portador, :dados_pedido, :forma_pagamento
|
9
|
+
attr_reader :dados_portador, :dados_pedido, :forma_pagamento
|
10
|
+
attr_reader :autorizar, :capturar
|
11
|
+
attr_accessor :campo_livre, :url_retorno
|
12
|
+
|
13
|
+
validate :nested_validations
|
14
|
+
|
15
|
+
validates :dados_portador, presence: true, if: "Cieloz::Configuracao.store_mode?"
|
16
|
+
validates :dados_pedido, :forma_pagamento, presence: true
|
17
|
+
|
18
|
+
with_options unless: "@forma_pagamento.nil?" do |txn|
|
19
|
+
txn.validate :suporta_autorizacao_direta?
|
20
|
+
txn.validate :suporta_autenticacao?
|
21
|
+
end
|
22
|
+
|
23
|
+
validate :parcela_minima?,
|
24
|
+
if: "not @dados_pedido.nil? and not @forma_pagamento.nil?"
|
25
|
+
|
26
|
+
validates :autorizar, presence: true, inclusion: {
|
27
|
+
in: [
|
28
|
+
SOMENTE_AUTENTICAR, AUTORIZAR_SE_AUTENTICADA,
|
29
|
+
AUTORIZAR_NAO_AUTENTICADA, AUTORIZACAO_DIRETA, RECORRENTE
|
30
|
+
]
|
31
|
+
}
|
32
|
+
# validates string values because false.blank? is true, failing presence validation
|
33
|
+
validates :capturar, presence: true, inclusion: { in: ["true", "false"] }
|
34
|
+
|
35
|
+
with_options if: "@autorizar != AUTORIZACAO_DIRETA" do |txn|
|
36
|
+
txn.validates :url_retorno, presence: true
|
37
|
+
txn.validates :url_retorno, length: { in: 1..1024 }
|
38
|
+
end
|
39
|
+
|
40
|
+
validates :campo_livre, length: { maximum: 128 }
|
41
|
+
|
42
|
+
def nested_validations
|
43
|
+
nested_attrs = [ :dados_ec, :dados_pedido, :forma_pagamento ]
|
44
|
+
nested_attrs << :dados_portador if Cieloz::Configuracao.store_mode?
|
45
|
+
|
46
|
+
nested_attrs.each { |attr|
|
47
|
+
attr_value = instance_variable_get "@#{attr}"
|
48
|
+
if not attr_value.nil? and not attr_value.valid?
|
49
|
+
errors.add attr, attr_value.errors
|
50
|
+
end
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def parcela_minima?
|
55
|
+
if @dados_pedido.valid? and @forma_pagamento.valid?
|
56
|
+
if @dados_pedido.valor / @forma_pagamento.parcelas < 500
|
57
|
+
errors.add :forma_pagamento, :minimum_installment_not_satisfied
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def somente_autenticar
|
63
|
+
@autorizar = SOMENTE_AUTENTICAR
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
def autorizar_somente_autenticada
|
68
|
+
@autorizar = AUTORIZAR_SE_AUTENTICADA
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
72
|
+
def autorizar_nao_autenticada
|
73
|
+
@autorizar = AUTORIZAR_NAO_AUTENTICADA
|
74
|
+
self
|
75
|
+
end
|
76
|
+
|
77
|
+
def autorizacao_direta
|
78
|
+
@autorizar = AUTORIZACAO_DIRETA
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
def autorizacao_direta?
|
83
|
+
@autorizar == AUTORIZACAO_DIRETA
|
84
|
+
end
|
85
|
+
|
86
|
+
def recorrente
|
87
|
+
@autorizar = RECORRENTE
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
def capturar_automaticamente
|
92
|
+
@capturar = "true"
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
96
|
+
def nao_capturar_automaticamente
|
97
|
+
@capturar = "false"
|
98
|
+
self
|
99
|
+
end
|
100
|
+
|
101
|
+
def suporta_autorizacao_direta?
|
102
|
+
if autorizacao_direta? and @forma_pagamento.debito?
|
103
|
+
errors.add :autorizar, :direct_auth_available_for_credit_only
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def suporta_autenticacao?
|
108
|
+
if not autorizacao_direta? and not @forma_pagamento.suporta_autenticacao?
|
109
|
+
errors.add :autorizar, :authentication_not_supported
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def attributes
|
114
|
+
{
|
115
|
+
dados_ec: @dados_ec,
|
116
|
+
dados_portador: @dados_portador,
|
117
|
+
dados_pedido: @dados_pedido,
|
118
|
+
forma_pagamento: @forma_pagamento,
|
119
|
+
url_retorno: @url_retorno,
|
120
|
+
autorizar: @autorizar,
|
121
|
+
capturar: @capturar,
|
122
|
+
campo_livre: @campo_livre,
|
123
|
+
bin: (@dados_portador.numero.to_s[0..5] unless @dados_portador.nil?)
|
124
|
+
}
|
125
|
+
end
|
126
|
+
end
|
data/lib/cieloz.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
require 'active_support/core_ext/object/with_options'
|
3
|
+
require 'active_model'
|
4
|
+
require 'nokogiri'
|
5
|
+
|
6
|
+
require 'cieloz/version'
|
7
|
+
require "cieloz/helpers"
|
8
|
+
require 'cieloz/builder'
|
9
|
+
require "cieloz/bandeiras"
|
10
|
+
require "cieloz/configuracao"
|
11
|
+
require "cieloz/homologacao"
|
12
|
+
require "cieloz/requisicao"
|
13
|
+
require "cieloz/requisicao/dados_ec"
|
14
|
+
require "cieloz/requisicao/resposta"
|
15
|
+
require "cieloz/requisicao/resposta/erro"
|
16
|
+
require "cieloz/requisicao/resposta/transacao"
|
17
|
+
require "cieloz/requisicao_transacao"
|
18
|
+
require "cieloz/requisicao_transacao/dados_portador"
|
19
|
+
require "cieloz/requisicao_transacao/dados_pedido"
|
20
|
+
require "cieloz/requisicao_transacao/forma_pagamento"
|
21
|
+
require "cieloz/requisicao_tid"
|
22
|
+
|
23
|
+
DIR = File.dirname __FILE__
|
24
|
+
I18n.load_path += Dir.glob "#{DIR}/../config/locales/*.{rb,yml}"
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require_relative '../minitest_helper'
|
2
|
+
|
3
|
+
describe "Integration test" do
|
4
|
+
let(:_) { Cieloz::RequisicaoTransacao }
|
5
|
+
let(:ec) { _::DadosEc.new Cieloz::Homologacao::Credenciais::CIELO }
|
6
|
+
let(:now) { Time.now }
|
7
|
+
|
8
|
+
let(:pedido) {
|
9
|
+
_::DadosPedido.new numero: 123, valor: 5000, moeda: 986,
|
10
|
+
data_hora: now, descricao: "teste", idioma: "PT", soft_descriptor: "13letterstest"
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:pagamento) { _::FormaPagamento.new.credito "visa" }
|
14
|
+
|
15
|
+
let(:autorizacao) {
|
16
|
+
Cieloz::RequisicaoTransacao
|
17
|
+
.new(dados_ec: ec,
|
18
|
+
dados_pedido: pedido,
|
19
|
+
forma_pagamento: pagamento,
|
20
|
+
url_retorno: "http://ciel.oz/callback")
|
21
|
+
.autorizacao_direta
|
22
|
+
}
|
23
|
+
|
24
|
+
it "Autoriza, Consulta, Captura e Cancela" do
|
25
|
+
autorizacao.nao_capturar_automaticamente
|
26
|
+
|
27
|
+
txn = autorizacao.submit
|
28
|
+
assert_equal _::Transacao, txn.class, "#{txn.codigo}:\n#{txn.mensagem}"
|
29
|
+
assert_equal({}, autorizacao.errors.messages)
|
30
|
+
assert txn.criada?
|
31
|
+
|
32
|
+
assert_equal "302", post_credit_card_on_cielo_page(txn.url_autenticacao).code
|
33
|
+
|
34
|
+
params = { tid: txn.tid, dados_ec: ec }
|
35
|
+
|
36
|
+
consulta = Cieloz::RequisicaoConsulta.new params
|
37
|
+
cst = consulta.submit
|
38
|
+
assert_equal({}, consulta.errors.messages)
|
39
|
+
assert cst.autorizada?
|
40
|
+
|
41
|
+
captura = Cieloz::RequisicaoCaptura.new params
|
42
|
+
cap = captura.submit
|
43
|
+
assert_equal({}, captura.errors.messages)
|
44
|
+
assert cap.capturada?
|
45
|
+
|
46
|
+
cancelar = Cieloz::RequisicaoCancelamento.new params
|
47
|
+
cnc = cancelar.submit
|
48
|
+
assert_equal({}, cancelar.errors.messages)
|
49
|
+
assert cnc.cancelada?
|
50
|
+
end
|
51
|
+
|
52
|
+
it "Captura Automaticamente, Consulta e Cancela" do
|
53
|
+
autorizacao.capturar_automaticamente
|
54
|
+
|
55
|
+
txn = autorizacao.submit
|
56
|
+
assert_equal _::Transacao, txn.class, "#{txn.codigo}:\n#{txn.mensagem}"
|
57
|
+
assert_equal({}, autorizacao.errors.messages)
|
58
|
+
assert txn.criada?
|
59
|
+
|
60
|
+
assert_equal "302", post_credit_card_on_cielo_page(txn.url_autenticacao).code
|
61
|
+
|
62
|
+
params = { tid: txn.tid, dados_ec: ec }
|
63
|
+
|
64
|
+
consulta = Cieloz::RequisicaoConsulta.new params
|
65
|
+
cst = consulta.submit
|
66
|
+
assert_equal({}, consulta.errors.messages)
|
67
|
+
assert cst.capturada?
|
68
|
+
|
69
|
+
cancelar = Cieloz::RequisicaoCancelamento.new params
|
70
|
+
cnc = cancelar.submit
|
71
|
+
assert_equal({}, cancelar.errors.messages)
|
72
|
+
assert cnc.cancelada?
|
73
|
+
end
|
74
|
+
|
75
|
+
def post_credit_card_on_cielo_page url_cielo, bandeira=:visa,
|
76
|
+
portador=Cieloz::RequisicaoTransacao::DadosPortador::TEST::VISA
|
77
|
+
uri = URI(url_cielo)
|
78
|
+
|
79
|
+
# first, visit url_autenticacao - triggers em_andamento state
|
80
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true,
|
81
|
+
verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
|
82
|
+
http.request Net::HTTP::Get.new uri.request_uri
|
83
|
+
end
|
84
|
+
|
85
|
+
# after, prepare post to verify
|
86
|
+
uri.path = "/web/verify.cbmp"
|
87
|
+
|
88
|
+
params = Hash[*(uri.query.split("&").collect{ |param| param.split("=") }.flatten)]
|
89
|
+
|
90
|
+
post = Net::HTTP::Post.new uri.path
|
91
|
+
post.set_form_data id: params["id"],
|
92
|
+
bin: 0, cancelar: false,
|
93
|
+
bandeira: bandeira,
|
94
|
+
numeroCartao: portador.numero,
|
95
|
+
mes: portador.validade.to_s[4..5],
|
96
|
+
ano: portador.validade.to_s[2..3],
|
97
|
+
codSeguranca: portador.codigo_seguranca
|
98
|
+
|
99
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true,
|
100
|
+
verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
|
101
|
+
http.request post
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'debugger'
|
2
|
+
require 'cieloz'
|
3
|
+
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'turn/autorun'
|
6
|
+
|
7
|
+
require 'minitest/matchers'
|
8
|
+
require 'shoulda/matchers'
|
9
|
+
|
10
|
+
require 'fakeweb'
|
11
|
+
require 'erb'
|
12
|
+
|
13
|
+
class MiniTest::Spec
|
14
|
+
include Shoulda::Matchers::ActiveModel
|
15
|
+
|
16
|
+
class << self
|
17
|
+
alias :_create :create
|
18
|
+
|
19
|
+
def create name, desc
|
20
|
+
cls = _create name, desc
|
21
|
+
begin
|
22
|
+
c = eval name
|
23
|
+
cls.subject {
|
24
|
+
if c.is_a? Class then c.new elsif c.is_a? Module then c end
|
25
|
+
}
|
26
|
+
rescue
|
27
|
+
end
|
28
|
+
cls
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module Shoulda::Matchers::ActiveModel
|
34
|
+
class AllowValueMatcher
|
35
|
+
def matches? instance
|
36
|
+
@instance = instance
|
37
|
+
@values_to_match.none? do |value|
|
38
|
+
@value = value
|
39
|
+
@instance.instance_variable_set "@#{@attribute}", @value
|
40
|
+
errors_match?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def expected_xml opts={}
|
47
|
+
root, id, versao = opts[:root], opts[:id], opts[:versao]
|
48
|
+
|
49
|
+
'<?xml version="1.0" encoding="UTF-8"?>' +
|
50
|
+
%|<#{root} id="#{id}" versao="#{versao}">| +
|
51
|
+
"#{yield if block_given?}" +
|
52
|
+
"</#{root}>"
|
53
|
+
end
|
54
|
+
|
55
|
+
def render_template dir, filename, binding
|
56
|
+
template = File.join dir, [ "xml", filename ]
|
57
|
+
file = File.read template
|
58
|
+
erb = ERB.new file
|
59
|
+
res = erb.result binding
|
60
|
+
res.split("\n").collect {|line| line.strip }.join
|
61
|
+
end
|
62
|
+
|
63
|
+
def xml_for type, dir, binding
|
64
|
+
render_template dir, "dados-#{type}.xml", binding
|
65
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
describe "Bandeiras e Operacoes" do
|
2
|
+
let(:_) { Cieloz::Bandeiras }
|
3
|
+
|
4
|
+
it "recognizes mastercard secure code requires authentication" do
|
5
|
+
res = _.operacao "mastercard_securecode"
|
6
|
+
assert_equal [_::MASTERCARD, :autorizar_somente_autenticada], res
|
7
|
+
end
|
8
|
+
|
9
|
+
it "recognizes verified by visa code requires authentication" do
|
10
|
+
res = _.operacao "verified_by_visa"
|
11
|
+
assert_equal [_::VISA, :autorizar_somente_autenticada], res
|
12
|
+
end
|
13
|
+
|
14
|
+
it "recognizes supported products allows direct authorization" do
|
15
|
+
_::ALL.each do |bandeira|
|
16
|
+
res = _.operacao bandeira
|
17
|
+
assert_equal [bandeira, :autorizacao_direta], res
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "disallows unsupported products" do
|
22
|
+
error = lambda { _.operacao("anything else") }.must_raise RuntimeError
|
23
|
+
error.message.must_match /product_not_supported/
|
24
|
+
end
|
25
|
+
end
|