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'