catarse_moip 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +1 -6
- data/.rspec +2 -0
- data/.travis.yml +17 -0
- data/Gemfile +2 -109
- data/Gemfile.lock +73 -476
- data/README.md +2 -26
- data/Rakefile +7 -2
- data/app/assets/javascripts/catarse_moip/moip_form.js +80 -0
- data/app/assets/javascripts/catarse_moip/payment_account.js +37 -0
- data/app/assets/javascripts/catarse_moip/payment_card.js +89 -0
- data/app/assets/javascripts/catarse_moip/payment_choice.js +19 -0
- data/app/assets/javascripts/catarse_moip/payment_slip.js +35 -0
- data/app/assets/javascripts/catarse_moip/user_document.js +111 -0
- data/app/assets/javascripts/catarse_moip.js +7 -0
- data/app/controllers/catarse_moip/moip_controller.rb +126 -0
- data/app/views/catarse_moip/moip/review.html.slim +105 -0
- data/catarse_moip.gemspec +5 -5
- data/config/initializers/moip.rb +4 -7
- data/config/initializers/register.rb +5 -0
- data/config/locales/en.yml +2 -0
- data/config/locales/pt.yml +19 -0
- data/config/routes.rb +9 -5
- data/lib/catarse_moip/engine.rb +7 -0
- data/lib/catarse_moip/version.rb +1 -1
- data/lib/catarse_moip.rb +1 -1
- data/lib/moip_transparente/checkout.rb +218 -0
- data/lib/moip_transparente/version.rb +3 -0
- data/lib/moip_transparente.rb +32 -0
- data/spec/controllers/catarse_moip/moip_controller_spec.rb +230 -0
- data/spec/fixtures/ipn_data.txt +1 -0
- data/spec/javascripts/moip_form_spec.js +25 -0
- data/spec/javascripts/support/app.js +1 -0
- data/spec/javascripts/support/backbone.js +1571 -0
- data/spec/javascripts/support/jquery.js +8829 -0
- data/spec/javascripts/support/skull.js +64 -0
- data/spec/javascripts/support/underscore.js +1227 -0
- data/spec/spec_helper.rb +2 -23
- data/spec/support/payment_engines.rb +3 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/.gitkeep +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +50 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- metadata +120 -35
- data/.gitmodules +0 -3
- data/app/controllers/catarse_moip/payment/moip_controller.rb +0 -49
- data/spec/controllers/catarse_moip/payment/moip_controller_spec.rb +0 -81
data/config/locales/pt.yml
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
pt:
|
2
2
|
projects:
|
3
3
|
backers:
|
4
|
+
review:
|
5
|
+
moip: 'Pagamento nacional'
|
6
|
+
form:
|
7
|
+
labels:
|
8
|
+
payment_account: 'Debito em Conta'
|
9
|
+
document: 'CPF/CNPJ (somente números)'
|
10
|
+
payment_card: 'Pagamento com Cartão'
|
11
|
+
owner_card: "Dados do titular do cartão"
|
12
|
+
number_card: "Dados do cartão"
|
13
|
+
payment_boleto: "Pagamento com Boleto"
|
14
|
+
payment_boleto_subtitle: "Clique no link abaixo para ver o boleto:"
|
15
|
+
select_boleto: "Para prosseguir, por favor selecione:"
|
16
|
+
select_account: "Para prosseguir, por favor selecione o banco:"
|
17
|
+
payment_account: "Pagamento com Débito em Conta"
|
18
|
+
select_account: "Você será redirecionado para o site do seu banco:"
|
19
|
+
you_are_about_html: "Você está prestes a fazer parte do grupo que faz de tudo para o %{link} acontecer."
|
20
|
+
pay_with: "Pagar com"
|
21
|
+
submit: "Efetuar pagamento"
|
22
|
+
build_boleto: 'Gerar boleto'
|
4
23
|
checkout:
|
5
24
|
moip_error: "Ooops. Ocorreu um erro ao enviar seu pagamento para o MoIP. Por favor, tente novamente."
|
6
25
|
success: "Seu apoio foi realizado com sucesso. Muito obrigado!"
|
data/config/routes.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
CatarseMoip::Engine.routes.draw do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
resources :moip, only: [], path: 'payment/moip' do
|
3
|
+
collection do
|
4
|
+
post 'notifications' => "moip#create_notification"
|
5
|
+
get 'js'
|
6
|
+
end
|
7
|
+
member do
|
8
|
+
match :moip_response
|
9
|
+
match :review
|
10
|
+
match :get_moip_token
|
7
11
|
end
|
8
12
|
end
|
9
13
|
end
|
data/lib/catarse_moip/engine.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
module CatarseMoip
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace CatarseMoip
|
4
|
+
initializer "pandemic.asset_addition", :group => :all do |app|
|
5
|
+
# Enabling assets precompiling under rails 3.1
|
6
|
+
if Rails.version >= '3.1'
|
7
|
+
app.config.assets.precompile += %w( catarse_moip.js )
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
4
11
|
end
|
5
12
|
end
|
data/lib/catarse_moip/version.rb
CHANGED
data/lib/catarse_moip.rb
CHANGED
@@ -0,0 +1,218 @@
|
|
1
|
+
require 'xml'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
class MoipTransparente::Checkout
|
5
|
+
|
6
|
+
def javascript_tag
|
7
|
+
"<script type='text/javascript' src='#{get_javascript_url}' charset='ISO-8859-1'></script>"
|
8
|
+
end
|
9
|
+
|
10
|
+
def widget_tag(success, fail)
|
11
|
+
"<div id='MoipWidget'
|
12
|
+
data-token='#{@token}'
|
13
|
+
callback-method-success='#{success}'
|
14
|
+
callback-method-error='#{fail}'>
|
15
|
+
</div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_token(invoice)
|
19
|
+
doc = XML::Document.new
|
20
|
+
doc.root = XML::Node.new('EnviarInstrucao')
|
21
|
+
|
22
|
+
unica = XML::Node.new('InstrucaoUnica')
|
23
|
+
unica['TipoValidacao'] = 'Transparente'
|
24
|
+
|
25
|
+
|
26
|
+
description = XML::Node.new('Razao')
|
27
|
+
description << invoice[:razao]
|
28
|
+
unica << description
|
29
|
+
|
30
|
+
id_invoice = XML::Node.new('IdProprio')
|
31
|
+
id_invoice << invoice[:id]
|
32
|
+
unica << id_invoice
|
33
|
+
|
34
|
+
valores = XML::Node.new('Valores')
|
35
|
+
|
36
|
+
valor = XML::Node.new('Valor')
|
37
|
+
valor['moeda'] = 'BRL'
|
38
|
+
valor << invoice[:total]
|
39
|
+
|
40
|
+
valores << valor
|
41
|
+
|
42
|
+
|
43
|
+
valor = XML::Node.new('Acrescimo')
|
44
|
+
valor['moeda'] = 'BRL'
|
45
|
+
valores << invoice[:acrescimo] || '0.00'
|
46
|
+
|
47
|
+
|
48
|
+
valor = XML::Node.new('Deducao')
|
49
|
+
valor['moeda'] = 'BRL'
|
50
|
+
valores << invoice[:desconto] || '0.00'
|
51
|
+
|
52
|
+
unica << valores
|
53
|
+
|
54
|
+
pagador = XML::Node.new('Pagador')
|
55
|
+
nome = XML::Node.new('Nome')
|
56
|
+
nome << invoice[:cliente][:nome]
|
57
|
+
pagador << nome
|
58
|
+
|
59
|
+
email = XML::Node.new('Email')
|
60
|
+
email << invoice[:cliente][:email]
|
61
|
+
pagador << email
|
62
|
+
|
63
|
+
id = XML::Node.new('IdPagador')
|
64
|
+
id << invoice[:cliente][:id]
|
65
|
+
pagador << id
|
66
|
+
|
67
|
+
endereco = XML::Node.new('EnderecoCobranca')
|
68
|
+
|
69
|
+
logradouro = XML::Node.new('Logradouro')
|
70
|
+
logradouro << invoice[:cliente][:logradouro]
|
71
|
+
endereco << logradouro
|
72
|
+
|
73
|
+
numero = XML::Node.new('Numero')
|
74
|
+
numero_or_default = invoice[:cliente][:numero] || '0'
|
75
|
+
numero << numero_or_default
|
76
|
+
endereco << numero
|
77
|
+
|
78
|
+
complemento = XML::Node.new('Complemento')
|
79
|
+
complemento << invoice[:cliente][:complemento]
|
80
|
+
endereco << complemento
|
81
|
+
|
82
|
+
bairro = XML::Node.new('Bairro')
|
83
|
+
bairro << invoice[:cliente][:bairro]
|
84
|
+
endereco << bairro
|
85
|
+
|
86
|
+
cidade = XML::Node.new('Cidade')
|
87
|
+
cidade << invoice[:cliente][:cidade]
|
88
|
+
endereco << cidade
|
89
|
+
|
90
|
+
estado = XML::Node.new('Estado')
|
91
|
+
estado << invoice[:cliente][:uf]
|
92
|
+
endereco << estado
|
93
|
+
|
94
|
+
pais = XML::Node.new('Pais')
|
95
|
+
pais_or_default = invoice[:cliente][:pais] || 'BRA'
|
96
|
+
pais << pais_or_default
|
97
|
+
endereco << pais
|
98
|
+
|
99
|
+
cep = XML::Node.new('CEP')
|
100
|
+
cep << invoice[:cliente][:cep]
|
101
|
+
endereco << cep
|
102
|
+
|
103
|
+
telefone = XML::Node.new('TelefoneFixo')
|
104
|
+
telefone << invoice[:cliente][:telefone]
|
105
|
+
endereco << telefone
|
106
|
+
|
107
|
+
pagador << endereco
|
108
|
+
unica << pagador
|
109
|
+
|
110
|
+
if invoice[:parcelamentos]
|
111
|
+
parcelamentos = XML::Node.new('Parcelamentos')
|
112
|
+
invoice[:parcelamentos].each do |parcelamento_item|
|
113
|
+
parcelamento = XML::Node.new('Parcelamento')
|
114
|
+
minimo = XML::Node.new('MinimoParcelas')
|
115
|
+
minimo << parcelamento_item[:minimo]
|
116
|
+
parcelamento << minimo
|
117
|
+
|
118
|
+
maximo = XML::Node.new('MaximoParcelas')
|
119
|
+
maximo << parcelamento_item[:maximo]
|
120
|
+
parcelamento << maximo
|
121
|
+
|
122
|
+
if parcelamento_item[:repassar]
|
123
|
+
repassar = XML::Node.new('Repassar')
|
124
|
+
repassar << '1'
|
125
|
+
parcelamento << repassar
|
126
|
+
else
|
127
|
+
juros = XML::Node.new('Juros')
|
128
|
+
juros << parcelamento_item[:juros]
|
129
|
+
parcelamento << juros
|
130
|
+
end
|
131
|
+
parcelamentos << parcelamento
|
132
|
+
end
|
133
|
+
|
134
|
+
unica << parcelamentos
|
135
|
+
end
|
136
|
+
|
137
|
+
comissoes = XML::Node.new('Comissoes')
|
138
|
+
if invoice[:comissoes]
|
139
|
+
invoice[:comissoes].each do |comissao_item|
|
140
|
+
comissionamento = XML::Node.new('Comissionamento')
|
141
|
+
razao = XML::Node.new('Razao')
|
142
|
+
razao << comissao_item[:razao] || invoice[:razao]
|
143
|
+
comissionamento << razao
|
144
|
+
|
145
|
+
comissionado = XML::Node.new("Comissionado")
|
146
|
+
login_moip = XML::Node.new("LoginMoIP")
|
147
|
+
login_moip << comissao_item[:login_moip]
|
148
|
+
comissionado << login_moip
|
149
|
+
comissionamento << comissionado
|
150
|
+
|
151
|
+
valor = XML::Node.new("ValorFixo")
|
152
|
+
valor << comissao_item[:valor]
|
153
|
+
comissionamento << valor
|
154
|
+
comissoes << comissionamento
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
if invoice[:pagador_taxas]
|
159
|
+
taxas = XML::Node.new('PagadorTaxa')
|
160
|
+
login_moip = XML::Node.new("LoginMoIP")
|
161
|
+
login_moip << invoice[:pagador_taxas]
|
162
|
+
taxas << login_moip
|
163
|
+
comissoes << taxas
|
164
|
+
end
|
165
|
+
|
166
|
+
unica << comissoes
|
167
|
+
|
168
|
+
doc.root << unica
|
169
|
+
begin
|
170
|
+
response = post_data(doc.to_s(:encoding => XML::Encoding::ISO_8859_1))
|
171
|
+
parser = XML::Parser.string(response)
|
172
|
+
dom = parser.parse
|
173
|
+
rescue LibXML::XML::Error => e
|
174
|
+
puts response.inspect
|
175
|
+
puts parser.inspect
|
176
|
+
Rails.logger.info response.inspect
|
177
|
+
Rails.logger.info parser.inspect
|
178
|
+
end
|
179
|
+
resposta = dom.find('./Resposta').first
|
180
|
+
if resposta.find('Status')[0].content == 'Sucesso'
|
181
|
+
@token = resposta.find('Token')[0].content
|
182
|
+
return {:status => :ok, :token => resposta.find('Token')[0].content, :id => resposta.find('ID')[0].content}
|
183
|
+
elsif resposta.find('Status')[0].content == 'Falha'
|
184
|
+
return {:status => :fail, :code => resposta.find('Erro')[0]['Codigo'], :message => resposta.find('Erro')[0].content, :id => resposta.find('ID')[0].content }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def get_token_url
|
189
|
+
if ::MoipTransparente::Config.test?
|
190
|
+
return "https://desenvolvedor.moip.com.br/sandbox/ws/alpha/EnviarInstrucao/Unica"
|
191
|
+
else
|
192
|
+
return "https://www.moip.com.br/ws/alpha/EnviarInstrucao/Unica"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def get_javascript_url
|
197
|
+
if ::MoipTransparente::Config.test?
|
198
|
+
return "https://desenvolvedor.moip.com.br/sandbox/transparente/MoipWidget-v2.js"
|
199
|
+
else
|
200
|
+
return "https://www.moip.com.br/transparente/MoipWidget-v2.js"
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def post_data(xml)
|
205
|
+
uri = URI.parse(get_token_url)
|
206
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
207
|
+
http.use_ssl = true
|
208
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
209
|
+
#http.set_debug_output $stderr if Moip::Config.test?
|
210
|
+
|
211
|
+
request = Net::HTTP::Post.new(uri.path)
|
212
|
+
request.basic_auth ::MoipTransparente::Config.access_token, ::MoipTransparente::Config.access_key
|
213
|
+
|
214
|
+
request.body = xml
|
215
|
+
response = http.start {|r| r.request request }
|
216
|
+
response.body
|
217
|
+
end
|
218
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "net/https"
|
2
|
+
require "uri"
|
3
|
+
require "moip_transparente/version"
|
4
|
+
require "moip_transparente/checkout"
|
5
|
+
|
6
|
+
module MoipTransparente
|
7
|
+
class Config
|
8
|
+
def self.access_token
|
9
|
+
@access_token
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.access_token=(value)
|
13
|
+
@access_token = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.access_key
|
17
|
+
@access_key
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.access_key=(value)
|
21
|
+
@access_key = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.test?
|
25
|
+
@test || false
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.test=(test)
|
29
|
+
@test = test
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe CatarseMoip::MoipController do
|
5
|
+
subject{ response }
|
6
|
+
|
7
|
+
let(:get_token_response){{:status=>:fail, :code=>"171", :message=>"TelefoneFixo do endereço deverá ser enviado obrigatorio", :id=>"201210192052439150000024698931"}}
|
8
|
+
let(:backer){ double('backer', {
|
9
|
+
id: 1,
|
10
|
+
key: 'backer key',
|
11
|
+
payment_id: 'payment id',
|
12
|
+
project: project,
|
13
|
+
pending?: false,
|
14
|
+
value: 10,
|
15
|
+
user: user,
|
16
|
+
payer_name: 'foo',
|
17
|
+
payer_email: 'foo@bar.com',
|
18
|
+
address_street: 'test',
|
19
|
+
address_number: '123',
|
20
|
+
address_complement: '123',
|
21
|
+
address_neighbourhood: '123',
|
22
|
+
address_city: '123',
|
23
|
+
address_state: '123',
|
24
|
+
address_zip_code: '123',
|
25
|
+
address_phone_number: '123'
|
26
|
+
}) }
|
27
|
+
|
28
|
+
let(:user){ double('user', id: 1) }
|
29
|
+
let(:project){ double('project', id: 1, name: 'test project') }
|
30
|
+
let(:extra_data){ {"id_transacao"=>backer.key, "valor"=>"2190", "cod_moip"=>"12345123", "forma_pagamento"=>"1", "tipo_pagamento"=>"CartaoDeCredito", "email_consumidor"=>"some@email.com", "controller"=>"catarse_moip/payment/notifications", "action"=>"create"} }
|
31
|
+
|
32
|
+
before do
|
33
|
+
controller.stub(:current_user).and_return(user)
|
34
|
+
::MoipTransparente::Checkout.any_instance.stub(:get_token).and_return(get_token_response)
|
35
|
+
::MoipTransparente::Checkout.any_instance.stub(:moip_widget_tag).and_return('<div>')
|
36
|
+
::MoipTransparente::Checkout.any_instance.stub(:moip_javascript_tag).and_return('<script>')
|
37
|
+
::MoipTransparente::Checkout.any_instance.stub(:as_json).and_return('{}')
|
38
|
+
PaymentEngines.stub(:find_payment).and_return(backer)
|
39
|
+
PaymentEngines.stub(:create_payment_notification)
|
40
|
+
backer.stub(:with_lock).and_yield
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "POST create_notification" do
|
44
|
+
context "when we search for a non-existant backer" do
|
45
|
+
before do
|
46
|
+
PaymentEngines.should_receive(:find_payment).with(key: "non-existant backer key").and_raise('error')
|
47
|
+
post :create_notification, {:id_transacao => "non-existant backer key", :use_route => 'catarse_moip'}
|
48
|
+
end
|
49
|
+
|
50
|
+
its(:status){ should == 422 }
|
51
|
+
its(:body){ should == "#<RuntimeError: error>: error recebemos: {\"id_transacao\"=>\"non-existant backer key\", \"controller\"=>\"catarse_moip/moip\", \"action\"=>\"create_notification\"}" }
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when we seach for an existing backer" do
|
55
|
+
before do
|
56
|
+
PaymentEngines.should_receive(:find_payment).with(key: backer.key).and_return(backer)
|
57
|
+
controller.should_receive(:process_moip_message).with({"id_transacao"=>backer.key, "controller"=>"catarse_moip/moip", "action"=>"create_notification"})
|
58
|
+
post :create_notification, {:id_transacao => backer.key, :use_route => 'catarse_moip'}
|
59
|
+
end
|
60
|
+
|
61
|
+
its(:body){ should == ' ' }
|
62
|
+
its(:status){ should == 200 }
|
63
|
+
it("should assign backer"){ assigns(:backer).should == backer }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "GET js" do
|
68
|
+
let(:file){ double('js_file') }
|
69
|
+
|
70
|
+
context "when the content of get_javascript_url raises an error" do
|
71
|
+
before do
|
72
|
+
controller.should_receive(:open).at_least(3).times.and_raise('error')
|
73
|
+
->{
|
74
|
+
get :js, locale: :pt, use_route: 'catarse_moip'
|
75
|
+
}.should raise_error('error')
|
76
|
+
end
|
77
|
+
its(:status){ should == 200 }
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when the content of get_javascript_url is read without errors" do
|
81
|
+
before do
|
82
|
+
controller.should_receive(:open).and_return(file)
|
83
|
+
file.should_receive(:set_encoding).and_return(file)
|
84
|
+
file.should_receive(:read).and_return(file)
|
85
|
+
file.should_receive(:encode).and_return('js content')
|
86
|
+
get :js, locale: :pt, use_route: 'catarse_moip'
|
87
|
+
end
|
88
|
+
its(:status){ should == 200 }
|
89
|
+
its(:body){ should == 'js content' }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "POST moip_response" do
|
94
|
+
let(:processor){ double('moip processor') }
|
95
|
+
before do
|
96
|
+
controller.should_receive(:process_moip_message)
|
97
|
+
post :moip_response, id: backer.id, response: {StatusPagamento: 'Sucesso'}, use_route: 'catarse_moip'
|
98
|
+
end
|
99
|
+
|
100
|
+
its(:status){ should == 200 }
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "POST get_moip_token" do
|
104
|
+
before do
|
105
|
+
post :get_moip_token, :id => backer.id, :use_route => 'catarse_moip'
|
106
|
+
end
|
107
|
+
|
108
|
+
its(:status){ should == 200 }
|
109
|
+
its(:body){ should == "{\"get_token_response\":{\"status\":\"fail\",\"code\":\"171\",\"message\":\"TelefoneFixo do endereço deverá ser enviado obrigatorio\",\"id\":\"201210192052439150000024698931\"},\"moip\":\"{}\",\"widget_tag\":\"<div id='MoipWidget'\\n data-token=''\\n callback-method-success='checkoutSuccessful' \\n callback-method-error='checkoutFailure'>\\n </div>\",\"javascript_tag\":\"<script type='text/javascript' src='https://www.moip.com.br/transparente/MoipWidget-v2.js' charset='ISO-8859-1'></script>\"}" }
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#update_backer" do
|
113
|
+
before do
|
114
|
+
controller.stub(:backer).and_return(backer)
|
115
|
+
backer.stub(:payment_token).and_return('token')
|
116
|
+
end
|
117
|
+
|
118
|
+
context "with parameters containing CodigoMoIP and TaxaMoIP" do
|
119
|
+
let(:payment){ {"Status" => "Autorizado","Codigo" => "0","CodigoRetorno" => "0","TaxaMoIP" => "1.54","StatusPagamento" => "Sucesso","CodigoMoIP" => "18093844","Mensagem" => "Requisição processada com sucesso","TotalPago" => "25.00","url" => "https => //www.moip.com.br/Instrucao.do?token=R2W0N123E005F2A911V6O2I0Y3S7M4J853H0S0F0T0D044T8F4H4E9G0I3W8"} }
|
120
|
+
before do
|
121
|
+
MoIP.should_not_receive(:query)
|
122
|
+
backer.should_receive(:update_attributes).with({
|
123
|
+
payment_id: payment["CodigoMoIP"],
|
124
|
+
payment_choice: payment["FormaPagamento"],
|
125
|
+
payment_service_fee: payment["TaxaMoIP"]
|
126
|
+
})
|
127
|
+
end
|
128
|
+
it("should call update attributes but not call MoIP.query"){ controller.update_backer payment }
|
129
|
+
end
|
130
|
+
|
131
|
+
context "with no response from moip" do
|
132
|
+
let(:moip_query_response) { nil }
|
133
|
+
before do
|
134
|
+
MoIP.should_receive(:query).with(backer.payment_token).and_return(moip_query_response)
|
135
|
+
backer.should_not_receive(:update_attributes)
|
136
|
+
end
|
137
|
+
it("should never call update attributes"){ controller.update_backer }
|
138
|
+
end
|
139
|
+
|
140
|
+
context "with an incomplete transaction" do
|
141
|
+
let(:moip_query_response) do
|
142
|
+
{"ID"=>"201210191926185570000024694351", "Status"=>"Sucesso"}
|
143
|
+
end
|
144
|
+
before do
|
145
|
+
MoIP.should_receive(:query).with(backer.payment_token).and_return(moip_query_response)
|
146
|
+
backer.should_not_receive(:update_attributes)
|
147
|
+
end
|
148
|
+
it("should never call update attributes"){ controller.update_backer }
|
149
|
+
end
|
150
|
+
|
151
|
+
context "with a real data set that works for some cases" do
|
152
|
+
let(:moip_query_response) do
|
153
|
+
{"ID"=>"201210191926185570000024694351", "Status"=>"Sucesso", "Autorizacao"=>{"Pagador"=>{"Nome"=>"juliana.giopato@hotmail.com", "Email"=>"juliana.giopato@hotmail.com"}, "EnderecoCobranca"=>{"Logradouro"=>"Rua sócrates abraão ", "Numero"=>"16.0", "Complemento"=>"casa 19", "Bairro"=>"Campo Limpo", "CEP"=>"05782-470", "Cidade"=>"São Paulo", "Estado"=>"SP", "Pais"=>"BRA", "TelefoneFixo"=>"1184719963"}, "Recebedor"=>{"Nome"=>"Catarse", "Email"=>"financeiro@catarse.me"}, "Pagamento"=>[{"Data"=>"2012-10-17T13:06:07.000-03:00", "DataCredito"=>"2012-10-19T00:00:00.000-03:00", "TotalPago"=>"50.00", "TaxaParaPagador"=>"0.00", "TaxaMoIP"=>"1.34", "ValorLiquido"=>"48.66", "FormaPagamento"=>"BoletoBancario", "InstituicaoPagamento"=>"Bradesco", "Status"=>"Autorizado", "Parcela"=>{"TotalParcelas"=>"1"}, "CodigoMoIP"=>"0000.1325.5258"}, {"Data"=>"2012-10-17T13:05:49.000-03:00", "TotalPago"=>"50.00", "TaxaParaPagador"=>"0.00", "TaxaMoIP"=>"3.09", "ValorLiquido"=>"46.91", "FormaPagamento"=>"CartaoDebito", "InstituicaoPagamento"=>"Visa", "Status"=>"Iniciado", "Parcela"=>{"TotalParcelas"=>"1"}, "CodigoMoIP"=>"0000.1325.5248"}]}}
|
154
|
+
end
|
155
|
+
before do
|
156
|
+
MoIP.should_receive(:query).with(backer.payment_token).and_return(moip_query_response)
|
157
|
+
payment = moip_query_response["Autorizacao"]["Pagamento"].first
|
158
|
+
backer.should_receive(:update_attributes).with({
|
159
|
+
payment_id: payment["CodigoMoIP"],
|
160
|
+
payment_choice: payment["FormaPagamento"],
|
161
|
+
payment_service_fee: payment["TaxaMoIP"]
|
162
|
+
})
|
163
|
+
end
|
164
|
+
it("should call update attributes"){ controller.update_backer }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "#process_moip_message" do
|
169
|
+
before do
|
170
|
+
controller.stub(:backer).and_return(backer)
|
171
|
+
backer.stub(:confirmed?).and_return(false)
|
172
|
+
backer.stub(:confirm!)
|
173
|
+
controller.stub(:update_backer)
|
174
|
+
end
|
175
|
+
|
176
|
+
context "when we already have the payment_id in backers table" do
|
177
|
+
before do
|
178
|
+
backer.stub(:payment_id).and_return('test')
|
179
|
+
controller.should_not_receive(:update_backer)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'should never call update_backer' do
|
183
|
+
controller.process_moip_message post_moip_params.merge!({:id_transacao => backer.key, :status_pagamento => CatarseMoip::MoipController::TransactionStatus::AUTHORIZED})
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context "when we still do not have the payment_id in backers table" do
|
188
|
+
before do
|
189
|
+
backer.stub(:payment_id).and_return(nil)
|
190
|
+
controller.should_receive(:update_backer)
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should call update_backer on the processor' do
|
194
|
+
controller.process_moip_message post_moip_params.merge!({:id_transacao => backer.key, :status_pagamento => CatarseMoip::MoipController::TransactionStatus::AUTHORIZED})
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context "when there is a written back request and backer is not refunded" do
|
199
|
+
before do
|
200
|
+
backer.stub(:refunded?).and_return(false)
|
201
|
+
backer.should_receive(:refund!)
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'should call refund!' do
|
205
|
+
controller.process_moip_message post_moip_params.merge!({:id_transacao => backer.key, :status_pagamento => CatarseMoip::MoipController::TransactionStatus::WRITTEN_BACK})
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
context "when there is an authorized request" do
|
210
|
+
before do
|
211
|
+
backer.should_receive(:confirm!)
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'should call confirm!' do
|
215
|
+
controller.process_moip_message post_moip_params.merge!({:id_transacao => backer.key, :status_pagamento => CatarseMoip::MoipController::TransactionStatus::AUTHORIZED})
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context "when there is a refund request" do
|
220
|
+
before do
|
221
|
+
backer.stub(:refunded?).and_return(false)
|
222
|
+
backer.should_receive(:refund!)
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'should mark refunded to true' do
|
226
|
+
controller.process_moip_message post_moip_params.merge!({:id_transacao => backer.key, :status_pagamento => CatarseMoip::MoipController::TransactionStatus::REFUNDED})
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
id_transacao=928a335e1756249b5e3bee2d3cdf9942&valor=4000&status_pagamento=2&cod_moip=13847342&forma_pagamento=5&tipo_pagamento=CartaoDeCredito&parcelas=1&recebedor_login=softa&email_consumidor=murilo.morelli@gmail.com&cartao_bin=539028&cartao_final=0004&cartao_bandeira=Mastercard&cofre=cec1b177-102d-4320-a9ee-8f523ed1a310&classificacao=Falha na comunica��o com o Banco Emissor&action=create&controller=catarse_moip/payment/notifications
|
@@ -0,0 +1,25 @@
|
|
1
|
+
global.window = require("jsdom")
|
2
|
+
.jsdom()
|
3
|
+
.createWindow();
|
4
|
+
global.jQuery = global.$ = require("jquery");
|
5
|
+
|
6
|
+
global._ = global.underscore = require("./support/underscore");
|
7
|
+
global.Backbone = require("./support/backbone");
|
8
|
+
Backbone.$ = $;
|
9
|
+
|
10
|
+
global.Skull = require('./support/skull');
|
11
|
+
require('./support/app');
|
12
|
+
require("../../app/assets/javascripts/catarse_moip/moip_form");
|
13
|
+
|
14
|
+
describe("MoipForm", function() {
|
15
|
+
var view;
|
16
|
+
|
17
|
+
beforeEach(function() {
|
18
|
+
view = new App.views.MoipForm();
|
19
|
+
});
|
20
|
+
|
21
|
+
it("should be true", function() {
|
22
|
+
expect(true).toEqual(true);
|
23
|
+
});
|
24
|
+
});
|
25
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
global.App = window.App = Skull.View.extend({});
|