diff --git a/.gitignore b/.gitignore
index 577ddd1..cea5804 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,5 @@ pkg
# Bundler
Gemfile.lock
+
+.ruby-version
diff --git a/Gemfile b/Gemfile
index 15ed1a0..d00d63d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,4 +1,4 @@
source 'https://rubygems.org'
# Specify your gem's dependencies in new_gem.gemspec
-gemspec
+gemspec
\ No newline at end of file
diff --git a/README.md b/README.md
index afe46d9..90beb9d 100644
--- a/README.md
+++ b/README.md
@@ -329,6 +329,16 @@ A payment slip can have the following attributes:
* instruction_line_1, instruction_line_2, instruction_line_3: lines of instruction (up to 63 characters each), added to the payment slip.
* logo_url: an URL pointing to an image which will be added to the body of the payment slip.
+### Consultation
+
+``` ruby
+# Create a consultation request with the moip transaction token
+request = MyMoip::ConsultationRequest.new('U260F1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X7S9X6I783')
+request.api_call
+# After api_call you can access the xml string response and parse it
+Hash.from_xml(request.xml_str)
+```
+
### Logger
The methods that make api calls to Moip, log request and response informations. The default logger is `Logger.new(STDOUT)`, but you can set the logger you want as `api_call` option. For instance:
diff --git a/lib/mymoip.rb b/lib/mymoip.rb
index fb650a9..9f60e18 100644
--- a/lib/mymoip.rb
+++ b/lib/mymoip.rb
@@ -49,6 +49,7 @@ def ensure_key_and_token_set!
$LOAD_PATH << "./lib/mymoip"
require File.dirname(__FILE__) + "/mymoip/validators.rb"
+require File.dirname(__FILE__) + "/mymoip/params_mapper.rb"
files = Dir[File.dirname(__FILE__) + "/mymoip/*.rb"]
files.each { |f| require f }
diff --git a/lib/mymoip/js_response.rb b/lib/mymoip/js_response.rb
new file mode 100644
index 0000000..5d095db
--- /dev/null
+++ b/lib/mymoip/js_response.rb
@@ -0,0 +1,28 @@
+module MyMoip
+ class JsResponse
+ PARAMS_MAPPER = {
+ 'Codigo' => 'code',
+ 'CodigoMoIP' => 'moip_code',
+ 'Mensagem' => 'message',
+ 'StatusPagamento' => 'payment_status',
+ 'Status' => 'status',
+ 'TaxaMoIP' => 'moip_tax_value',
+ 'TotalPago' => 'total_paid_value',
+ 'CodigoRetorno' => 'return_code',
+ 'url' => 'url',
+ 'Classificacao' => {
+ 'classification' => { 'Codigo' => 'code', 'Descricao' => 'description' }
+ }
+ }
+
+ include MyMoip::ParamsMapper
+
+ def success?
+ payment_status.eql?('Sucesso')
+ end
+
+ def failed?
+ payment_status.eql?('Falha')
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/mymoip/nasp.rb b/lib/mymoip/nasp.rb
new file mode 100644
index 0000000..7870841
--- /dev/null
+++ b/lib/mymoip/nasp.rb
@@ -0,0 +1,22 @@
+module MyMoip
+ class Nasp
+ PARAMS_MAPPER = {
+ 'id_transacao' => 'transaction_id',
+ 'valor' => 'paid_value',
+ 'status_pagamento' => 'status',
+ 'cod_moip' => 'moip_code',
+ 'forma_pagamento' => 'payment_method_code', # 1
+ 'tipo_pagamento' => 'payment_method', # BoletoBancario
+ 'parcelas' => 'installments',
+ 'email_consumidor' => 'payer_mail',
+ 'recebedor_login' => 'seller_mail',
+ 'cartao_bin' => 'card_first_numbers',
+ 'cartao_final' => 'card_last_numbers',
+ 'cartao_bandeira' => 'credit_card_logo',
+ 'cofre' => 'moip_lock_number',
+ 'classificacao' => 'classification'
+ }
+
+ include MyMoip::ParamsMapper
+ end
+end
\ No newline at end of file
diff --git a/lib/mymoip/params_mapper.rb b/lib/mymoip/params_mapper.rb
new file mode 100644
index 0000000..56db476
--- /dev/null
+++ b/lib/mymoip/params_mapper.rb
@@ -0,0 +1,26 @@
+module MyMoip
+ module ParamsMapper
+ def initialize(params)
+ self.class::PARAMS_MAPPER.values.each_with_index do |attribute, index|
+ value = params[self.class::PARAMS_MAPPER.key(attribute)]
+
+ if attribute.is_a?(Hash)
+ define_multiple_attributes(attribute, value); next
+ end
+
+ define_singleton_method attribute do value end
+ end
+ end
+
+ def define_multiple_attributes(hash, value)
+ method_name = hash.keys.first
+ mapped_methods = hash[method_name]
+
+ if value
+ value = OpenStruct.new(Hash[ value.map { |k, v| [mapped_methods[k], v] } ])
+ end
+
+ define_singleton_method method_name do value end
+ end
+ end
+end
diff --git a/lib/mymoip/payment_slip.rb b/lib/mymoip/payment_slip.rb
index 91ea4a8..15f2103 100644
--- a/lib/mymoip/payment_slip.rb
+++ b/lib/mymoip/payment_slip.rb
@@ -36,14 +36,10 @@ def to_xml(root = nil)
root.DataVencimento(expiration_date.strftime('%Y-%m-%dT%H:%M:%S.%L%:z')) unless expiration_date.blank?
if expiration_days
- type = nil
- if expiration_days_type
- if expiration_days_type == :business_day
- type = {'Tipo' => 'Uteis'}
- elsif expiration_days_type == :calendar_day
- type = {'Tipo' => 'Corridos'}
- end
- end
+ type = {
+ business_day: {'Tipo' => 'Uteis'},
+ calendar_day: {'Tipo' => 'Corridos'}
+ }[expiration_days_type]
root.DiasExpiracao(expiration_days, type)
end
diff --git a/lib/mymoip/request.rb b/lib/mymoip/request.rb
index f9f15ae..f2d793b 100644
--- a/lib/mymoip/request.rb
+++ b/lib/mymoip/request.rb
@@ -21,6 +21,8 @@ def api_call(params, opts = {})
opts[:logger].debug "#{self.class} of ##{@id} with #{params.inspect}"
url = MyMoip.api_url + params.delete(:path)
+
+ params[:timeout] = opts[:timeout]
params[:basic_auth] = { username: opts[:username], password: opts[:password] }
@response = HTTParty.send params.delete(:http_method), url, params
diff --git a/lib/mymoip/requests/consultation_request.rb b/lib/mymoip/requests/consultation_request.rb
new file mode 100644
index 0000000..a05e8a4
--- /dev/null
+++ b/lib/mymoip/requests/consultation_request.rb
@@ -0,0 +1,52 @@
+require 'active_support/core_ext/hash'
+
+module MyMoip
+ class ConsultationRequest < Request
+
+ HTTP_METHOD = :get
+ PATH = '/ws/alpha/ConsultarInstrucao'
+ REQUIRES_AUTH = true
+
+ def api_call(opts = {})
+ params = {
+ http_method: HTTP_METHOD,
+ requires_auth: REQUIRES_AUTH,
+ path: [PATH, id].join('/')
+ }
+
+ super(params, opts)
+ end
+
+ def response_hash
+ Hash.from_xml(@response.body)
+ end
+
+ def transactions
+ @transactions ||= get_transaction_params.map do |transaction_params|
+ MyMoip::Transaction.new(transaction_params)
+ end
+ end
+
+ def transaction(moip_code)
+ transaction_params = get_transaction_params.select {
+ |i| i.key(format_moip_code(moip_code))
+ }.first
+ MyMoip::Transaction.new(transaction_params)
+ end
+
+ private
+
+ def format_moip_code(moip_code)
+ moip_code.to_s.rjust(12, '0').scan(/\d{4}/).join('.')
+ end
+
+ def get_transaction_params
+ payments = response_hash['ConsultarTokenResponse']\
+ ['RespostaConsultar']\
+ ['Autorizacao']\
+ ['Pagamento']
+
+ payments.is_a?(Hash) ? [payments] : payments
+ end
+ end
+end
diff --git a/lib/mymoip/requests/payment_request.rb b/lib/mymoip/requests/payment_request.rb
index 76cb650..6354bbf 100644
--- a/lib/mymoip/requests/payment_request.rb
+++ b/lib/mymoip/requests/payment_request.rb
@@ -6,6 +6,16 @@ class PaymentRequest < Request
REQUIRES_AUTH = false
FORMAT = :json
PAYMENT_SLIP_PATH = "/Instrucao.do?token="
+ STATUSES = {
+ "Autorizado" => 1,
+ "Iniciado" => 2,
+ "BoletoImpresso" => 3,
+ "Concluido" => 4,
+ "Cancelado" => 5,
+ "EmAnalise" => 6,
+ "Estornado" => 7,
+ "Reembolsado" => 9
+ }
attr_reader :token
@@ -45,7 +55,19 @@ def url
def code
@response["CodigoMoIP"]
- rescue NoMethodError => e
+ rescue NoMethodError
+ nil
+ end
+
+ def status
+ STATUSES[@response["Status"]]
+ rescue NoMethodError
+ nil
+ end
+
+ def total_payed
+ @response["TotalPago"]
+ rescue NoMethodError
nil
end
diff --git a/lib/mymoip/transaction.rb b/lib/mymoip/transaction.rb
new file mode 100644
index 0000000..f7f2d3e
--- /dev/null
+++ b/lib/mymoip/transaction.rb
@@ -0,0 +1,21 @@
+module MyMoip
+ class Transaction
+ PARAMS_MAPPER = {
+ 'Data' => 'date', # 2012-04-02T10:45:44.000-03:00
+ 'DataCredito' => 'credit_date', # 2012-04-16T00:00:00.000-03:00
+ 'TotalPago' => 'total_paid_value', # 1.00
+ 'TaxaParaPagador' => 'payer_tax_value', # 0.00
+ 'TaxaMoIP' => 'moip_tax_value', # 0.46
+ 'ValorLiquido' => 'equity_value', # 0.54
+ 'FormaPagamento' => 'payment_method', # CartaoDeCredito
+ 'InstituicaoPagamento' => 'payment_method_institution', # AmericanExpress
+ 'Status' => 'status', # Autorizado
+ 'CodigoMoIP' => 'moip_code', # 0000.2524.0547
+ 'Parcela' => {
+ 'installment' => { 'TotalParcelas' => 'number' }
+ }
+ }
+
+ include MyMoip::ParamsMapper
+ end
+end
\ No newline at end of file
diff --git a/mymoip.gemspec b/mymoip.gemspec
index 78c4fa3..fe321a4 100644
--- a/mymoip.gemspec
+++ b/mymoip.gemspec
@@ -27,4 +27,6 @@ Gem::Specification.new do |spec|
spec.add_development_dependency "rdoc"
spec.add_development_dependency "vcr"
spec.add_development_dependency "webmock"
+ spec.add_development_dependency "minitest"
+ spec.add_development_dependency "pry"
end
diff --git a/test/fixtures/vcr_cassettes/consultation_with_mult_transactions_request.yml b/test/fixtures/vcr_cassettes/consultation_with_mult_transactions_request.yml
new file mode 100644
index 0000000..572b62b
--- /dev/null
+++ b/test/fixtures/vcr_cassettes/consultation_with_mult_transactions_request.yml
@@ -0,0 +1,99 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https://YOUR_MOIP_TOKEN:YOUR_MOIP_KEY@desenvolvedor.moip.com.br/sandbox/ws/alpha/ConsultarInstrucao/U260F1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X7S9X6I783
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers: {}
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 28 May 2014 00:06:32 GMT
+ Server:
+ - Apache
+ Content-Length:
+ - '3080'
+ Vary:
+ - Accept-Encoding
+ Content-Type:
+ - text/xml;charset=UTF-8
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ PG5zMTpDb25zdWx0YXJUb2tlblJlc3BvbnNlIHhtbG5zOm5zMT0iaHR0cDov
+ L3d3dy5tb2lwLmNvbS5ici93cy9hbHBoYS8iPjxSZXNwb3N0YUNvbnN1bHRh
+ cj48SUQ+MjAxNDA1MjcyMTA2MzI0MjQwMDAwMDA1MTY1NDc0PC9JRD48U3Rh
+ dHVzPlN1Y2Vzc288L1N0YXR1cz48QXV0b3JpemFjYW8+PFBhZ2Fkb3I+PE5v
+ bWU+U3Vwb3J0ZSBNb0lQPC9Ob21lPjxFbWFpbD50ZXN0ZUBsYWJzLm1vaXAu
+ Y29tLmJyPC9FbWFpbD48L1BhZ2Fkb3I+PEVuZGVyZWNvQ29icmFuY2E+PExv
+ Z3JhZG91cm8+QXYuIEJyaWdhZGVpcm8gRmFyaWEgTGltYTwvTG9ncmFkb3Vy
+ bz48TnVtZXJvPjI5MjcuMDwvTnVtZXJvPjxDb21wbGVtZW50bz44wrAgQW5k
+ YXI8L0NvbXBsZW1lbnRvPjxCYWlycm8+SmFyZGltIFBhdWxpc3RhbzwvQmFp
+ cnJvPjxDRVA+MDE0NTIwMDA8L0NFUD48Q2lkYWRlPlPDo28gUGF1bG88L0Np
+ ZGFkZT48RXN0YWRvPlNQPC9Fc3RhZG8+PFBhaXM+QlJBPC9QYWlzPjxUZWxl
+ Zm9uZUZpeG8+KDExKTIwNzgtMTUyNTwvVGVsZWZvbmVGaXhvPjwvRW5kZXJl
+ Y29Db2JyYW5jYT48UmVjZWJlZG9yPjxOb21lPk1vaXAgLSBJbnRlZ3Jhw6fD
+ o288L05vbWU+PEVtYWlsPmV4ZW1wbG9AbGFicy5tb2lwLmNvbS5icjwvRW1h
+ aWw+PC9SZWNlYmVkb3I+PFBhZ2FtZW50bz48RGF0YT4yMDEyLTA0LTAyVDEw
+ OjQ1OjQ0LjAwMC0wMzowMDwvRGF0YT48RGF0YUNyZWRpdG8+MjAxMi0wNC0x
+ NlQwMDowMDowMC4wMDAtMDM6MDA8L0RhdGFDcmVkaXRvPjxUb3RhbFBhZ28g
+ TW9lZGE9IkJSTCI+MS4wMDwvVG90YWxQYWdvPjxUYXhhUGFyYVBhZ2Fkb3Ig
+ TW9lZGE9IkJSTCI+MC4wMDwvVGF4YVBhcmFQYWdhZG9yPjxUYXhhTW9JUCBN
+ b2VkYT0iQlJMIj4wLjQ2PC9UYXhhTW9JUD48VmFsb3JMaXF1aWRvIE1vZWRh
+ PSJCUkwiPjAuNTQ8L1ZhbG9yTGlxdWlkbz48Rm9ybWFQYWdhbWVudG8+Q2Fy
+ dGFvRGVDcmVkaXRvPC9Gb3JtYVBhZ2FtZW50bz48SW5zdGl0dWljYW9QYWdh
+ bWVudG8+QW1lcmljYW5FeHByZXNzPC9JbnN0aXR1aWNhb1BhZ2FtZW50bz48
+ U3RhdHVzIFRpcG89IjEiPkF1dG9yaXphZG88L1N0YXR1cz48UGFyY2VsYT48
+ VG90YWxQYXJjZWxhcz4xPC9Ub3RhbFBhcmNlbGFzPjwvUGFyY2VsYT48Q29k
+ aWdvTW9JUD4wMDAwLjAwMDUuMzIzMTwvQ29kaWdvTW9JUD48L1BhZ2FtZW50
+ bz48UGFnYW1lbnRvPjxEYXRhPjIwMTItMDQtMDJUMTA6NDQ6NTcuMDAwLTAz
+ OjAwPC9EYXRhPjxUb3RhbFBhZ28gTW9lZGE9IkJSTCI+MS4wMDwvVG90YWxQ
+ YWdvPjxUYXhhUGFyYVBhZ2Fkb3IgTW9lZGE9IkJSTCI+MC4wMDwvVGF4YVBh
+ cmFQYWdhZG9yPjxUYXhhTW9JUCBNb2VkYT0iQlJMIj4wLjQ2PC9UYXhhTW9J
+ UD48VmFsb3JMaXF1aWRvIE1vZWRhPSJCUkwiPjAuNTQ8L1ZhbG9yTGlxdWlk
+ bz48Rm9ybWFQYWdhbWVudG8+Q2FydGFvRGVDcmVkaXRvPC9Gb3JtYVBhZ2Ft
+ ZW50bz48SW5zdGl0dWljYW9QYWdhbWVudG8+VmlzYTwvSW5zdGl0dWljYW9Q
+ YWdhbWVudG8+PFN0YXR1cyBUaXBvPSI1Ij5DYW5jZWxhZG88L1N0YXR1cz48
+ UGFyY2VsYT48VG90YWxQYXJjZWxhcz4xPC9Ub3RhbFBhcmNlbGFzPjwvUGFy
+ Y2VsYT48Q29kaWdvTW9JUD4wMDAwLjAwMDUuMzIyNzwvQ29kaWdvTW9JUD48
+ L1BhZ2FtZW50bz48UGFnYW1lbnRvPjxEYXRhPjIwMTItMDQtMDJUMTA6NDU6
+ MzQuMDAwLTAzOjAwPC9EYXRhPjxUb3RhbFBhZ28gTW9lZGE9IkJSTCI+MS4w
+ MDwvVG90YWxQYWdvPjxUYXhhUGFyYVBhZ2Fkb3IgTW9lZGE9IkJSTCI+MC4w
+ MDwvVGF4YVBhcmFQYWdhZG9yPjxUYXhhTW9JUCBNb2VkYT0iQlJMIj4wLjAw
+ PC9UYXhhTW9JUD48VmFsb3JMaXF1aWRvIE1vZWRhPSJCUkwiPjEuMDA8L1Zh
+ bG9yTGlxdWlkbz48Rm9ybWFQYWdhbWVudG8+Qm9sZXRvQmFuY2FyaW88L0Zv
+ cm1hUGFnYW1lbnRvPjxJbnN0aXR1aWNhb1BhZ2FtZW50bz5JdGF1PC9JbnN0
+ aXR1aWNhb1BhZ2FtZW50bz48U3RhdHVzIFRpcG89IjMiPkJvbGV0b0ltcHJl
+ c3NvPC9TdGF0dXM+PFBhcmNlbGE+PFRvdGFsUGFyY2VsYXM+MTwvVG90YWxQ
+ YXJjZWxhcz48L1BhcmNlbGE+PENvZGlnb01vSVA+MDAwMC4wMDA1LjMyMzA8
+ L0NvZGlnb01vSVA+PC9QYWdhbWVudG8+PFBhZ2FtZW50bz48RGF0YT4yMDEy
+ LTA0LTAyVDEwOjQ1OjIzLjAwMC0wMzowMDwvRGF0YT48VG90YWxQYWdvIE1v
+ ZWRhPSJCUkwiPjEuMDA8L1RvdGFsUGFnbz48VGF4YVBhcmFQYWdhZG9yIE1v
+ ZWRhPSJCUkwiPjAuMDA8L1RheGFQYXJhUGFnYWRvcj48VGF4YU1vSVAgTW9l
+ ZGE9IkJSTCI+MC40MjwvVGF4YU1vSVA+PFZhbG9yTGlxdWlkbyBNb2VkYT0i
+ QlJMIj4wLjU4PC9WYWxvckxpcXVpZG8+PEZvcm1hUGFnYW1lbnRvPkRlYml0
+ b0JhbmNhcmlvPC9Gb3JtYVBhZ2FtZW50bz48SW5zdGl0dWljYW9QYWdhbWVu
+ dG8+QmFuY29Eb0JyYXNpbDwvSW5zdGl0dWljYW9QYWdhbWVudG8+PFN0YXR1
+ cyBUaXBvPSIyIj5JbmljaWFkbzwvU3RhdHVzPjxQYXJjZWxhPjxUb3RhbFBh
+ cmNlbGFzPjE8L1RvdGFsUGFyY2VsYXM+PC9QYXJjZWxhPjxDb2RpZ29Nb0lQ
+ PjAwMDAuMDAwNS4zMjI5PC9Db2RpZ29Nb0lQPjwvUGFnYW1lbnRvPjxQYWdh
+ bWVudG8+PERhdGE+MjAxMi0wNC0wMlQxMDo0NTowOC4wMDAtMDM6MDA8L0Rh
+ dGE+PFRvdGFsUGFnbyBNb2VkYT0iQlJMIj4xLjAwPC9Ub3RhbFBhZ28+PFRh
+ eGFQYXJhUGFnYWRvciBNb2VkYT0iQlJMIj4wLjAwPC9UYXhhUGFyYVBhZ2Fk
+ b3I+PFRheGFNb0lQIE1vZWRhPSJCUkwiPjAuMDA8L1RheGFNb0lQPjxWYWxv
+ ckxpcXVpZG8gTW9lZGE9IkJSTCI+MS4wMDwvVmFsb3JMaXF1aWRvPjxGb3Jt
+ YVBhZ2FtZW50bz5Cb2xldG9CYW5jYXJpbzwvRm9ybWFQYWdhbWVudG8+PElu
+ c3RpdHVpY2FvUGFnYW1lbnRvPkl0YXU8L0luc3RpdHVpY2FvUGFnYW1lbnRv
+ PjxTdGF0dXMgVGlwbz0iMiI+SW5pY2lhZG88L1N0YXR1cz48UGFyY2VsYT48
+ VG90YWxQYXJjZWxhcz4xPC9Ub3RhbFBhcmNlbGFzPjwvUGFyY2VsYT48Q29k
+ aWdvTW9JUD4wMDAwLjAwMDUuMzIyODwvQ29kaWdvTW9JUD48L1BhZ2FtZW50
+ bz48L0F1dG9yaXphY2FvPjwvUmVzcG9zdGFDb25zdWx0YXI+PC9uczE6Q29u
+ c3VsdGFyVG9rZW5SZXNwb25zZT4=
+ http_version:
+ recorded_at: Wed, 28 May 2014 00:06:34 GMT
+recorded_with: VCR 2.5.0
diff --git a/test/fixtures/vcr_cassettes/consultation_with_one_transaction_request.yml b/test/fixtures/vcr_cassettes/consultation_with_one_transaction_request.yml
new file mode 100644
index 0000000..71fec2b
--- /dev/null
+++ b/test/fixtures/vcr_cassettes/consultation_with_one_transaction_request.yml
@@ -0,0 +1,58 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: https://YOUR_MOIP_TOKEN:YOUR_MOIP_KEY@desenvolvedor.moip.com.br/sandbox/ws/alpha/ConsultarInstrucao/ASDFF1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X759X6ASDF
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers: {}
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 28 May 2014 00:06:32 GMT
+ Server:
+ - Apache
+ Content-Length:
+ - '3080'
+ Vary:
+ - Accept-Encoding
+ Content-Type:
+ - text/xml;charset=UTF-8
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ PG5zMTpDb25zdWx0YXJUb2tlblJlc3BvbnNlIHhtbG5zOm5zMT0iaHR0cDov
+ L3d3dy5tb2lwLmNvbS5ici93cy9hbHBoYS8iPjxSZXNwb3N0YUNvbnN1bHRh
+ cj48SUQ+MjAxNDA1MjcyMTA2MzI0MjQwMDAwMDA1MTY1NDc0PC9JRD48U3Rh
+ dHVzPlN1Y2Vzc288L1N0YXR1cz48QXV0b3JpemFjYW8+PFBhZ2Fkb3I+PE5v
+ bWU+U3Vwb3J0ZSBNb0lQPC9Ob21lPjxFbWFpbD50ZXN0ZUBsYWJzLm1vaXAu
+ Y29tLmJyPC9FbWFpbD48L1BhZ2Fkb3I+PEVuZGVyZWNvQ29icmFuY2E+PExv
+ Z3JhZG91cm8+QXYuIEJyaWdhZGVpcm8gRmFyaWEgTGltYTwvTG9ncmFkb3Vy
+ bz48TnVtZXJvPjI5MjcuMDwvTnVtZXJvPjxDb21wbGVtZW50bz44wrAgQW5k
+ YXI8L0NvbXBsZW1lbnRvPjxCYWlycm8+SmFyZGltIFBhdWxpc3RhbzwvQmFp
+ cnJvPjxDRVA+MDE0NTIwMDA8L0NFUD48Q2lkYWRlPlPDo28gUGF1bG88L0Np
+ ZGFkZT48RXN0YWRvPlNQPC9Fc3RhZG8+PFBhaXM+QlJBPC9QYWlzPjxUZWxl
+ Zm9uZUZpeG8+KDExKTIwNzgtMTUyNTwvVGVsZWZvbmVGaXhvPjwvRW5kZXJl
+ Y29Db2JyYW5jYT48UmVjZWJlZG9yPjxOb21lPk1vaXAgLSBJbnRlZ3Jhw6fD
+ o288L05vbWU+PEVtYWlsPmV4ZW1wbG9AbGFicy5tb2lwLmNvbS5icjwvRW1h
+ aWw+PC9SZWNlYmVkb3I+PFBhZ2FtZW50bz48RGF0YT4yMDEyLTA0LTAyVDEw
+ OjQ1OjQ0LjAwMC0wMzowMDwvRGF0YT48RGF0YUNyZWRpdG8+MjAxMi0wNC0x
+ NlQwMDowMDowMC4wMDAtMDM6MDA8L0RhdGFDcmVkaXRvPjxUb3RhbFBhZ28g
+ TW9lZGE9IkJSTCI+MS4wMDwvVG90YWxQYWdvPjxUYXhhUGFyYVBhZ2Fkb3Ig
+ TW9lZGE9IkJSTCI+MC4wMDwvVGF4YVBhcmFQYWdhZG9yPjxUYXhhTW9JUCBN
+ b2VkYT0iQlJMIj4wLjQ2PC9UYXhhTW9JUD48VmFsb3JMaXF1aWRvIE1vZWRh
+ PSJCUkwiPjAuNTQ8L1ZhbG9yTGlxdWlkbz48Rm9ybWFQYWdhbWVudG8+Q2Fy
+ dGFvRGVDcmVkaXRvPC9Gb3JtYVBhZ2FtZW50bz48SW5zdGl0dWljYW9QYWdh
+ bWVudG8+QW1lcmljYW5FeHByZXNzPC9JbnN0aXR1aWNhb1BhZ2FtZW50bz48
+ U3RhdHVzIFRpcG89IjEiPkF1dG9yaXphZG88L1N0YXR1cz48UGFyY2VsYT48
+ VG90YWxQYXJjZWxhcz4xPC9Ub3RhbFBhcmNlbGFzPjwvUGFyY2VsYT48Q29k
+ aWdvTW9JUD4wMDAwLjAwMDUuMzIzMTwvQ29kaWdvTW9JUD48L1BhZ2FtZW50
+ bz48L0F1dG9yaXphY2FvPjwvUmVzcG9zdGFDb25zdWx0YXI+PC9uczE6Q29u
+ c3VsdGFyVG9rZW5SZXNwb25zZT4=
+ http_version:
+ recorded_at: Wed, 28 May 2014 00:06:34 GMT
+recorded_with: VCR 2.5.0
diff --git a/test/lib/test_consultation_request.rb b/test/lib/test_consultation_request.rb
new file mode 100644
index 0000000..0495c64
--- /dev/null
+++ b/test/lib/test_consultation_request.rb
@@ -0,0 +1,123 @@
+require_relative '../test_helper'
+
+class TestConsultationRequest < Test::Unit::TestCase
+ def test_http_method_as_post
+ assert_equal :get, MyMoip::ConsultationRequest::HTTP_METHOD
+ end
+
+ def test_path
+ assert_equal '/ws/alpha/ConsultarInstrucao', MyMoip::ConsultationRequest::PATH
+ end
+
+ def test_auth_requirement
+ assert_equal true, MyMoip::ConsultationRequest::REQUIRES_AUTH
+ end
+
+ def test_should_provide_the_response_as_a_hash
+ request = MyMoip::ConsultationRequest.new('U260F1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X7S9X6I783')
+
+ VCR.use_cassette('consultation_with_mult_transactions_request') {
+ request.api_call
+ }
+
+ response_hash = request.response_hash
+ assert_equal Hash, response_hash.class
+ assert response_hash.keys.include?('ConsultarTokenResponse')
+ end
+
+ def test_transactions_object_list
+ request = MyMoip::ConsultationRequest.new('TOKEN')
+
+ request.stubs(:get_transaction_params).returns(
+ [ {'Data' => '2012-04-02T10:45:44.000-03:00',
+ 'DataCredito' => '2012-04-16T00:00:00.000-03:00',
+ 'TotalPago' => '1.00',
+ 'TaxaParaPagador' => '0.00',
+ 'TaxaMoIP' => '0.46',
+ 'ValorLiquido' => '0.56',
+ 'FormaPagamento' => 'CartaoDeCredito',
+ 'InstituicaoPagamento' => 'AmericanExpress',
+ 'Parcela' => {'TotalParcelas'=>'1'},
+ 'Status' => 'Autorizado',
+ 'CodigoMoIP' => '0000.2524.0547' },
+ {'Data' => '2012-04-02T10:45:44.000-03:00',
+ 'DataCredito' => '2012-04-16T00:00:00.000-03:00',
+ 'TotalPago' => '10.00',
+ 'TaxaParaPagador' => '1.00',
+ 'TaxaMoIP' => '0.46',
+ 'ValorLiquido' => '0.56',
+ 'FormaPagamento' => 'CartaoDeCredito',
+ 'InstituicaoPagamento' => 'AmericanExpress',
+ 'Parcela' => {'TotalParcelas'=>'1'},
+ 'Status' => 'Autorizado',
+ 'CodigoMoIP' => '0000.1234.5678'} ]
+ )
+
+ assert_equal(MyMoip::Transaction, request.transactions.first.class)
+ assert_equal(MyMoip::Transaction, request.transactions.last.class)
+ assert_equal(2, request.transactions.size)
+ end
+
+ def test_find_transaction_by_moip_id
+ request = MyMoip::ConsultationRequest.new('TOKEN')
+
+ request.stubs(:get_transaction_params).returns(
+ [ {'Data' => '2012-04-02T10:45:44.000-03:00',
+ 'DataCredito' => '2012-04-16T00:00:00.000-03:00',
+ 'TotalPago' => '1.00',
+ 'TaxaParaPagador' => '0.00',
+ 'TaxaMoIP' => '0.46',
+ 'ValorLiquido' => '0.56',
+ 'FormaPagamento' => 'CartaoDeCredito',
+ 'InstituicaoPagamento' => 'AmericanExpress',
+ 'Parcela' => {'TotalParcelas'=>'1'},
+ 'Status' => 'Autorizado',
+ 'CodigoMoIP' => '0000.2524.0547' },
+ {'Data' => '2012-04-02T10:45:44.000-03:00',
+ 'DataCredito' => '2012-04-16T00:00:00.000-03:00',
+ 'TotalPago' => '10.00',
+ 'TaxaParaPagador' => '1.00',
+ 'TaxaMoIP' => '0.46',
+ 'ValorLiquido' => '0.56',
+ 'FormaPagamento' => 'CartaoDeCredito',
+ 'InstituicaoPagamento' => 'AmericanExpress',
+ 'Parcela' => {'TotalParcelas'=>'1'},
+ 'Status' => 'Autorizado',
+ 'CodigoMoIP' => '0000.1234.5678'} ]
+ )
+
+ assert_equal(MyMoip::Transaction, request.transaction('12345678').class)
+ assert_equal('0000.1234.5678', request.transaction('12345678').moip_code)
+ end
+
+ def test_private_get_transaction_params_when_has_multiple_transactions
+ request = MyMoip::ConsultationRequest.new('U260F1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X7S9X6I783')
+
+ VCR.use_cassette('consultation_with_mult_transactions_request') {
+ request.api_call
+ }
+
+ transaction_params = request.send(:get_transaction_params)
+ assert_equal 5, transaction_params.size
+ assert_equal Array, transaction_params.class
+ assert_equal false, transaction_params.empty?
+ end
+
+ def test_private_get_transaction_params_when_has_one_transaction
+ request = MyMoip::ConsultationRequest.new('ASDFF1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X759X6ASDF')
+
+ VCR.use_cassette('consultation_with_one_transaction_request') {
+ request.api_call
+ }
+
+ transaction_params = request.send(:get_transaction_params)
+ assert_equal 1, transaction_params.size
+ assert_equal Array, transaction_params.class
+ assert_equal false, transaction_params.empty?
+ end
+
+ def test_private_format_moip_code
+ request = MyMoip::ConsultationRequest.new('TOKEN')
+ assert_equal '0000.2524.0547', request.send(:format_moip_code, '25240547')
+ end
+end
diff --git a/test/lib/test_js_response.rb b/test/lib/test_js_response.rb
new file mode 100644
index 0000000..f29e45c
--- /dev/null
+++ b/test/lib/test_js_response.rb
@@ -0,0 +1,78 @@
+require_relative '../test_helper'
+
+class TestJsResponse < Test::Unit::TestCase
+ def setup_for_nested_methods
+ @js_response_params = {
+ 'CodigoMoIP' => '0000.1234.5678',
+ 'Mensagem' => 'Requisição processada com sucesso',
+ 'StatusPagamento' => 'Sucesso',
+ 'Status' => 'Autorizado',
+ 'TaxaMoIP' => '20.00',
+ 'TotalPago' => '100.00',
+ 'CodigoRetorno' => '51',
+ 'url' => 'https://www.moip.com.br/Instrucao.do?token=N2S021J',
+ 'Classificacao' => { 'Codigo' => '3',
+ 'Descricao' => 'Politica do banco emissor' }
+ }
+ end
+
+ def setup_for_one_level_nest_methods
+ @js_response_params = {
+ 'Codigo' => '0',
+ 'StatusPagamento' => 'Sucesso',
+ 'CodigoMoIP' => 8_067_235,
+ 'TaxaMoIP' => '13.49',
+ 'Mensagem' => 'Requisição processada com sucesso',
+ 'url' => 'https://desenvolvedor.moip.com.br/sandbox/Instrucao.do?token=02J'
+ }
+ end
+
+ def test_js_response_without_predicted_params
+ js_response_params = {
+ # 'CodigoMoIP' => nil
+ }
+ subject = MyMoip::JsResponse.new(js_response_params)
+ assert_nil subject.moip_code
+ end
+
+ def test_js_response_params_mapping_and_methods_definition_for_nested_methods
+ setup_for_nested_methods
+ subject = MyMoip::JsResponse.new(@js_response_params)
+
+ assert_equal subject.moip_code, '0000.1234.5678'
+ assert_equal subject.message, 'Requisição processada com sucesso'
+ assert_equal subject.payment_status, 'Sucesso'
+ assert_equal subject.status, 'Autorizado'
+ assert_equal subject.moip_tax_value, '20.00'
+ assert_equal subject.total_paid_value, '100.00'
+ assert_equal subject.return_code, '51'
+ assert_equal subject.url, 'https://www.moip.com.br/Instrucao.do?token=N2S021J'
+
+ assert_equal subject.classification.code, '3'
+ assert_equal subject.classification.description, 'Politica do banco emissor'
+ end
+
+ def test_js_response_params_mapping_and_methods_definition_for_one_level_nest
+ setup_for_one_level_nest_methods
+ subject = MyMoip::JsResponse.new(@js_response_params)
+
+ assert_equal '0', subject.code
+ assert_equal 'Sucesso', subject.payment_status
+ assert_equal 8067235, subject.moip_code
+ assert_equal '13.49', subject.moip_tax_value
+ assert_equal 'Requisição processada com sucesso', subject.message
+ assert_equal 'https://desenvolvedor.moip.com.br/sandbox/Instrucao.do?token=02J', subject.url
+ end
+
+ def test_success?
+ setup_for_nested_methods
+ subject = MyMoip::JsResponse.new(@js_response_params)
+ assert subject.success?
+
+ @js_response_params['StatusPagamento'] = 'Falha'
+ subject = MyMoip::JsResponse.new(@js_response_params)
+
+ assert_equal false, subject.success?
+ assert_equal true, subject.failed?
+ end
+end
diff --git a/test/lib/test_nasp.rb b/test/lib/test_nasp.rb
new file mode 100644
index 0000000..81c9d94
--- /dev/null
+++ b/test/lib/test_nasp.rb
@@ -0,0 +1,41 @@
+require_relative '../test_helper'
+
+class TestNasp < Test::Unit::TestCase
+ def setup
+ @nasp_params = {
+ 'id_transacao' => 'abc.1234',
+ 'valor' => '100',
+ 'status_pagamento' => 5,
+ 'cod_moip' => 12345678,
+ 'forma_pagamento' => 3,
+ 'tipo_pagamento' => 'CartaoDeCredito',
+ 'parcelas' => 1,
+ 'email_consumidor' => 'pagador@email.com.br',
+ 'recebedor_login' => 'cliente@dominio.com.br',
+ 'cartao_bin' => '123456',
+ 'cartao_final' => '4324',
+ 'cartao_bandeira' => 'AmericanExpress',
+ 'cofre' => '4780c1fb-e47d-448e-ad7b-506c125366fc',
+ 'classificacao' => 'Política do Banco Emissor'
+ }
+ end
+
+ def test_nasp_params_mapping_and_methods_definition
+ subject = MyMoip::Nasp.new(@nasp_params)
+
+ assert_equal subject.transaction_id, 'abc.1234'
+ assert_equal subject.paid_value, '100'
+ assert_equal subject.status, 5
+ assert_equal subject.moip_code, 12345678
+ assert_equal subject.payment_method_code, 3
+ assert_equal subject.payment_method, 'CartaoDeCredito'
+ assert_equal subject.installments, 1
+ assert_equal subject.payer_mail, 'pagador@email.com.br'
+ assert_equal subject.seller_mail, 'cliente@dominio.com.br'
+ assert_equal subject.card_first_numbers, '123456'
+ assert_equal subject.card_last_numbers, '4324'
+ assert_equal subject.credit_card_logo, 'AmericanExpress'
+ assert_equal subject.moip_lock_number, '4780c1fb-e47d-448e-ad7b-506c125366fc'
+ assert_equal subject.classification, 'Política do Banco Emissor'
+ end
+end
diff --git a/test/lib/test_payment_request.rb b/test/lib/test_payment_request.rb
index b48b66e..5684123 100644
--- a/test/lib/test_payment_request.rb
+++ b/test/lib/test_payment_request.rb
@@ -70,51 +70,60 @@ def test_success_method_returns_false_in_payments_already_made
end
def test_method_to_get_moip_code
- instruction = Fixture.instruction(payer: Fixture.payer)
- transparent_request = MyMoip::TransparentRequest.new("your_own_id")
- VCR.use_cassette('transparent_request') do
- transparent_request.api_call(instruction)
- end
- credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, installments: 1)
- payment_request = MyMoip::PaymentRequest.new("your_own_id")
- VCR.use_cassette('payment_request') do
- payment_request.api_call(credit_card_payment, token: transparent_request.token)
- end
- assert_equal 102596, payment_request.code
+ make_a_successfully_payment
+ assert_equal 102596, @payment_request.code
+ end
+
+ def test_method_to_get_status
+ make_a_successfully_payment
+ assert_equal 6, @payment_request.status
+ end
+
+ def test_method_to_get_total_payed
+ make_a_successfully_payment
+ assert_equal '200.00', @payment_request.total_payed
end
def test_code_method_should_return_nil_with_blank_response
- instruction = Fixture.instruction(payer: Fixture.payer)
- transparent_request = MyMoip::TransparentRequest.new("your_own_id")
- VCR.use_cassette('transparent_request') do
- transparent_request.api_call(instruction)
- end
- credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, installments: 1)
payment_request = MyMoip::PaymentRequest.new("your_own_id")
assert_nil payment_request.code
end
+ def test_status_method_should_return_nil_with_blank_response
+ payment_request = MyMoip::PaymentRequest.new("your_own_id")
+ assert_nil payment_request.status
+ end
+
+ def test_total_payed_method_should_return_nil_with_blank_response
+ payment_request = MyMoip::PaymentRequest.new("your_own_id")
+ assert_nil payment_request.total_payed
+ end
+
def test_method_to_get_response_url
+ make_a_successfully_payment
+ assert_equal "https://desenvolvedor.moip.com.br/sandbox/Instrucao.do?token=#{@transparent_request.token}", @payment_request.url
+ end
+
+ def test_url_method_should_return_nil_with_blank_response
instruction = Fixture.instruction(payer: Fixture.payer)
transparent_request = MyMoip::TransparentRequest.new("your_own_id")
VCR.use_cassette('transparent_request') do
transparent_request.api_call(instruction)
end
- payment_slip_payment = MyMoip::PaymentSlipPayment.new
payment_request = MyMoip::PaymentRequest.new("your_own_id")
- VCR.use_cassette('payment_request_with_payment_slip') do
- payment_request.api_call(payment_slip_payment, token: transparent_request.token)
- end
- assert_equal "https://desenvolvedor.moip.com.br/sandbox/Instrucao.do?token=#{transparent_request.token}", payment_request.url
+ assert_nil payment_request.url
end
- def test_url_method_should_return_nil_with_blank_response
+ def make_a_successfully_payment
instruction = Fixture.instruction(payer: Fixture.payer)
- transparent_request = MyMoip::TransparentRequest.new("your_own_id")
+ @transparent_request = MyMoip::TransparentRequest.new("your_own_id")
VCR.use_cassette('transparent_request') do
- transparent_request.api_call(instruction)
+ @transparent_request.api_call(instruction)
+ end
+ credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, installments: 1)
+ @payment_request = MyMoip::PaymentRequest.new("your_own_id")
+ VCR.use_cassette('payment_request') do
+ @payment_request.api_call(credit_card_payment, token: @transparent_request.token)
end
- payment_request = MyMoip::PaymentRequest.new("your_own_id")
- assert_nil payment_request.url
end
end
diff --git a/test/lib/test_request.rb b/test/lib/test_request.rb
index 1f87ade..63aa606 100644
--- a/test/lib/test_request.rb
+++ b/test/lib/test_request.rb
@@ -52,7 +52,8 @@ def test_logs_api_call_response_in_debug_level
logger = stub_everything
request = MyMoip::Request.new("request_id")
params = {
- http_method: :post, body: "", path: "/ws/alpha/EnviarInstrucao/Unica"
+ http_method: :post, body: "",
+ path: "/ws/alpha/EnviarInstrucao/Unica"
}
HTTParty.stubs(:send).returns("some_result")
@@ -85,4 +86,19 @@ def test_raises_error_before_api_calls_without_a_token_set
subject.api_call({})
end
end
+
+ def test_stubbing_a_timeout
+ subject = MyMoip::Request.new("request_id")
+
+ params = {
+ http_method: :post, body: "",
+ path: "/ws/alpha/EnviarInstrucao/Unica"
+ }
+
+ HTTParty.stubs(:post).raises(Net::ReadTimeout)
+
+ assert_raises Net::ReadTimeout do
+ subject.api_call(params, timeout: 3)
+ end
+ end
end
diff --git a/test/lib/test_transaction.rb b/test/lib/test_transaction.rb
new file mode 100644
index 0000000..075da62
--- /dev/null
+++ b/test/lib/test_transaction.rb
@@ -0,0 +1,35 @@
+require_relative '../test_helper'
+
+class TestTransaction < Test::Unit::TestCase
+ def setup
+ @transaction_params = {
+ 'Data' => '2012-04-02T10:45:44.000-03:00',
+ 'DataCredito' => '2012-04-16T00:00:00.000-03:00',
+ 'TotalPago' => '1.00',
+ 'TaxaParaPagador' => '0.00',
+ 'TaxaMoIP' => '0.46',
+ 'ValorLiquido' => '0.56',
+ 'FormaPagamento' => 'CartaoDeCredito',
+ 'InstituicaoPagamento' => 'AmericanExpress',
+ 'Parcela' => { 'TotalParcelas' => '1' },
+ 'Status' => 'Autorizado',
+ 'CodigoMoIP' => '0000.2524.0547'
+ }
+ end
+
+ def test_nasp_params_mapping_and_methods_definition
+ subject = MyMoip::Transaction.new(@transaction_params)
+
+ assert_equal subject.date, '2012-04-02T10:45:44.000-03:00'
+ assert_equal subject.credit_date, '2012-04-16T00:00:00.000-03:00'
+ assert_equal subject.total_paid_value, '1.00'
+ assert_equal subject.payer_tax_value, '0.00'
+ assert_equal subject.moip_tax_value, '0.46'
+ assert_equal subject.equity_value, '0.56'
+ assert_equal subject.payment_method, 'CartaoDeCredito'
+ assert_equal subject.payment_method_institution, 'AmericanExpress'
+ assert_equal subject.status, 'Autorizado'
+ assert_equal subject.installment.number, '1'
+ assert_equal subject.moip_code, '0000.2524.0547'
+ end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 0785932..0ce7256 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -1,3 +1,4 @@
+require 'minitest/unit'
require 'test/unit'
require 'mocha/setup'
require 'vcr'