From c4cbc9f6ce8dce79f9a6b977e86fb65130a7d287 Mon Sep 17 00:00:00 2001 From: Hugo Maia Vieira Date: Sat, 14 Dec 2013 15:48:16 -0200 Subject: [PATCH 01/18] add PaymentRequest#total_payed and PaymentRequest#status --- lib/mymoip/requests/payment_request.rb | 24 +++++++++- test/lib/test_payment_request.rb | 63 +++++++++++++++----------- 2 files changed, 59 insertions(+), 28 deletions(-) diff --git a/lib/mymoip/requests/payment_request.rb b/lib/mymoip/requests/payment_request.rb index 76cb650..ed98fb0 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 @@ -49,5 +59,17 @@ def code nil end + def status + STATUSES[@response["Status"]] + rescue NoMethodError => e + nil + end + + def total_payed + @response["TotalPago"] + rescue NoMethodError => e + nil + end + end -end +end \ No newline at end of file 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 From fccd19c5f64b3e8096bb4ac02b1e6affac647617 Mon Sep 17 00:00:00 2001 From: Hugo Maia Vieira Date: Tue, 27 May 2014 19:07:29 -0300 Subject: [PATCH 02/18] remove useless variables --- lib/mymoip/requests/payment_request.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/mymoip/requests/payment_request.rb b/lib/mymoip/requests/payment_request.rb index ed98fb0..6354bbf 100644 --- a/lib/mymoip/requests/payment_request.rb +++ b/lib/mymoip/requests/payment_request.rb @@ -55,21 +55,21 @@ def url def code @response["CodigoMoIP"] - rescue NoMethodError => e + rescue NoMethodError nil end def status STATUSES[@response["Status"]] - rescue NoMethodError => e + rescue NoMethodError nil end def total_payed @response["TotalPago"] - rescue NoMethodError => e + rescue NoMethodError nil end end -end \ No newline at end of file +end From fe8d76c8919563bdf2a18bd235851c9717ce8026 Mon Sep 17 00:00:00 2001 From: Hugo Maia Vieira Date: Wed, 28 May 2014 09:30:39 -0300 Subject: [PATCH 03/18] start consultation api --- README.md | 10 ++ lib/mymoip/requests/consultation_request.rb | 23 +++++ .../vcr_cassettes/consultation_request.yml | 99 +++++++++++++++++++ test/lib/test_consultation_request.rb | 23 +++++ 4 files changed, 155 insertions(+) create mode 100644 lib/mymoip/requests/consultation_request.rb create mode 100644 test/fixtures/vcr_cassettes/consultation_request.yml create mode 100644 test/lib/test_consultation_request.rb 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/requests/consultation_request.rb b/lib/mymoip/requests/consultation_request.rb new file mode 100644 index 0000000..e5ed662 --- /dev/null +++ b/lib/mymoip/requests/consultation_request.rb @@ -0,0 +1,23 @@ +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 xml_str + @response.body + end + + end +end diff --git a/test/fixtures/vcr_cassettes/consultation_request.yml b/test/fixtures/vcr_cassettes/consultation_request.yml new file mode 100644 index 0000000..572b62b --- /dev/null +++ b/test/fixtures/vcr_cassettes/consultation_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/lib/test_consultation_request.rb b/test/lib/test_consultation_request.rb new file mode 100644 index 0000000..247d096 --- /dev/null +++ b/test/lib/test_consultation_request.rb @@ -0,0 +1,23 @@ +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_xml_str_get_by_the_request + request = MyMoip::ConsultationRequest.new('U260F1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X7S9X6I783') + + VCR.use_cassette('consultation_request') { request.api_call } + + assert_block { request.xml_str.match(/^ Date: Mon, 21 Jul 2014 13:37:05 -0300 Subject: [PATCH 04/18] tiny refactoring on PaymentSlip --- lib/mymoip/payment_slip.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 From 2876db9ff15923aef931befd207f3ef7d645fba7 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Thu, 24 Jul 2014 17:37:06 -0300 Subject: [PATCH 05/18] initializing nasp class - mapping response params and generating methods --- lib/mymoip/nasp.rb | 36 ++++++++++++++++++++++++++++++++++++ test/lib/test_nasp.rb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 lib/mymoip/nasp.rb create mode 100644 test/lib/test_nasp.rb diff --git a/lib/mymoip/nasp.rb b/lib/mymoip/nasp.rb new file mode 100644 index 0000000..a6cdd8d --- /dev/null +++ b/lib/mymoip/nasp.rb @@ -0,0 +1,36 @@ +module MyMoip + class Nasp + NASP_PARAMS_MAPPER = { + 'id_transacao' => 'transaction_id', + 'valor' => 'paid_value', + 'status_pagamento' => 'status', + 'cod_moip' => 'moip_code', + 'forma_pagamento' => 'payment_method', + 'tipo_pagamento' => 'payment_type', + 'parcelas' => 'installments', + 'email_consumidor' => 'consumer_mail', + 'classificacao' => 'classification' + } + + NASP_PARAMS_MAPPER.values.map(&:to_sym).each do |attribute| + attr_accessor attribute + end + + def initialize(response_params) + @response_params = response_params + map_and_define_methods! + end + + private + + def map_and_define_methods! + @response_params.each do |key, value| + if NASP_PARAMS_MAPPER.keys.include?(key) + define_singleton_method NASP_PARAMS_MAPPER.fetch(key) do + value + end + end + end + end + end +end \ No newline at end of file diff --git a/test/lib/test_nasp.rb b/test/lib/test_nasp.rb new file mode 100644 index 0000000..b3463bc --- /dev/null +++ b/test/lib/test_nasp.rb @@ -0,0 +1,31 @@ +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', + 'classificacao' => 'Solicitado pelo vendedor' + } + end + + def test_nasp_params_mapping_and_methods_definition + subject = MyMoip::Nasp.new(@nasp_params) + + assert_equal @nasp_params['id_transacao'], subject.transaction_id + assert_equal @nasp_params['valor'], subject.paid_value + assert_equal @nasp_params['status_pagamento'], subject.status + assert_equal @nasp_params['cod_moip'], subject.moip_code + assert_equal @nasp_params['forma_pagamento'], subject.payment_method + assert_equal @nasp_params['tipo_pagamento'], subject.payment_type + assert_equal @nasp_params['parcelas'], subject.installments + assert_equal @nasp_params['email_consumidor'], subject.consumer_mail + assert_equal @nasp_params['classificacao'], subject.classification + end +end From 5d34a628ab2bdd7c15716fe08b32a03609f9e34d Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Thu, 24 Jul 2014 17:50:53 -0300 Subject: [PATCH 06/18] extra moip nasp params --- lib/mymoip/nasp.rb | 6 +++++- test/lib/test_nasp.rb | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/mymoip/nasp.rb b/lib/mymoip/nasp.rb index a6cdd8d..49ac190 100644 --- a/lib/mymoip/nasp.rb +++ b/lib/mymoip/nasp.rb @@ -8,7 +8,11 @@ class Nasp 'forma_pagamento' => 'payment_method', 'tipo_pagamento' => 'payment_type', 'parcelas' => 'installments', - 'email_consumidor' => 'consumer_mail', + 'email_consumidor' => 'payer_mail', + 'recebedor_login' => 'seller_mail', + 'cartao_bin' => 'card_first_numbers', + 'cartao_final' => 'card_last_numbers', + 'cofre' => 'moip_lock_number', 'classificacao' => 'classification' } diff --git a/test/lib/test_nasp.rb b/test/lib/test_nasp.rb index b3463bc..58cea7e 100644 --- a/test/lib/test_nasp.rb +++ b/test/lib/test_nasp.rb @@ -25,7 +25,11 @@ def test_nasp_params_mapping_and_methods_definition assert_equal @nasp_params['forma_pagamento'], subject.payment_method assert_equal @nasp_params['tipo_pagamento'], subject.payment_type assert_equal @nasp_params['parcelas'], subject.installments - assert_equal @nasp_params['email_consumidor'], subject.consumer_mail + assert_equal @nasp_params['email_consumidor'], subject.payer_mail + assert_equal @nasp_params['recebedor_login'], subject.seller_mail + assert_equal @nasp_params['cartao_bin'], subject.card_first_numbers + assert_equal @nasp_params['cartao_final'], subject.card_last_numbers + assert_equal @nasp_params['cofre'], subject.moip_lock_number assert_equal @nasp_params['classificacao'], subject.classification end end From 0c79c5da1bf593d837824ea0f03d9d40d1a45d86 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Fri, 25 Jul 2014 10:43:02 -0300 Subject: [PATCH 07/18] nasp extra attributes --- lib/mymoip/nasp.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/mymoip/nasp.rb b/lib/mymoip/nasp.rb index a6cdd8d..49ac190 100644 --- a/lib/mymoip/nasp.rb +++ b/lib/mymoip/nasp.rb @@ -8,7 +8,11 @@ class Nasp 'forma_pagamento' => 'payment_method', 'tipo_pagamento' => 'payment_type', 'parcelas' => 'installments', - 'email_consumidor' => 'consumer_mail', + 'email_consumidor' => 'payer_mail', + 'recebedor_login' => 'seller_mail', + 'cartao_bin' => 'card_first_numbers', + 'cartao_final' => 'card_last_numbers', + 'cofre' => 'moip_lock_number', 'classificacao' => 'classification' } From 55458611891e5cb4834d81d2d6d1dba55dce5f25 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Fri, 25 Jul 2014 10:43:47 -0300 Subject: [PATCH 08/18] payment transactions finding on consultation --- lib/mymoip/requests/consultation_request.rb | 28 +++++- ...ltation_with_mult_transactions_request.yml | 99 +++++++++++++++++++ ...sultation_with_one_transaction_request.yml | 58 +++++++++++ test/lib/test_consultation_request.rb | 50 +++++++++- 4 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/vcr_cassettes/consultation_with_mult_transactions_request.yml create mode 100644 test/fixtures/vcr_cassettes/consultation_with_one_transaction_request.yml diff --git a/lib/mymoip/requests/consultation_request.rb b/lib/mymoip/requests/consultation_request.rb index e5ed662..7215c62 100644 --- a/lib/mymoip/requests/consultation_request.rb +++ b/lib/mymoip/requests/consultation_request.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/hash' + module MyMoip class ConsultationRequest < Request @@ -15,9 +17,31 @@ def api_call(opts = {}) super(params, opts) end - def xml_str - @response.body + def response_hash + Hash.from_xml(@response.body) + end + + def transactions + @transactions ||= get_payment_nodes + end + + def transaction(moip_code) + transactions.select { |i| i.key(format_moip_code(moip_code)) }.first end + private + + def format_moip_code(moip_code) + moip_code.to_s.rjust(12, '0').scan(/\d{4}/).join('.') + end + + def get_payment_nodes + payments = response_hash['ConsultarTokenResponse']\ + ['RespostaConsultar']\ + ['Autorizacao']\ + ['Pagamento'] + + payments.is_a?(Hash) ? [payments] : payments + end end 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 index 247d096..6da5c09 100644 --- a/test/lib/test_consultation_request.rb +++ b/test/lib/test_consultation_request.rb @@ -13,11 +13,55 @@ def test_auth_requirement assert_equal true, MyMoip::ConsultationRequest::REQUIRES_AUTH end - def test_should_provide_the_xml_str_get_by_the_request + def test_should_provide_the_response_as_a_hash request = MyMoip::ConsultationRequest.new('U260F1E2P0G4N0Z2T1S0M4T3C5E4J5M8L5U0G0I0U0M0H0Y0E3X7S9X6I783') - VCR.use_cassette('consultation_request') { request.api_call } + VCR.use_cassette('consultation_with_mult_transactions_request') { + request.api_call + } - assert_block { request.xml_str.match(/^ Date: Fri, 25 Jul 2014 10:46:15 -0300 Subject: [PATCH 09/18] nasp extra attributes specs --- test/lib/test_nasp.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/lib/test_nasp.rb b/test/lib/test_nasp.rb index b3463bc..58cea7e 100644 --- a/test/lib/test_nasp.rb +++ b/test/lib/test_nasp.rb @@ -25,7 +25,11 @@ def test_nasp_params_mapping_and_methods_definition assert_equal @nasp_params['forma_pagamento'], subject.payment_method assert_equal @nasp_params['tipo_pagamento'], subject.payment_type assert_equal @nasp_params['parcelas'], subject.installments - assert_equal @nasp_params['email_consumidor'], subject.consumer_mail + assert_equal @nasp_params['email_consumidor'], subject.payer_mail + assert_equal @nasp_params['recebedor_login'], subject.seller_mail + assert_equal @nasp_params['cartao_bin'], subject.card_first_numbers + assert_equal @nasp_params['cartao_final'], subject.card_last_numbers + assert_equal @nasp_params['cofre'], subject.moip_lock_number assert_equal @nasp_params['classificacao'], subject.classification end end From 80e65035257796ea72fa694e9ae858909b37f1e8 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Fri, 25 Jul 2014 10:47:44 -0300 Subject: [PATCH 10/18] consultation request yml removal (now splitted on single and multiple transactions) --- .ruby-version | 1 + Gemfile | 2 +- mymoip.gemspec | 2 + .../vcr_cassettes/consultation_request.yml | 99 ------------------- test/test_helper.rb | 1 + 5 files changed, 5 insertions(+), 100 deletions(-) create mode 100644 .ruby-version delete mode 100644 test/fixtures/vcr_cassettes/consultation_request.yml diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..e1b9401 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.0.0-p195 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/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_request.yml b/test/fixtures/vcr_cassettes/consultation_request.yml deleted file mode 100644 index 572b62b..0000000 --- a/test/fixtures/vcr_cassettes/consultation_request.yml +++ /dev/null @@ -1,99 +0,0 @@ ---- -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/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' From 34ea2d9c1477f320e8de307fb217bbe6d9d4dbc6 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Fri, 25 Jul 2014 16:34:26 -0300 Subject: [PATCH 11/18] nasp integration w/ params mapper --- lib/mymoip/nasp.rb | 28 +++++----------------------- lib/mymoip/params_mapper.rb | 16 ++++++++++++++++ test/lib/test_nasp.rb | 34 ++++++++++++++++++++-------------- 3 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 lib/mymoip/params_mapper.rb diff --git a/lib/mymoip/nasp.rb b/lib/mymoip/nasp.rb index 49ac190..7870841 100644 --- a/lib/mymoip/nasp.rb +++ b/lib/mymoip/nasp.rb @@ -1,40 +1,22 @@ module MyMoip class Nasp - NASP_PARAMS_MAPPER = { + PARAMS_MAPPER = { 'id_transacao' => 'transaction_id', 'valor' => 'paid_value', 'status_pagamento' => 'status', 'cod_moip' => 'moip_code', - 'forma_pagamento' => 'payment_method', - 'tipo_pagamento' => 'payment_type', + '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' } - NASP_PARAMS_MAPPER.values.map(&:to_sym).each do |attribute| - attr_accessor attribute - end - - def initialize(response_params) - @response_params = response_params - map_and_define_methods! - end - - private - - def map_and_define_methods! - @response_params.each do |key, value| - if NASP_PARAMS_MAPPER.keys.include?(key) - define_singleton_method NASP_PARAMS_MAPPER.fetch(key) do - value - end - end - end - end + 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..7bd7ece --- /dev/null +++ b/lib/mymoip/params_mapper.rb @@ -0,0 +1,16 @@ +module MyMoip + module ParamsMapper + + def initialize(params) + self.class::PARAMS_MAPPER.values.each do |attribute| + value = params[self.class::PARAMS_MAPPER.key(attribute)] + + if attribute.is_a?(Hash) + attribute, value = [attribute.keys.first, value.values.first] + end + + define_singleton_method attribute do value end + end + end + end +end \ No newline at end of file diff --git a/test/lib/test_nasp.rb b/test/lib/test_nasp.rb index 58cea7e..81c9d94 100644 --- a/test/lib/test_nasp.rb +++ b/test/lib/test_nasp.rb @@ -11,25 +11,31 @@ def setup 'tipo_pagamento' => 'CartaoDeCredito', 'parcelas' => 1, 'email_consumidor' => 'pagador@email.com.br', - 'classificacao' => 'Solicitado pelo vendedor' + '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 @nasp_params['id_transacao'], subject.transaction_id - assert_equal @nasp_params['valor'], subject.paid_value - assert_equal @nasp_params['status_pagamento'], subject.status - assert_equal @nasp_params['cod_moip'], subject.moip_code - assert_equal @nasp_params['forma_pagamento'], subject.payment_method - assert_equal @nasp_params['tipo_pagamento'], subject.payment_type - assert_equal @nasp_params['parcelas'], subject.installments - assert_equal @nasp_params['email_consumidor'], subject.payer_mail - assert_equal @nasp_params['recebedor_login'], subject.seller_mail - assert_equal @nasp_params['cartao_bin'], subject.card_first_numbers - assert_equal @nasp_params['cartao_final'], subject.card_last_numbers - assert_equal @nasp_params['cofre'], subject.moip_lock_number - assert_equal @nasp_params['classificacao'], subject.classification + 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 From cced22f18fb05e3f45d009ec8142fc4ccc7d4a79 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Fri, 25 Jul 2014 16:35:53 -0300 Subject: [PATCH 12/18] transaction integration w/ mapper --- lib/mymoip/transaction.rb | 19 +++++++++++++++++++ test/lib/test_transaction.rb | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 lib/mymoip/transaction.rb create mode 100644 test/lib/test_transaction.rb diff --git a/lib/mymoip/transaction.rb b/lib/mymoip/transaction.rb new file mode 100644 index 0000000..b033a5d --- /dev/null +++ b/lib/mymoip/transaction.rb @@ -0,0 +1,19 @@ +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 + 'Parcela' => { 'installments' => 'TotalParcelas' }, + 'CodigoMoIP' => 'moip_code' # 0000.2524.0547 + } + + include MyMoip::ParamsMapper + end +end \ No newline at end of file diff --git a/test/lib/test_transaction.rb b/test/lib/test_transaction.rb new file mode 100644 index 0000000..27e9344 --- /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.installments, '1' + assert_equal subject.moip_code, '0000.2524.0547' + end +end From cca4657de2a7a2aad3d9e8166843e3812c5261db Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Fri, 25 Jul 2014 16:36:37 -0300 Subject: [PATCH 13/18] transactions query and object building --- lib/mymoip.rb | 1 + lib/mymoip/requests/consultation_request.rb | 11 ++- test/lib/test_consultation_request.rb | 94 ++++++++++++++++----- 3 files changed, 84 insertions(+), 22 deletions(-) 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/requests/consultation_request.rb b/lib/mymoip/requests/consultation_request.rb index 7215c62..a05e8a4 100644 --- a/lib/mymoip/requests/consultation_request.rb +++ b/lib/mymoip/requests/consultation_request.rb @@ -22,11 +22,16 @@ def response_hash end def transactions - @transactions ||= get_payment_nodes + @transactions ||= get_transaction_params.map do |transaction_params| + MyMoip::Transaction.new(transaction_params) + end end def transaction(moip_code) - transactions.select { |i| i.key(format_moip_code(moip_code)) }.first + transaction_params = get_transaction_params.select { + |i| i.key(format_moip_code(moip_code)) + }.first + MyMoip::Transaction.new(transaction_params) end private @@ -35,7 +40,7 @@ def format_moip_code(moip_code) moip_code.to_s.rjust(12, '0').scan(/\d{4}/).join('.') end - def get_payment_nodes + def get_transaction_params payments = response_hash['ConsultarTokenResponse']\ ['RespostaConsultar']\ ['Autorizacao']\ diff --git a/test/lib/test_consultation_request.rb b/test/lib/test_consultation_request.rb index 6da5c09..0495c64 100644 --- a/test/lib/test_consultation_request.rb +++ b/test/lib/test_consultation_request.rb @@ -25,39 +25,95 @@ def test_should_provide_the_response_as_a_hash assert response_hash.keys.include?('ConsultarTokenResponse') end - def test_transactions_when_response_has_multiple_transactions + 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 } - assert_equal 5, request.transactions.length - assert_equal Array, request.transactions.class - assert_equal false, request.transactions.empty? + 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_transactions_when_response_has_one_transaction + 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 } - assert_equal 1, request.transactions.length - assert_equal Array, request.transactions.class - assert_equal false, request.transactions.empty? - end - - def test_find_a_transaction_by_formatted_moip_code_on_transactions_list - request = MyMoip::ConsultationRequest.new('TOKEN') - - request.stubs(:transactions).returns( - [{ moip_code: '0000.2524.0547' }, { moip_code: '0000.1234.0547'}] - ) - - transaction = request.transaction('12340547') - assert_equal({ moip_code: '0000.1234.0547'}, transaction) + 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 From 997bd83ea6b3704b97ad3680d5219d87a7823448 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Mon, 28 Jul 2014 15:05:51 -0300 Subject: [PATCH 14/18] generating open struct objects for nested hashes params --- lib/mymoip/js_response.rb | 19 +++++++++++++++++++ lib/mymoip/params_mapper.rb | 11 +++++++++-- lib/mymoip/transaction.rb | 6 ++++-- test/lib/test_js_response.rb | 35 +++++++++++++++++++++++++++++++++++ test/lib/test_transaction.rb | 4 ++-- 5 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 lib/mymoip/js_response.rb create mode 100644 test/lib/test_js_response.rb diff --git a/lib/mymoip/js_response.rb b/lib/mymoip/js_response.rb new file mode 100644 index 0000000..eb15f59 --- /dev/null +++ b/lib/mymoip/js_response.rb @@ -0,0 +1,19 @@ +module MyMoip + class JsResponse + PARAMS_MAPPER = { + '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 + end +end \ No newline at end of file diff --git a/lib/mymoip/params_mapper.rb b/lib/mymoip/params_mapper.rb index 7bd7ece..c3eb8c6 100644 --- a/lib/mymoip/params_mapper.rb +++ b/lib/mymoip/params_mapper.rb @@ -1,16 +1,23 @@ module MyMoip module ParamsMapper - def initialize(params) self.class::PARAMS_MAPPER.values.each do |attribute| value = params[self.class::PARAMS_MAPPER.key(attribute)] if attribute.is_a?(Hash) - attribute, value = [attribute.keys.first, value.values.first] + 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] + + obj = OpenStruct.new(Hash[ value.map { |k, v| [mapped_methods[k], v] } ]) + define_singleton_method method_name do obj end + end end end \ No newline at end of file diff --git a/lib/mymoip/transaction.rb b/lib/mymoip/transaction.rb index b033a5d..f7f2d3e 100644 --- a/lib/mymoip/transaction.rb +++ b/lib/mymoip/transaction.rb @@ -10,8 +10,10 @@ class Transaction 'FormaPagamento' => 'payment_method', # CartaoDeCredito 'InstituicaoPagamento' => 'payment_method_institution', # AmericanExpress 'Status' => 'status', # Autorizado - 'Parcela' => { 'installments' => 'TotalParcelas' }, - 'CodigoMoIP' => 'moip_code' # 0000.2524.0547 + 'CodigoMoIP' => 'moip_code', # 0000.2524.0547 + 'Parcela' => { + 'installment' => { 'TotalParcelas' => 'number' } + } } include MyMoip::ParamsMapper diff --git a/test/lib/test_js_response.rb b/test/lib/test_js_response.rb new file mode 100644 index 0000000..c54673f --- /dev/null +++ b/test/lib/test_js_response.rb @@ -0,0 +1,35 @@ +require_relative '../test_helper' + +class TestJsResponse < Test::Unit::TestCase + def setup_with_success + @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 test_js_response_params_mapping_and_methods_definition + setup_with_success + 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 +end \ No newline at end of file diff --git a/test/lib/test_transaction.rb b/test/lib/test_transaction.rb index 27e9344..075da62 100644 --- a/test/lib/test_transaction.rb +++ b/test/lib/test_transaction.rb @@ -11,7 +11,7 @@ def setup 'ValorLiquido' => '0.56', 'FormaPagamento' => 'CartaoDeCredito', 'InstituicaoPagamento' => 'AmericanExpress', - 'Parcela' => {'TotalParcelas'=>'1'}, + 'Parcela' => { 'TotalParcelas' => '1' }, 'Status' => 'Autorizado', 'CodigoMoIP' => '0000.2524.0547' } @@ -29,7 +29,7 @@ def test_nasp_params_mapping_and_methods_definition assert_equal subject.payment_method, 'CartaoDeCredito' assert_equal subject.payment_method_institution, 'AmericanExpress' assert_equal subject.status, 'Autorizado' - assert_equal subject.installments, '1' + assert_equal subject.installment.number, '1' assert_equal subject.moip_code, '0000.2524.0547' end end From cbf0bda5738bd101ae0fa55775ac7213507c948b Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Mon, 28 Jul 2014 15:20:34 -0300 Subject: [PATCH 15/18] success/failed js_response helper methods --- lib/mymoip/js_response.rb | 8 ++++++++ test/lib/test_js_response.rb | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/mymoip/js_response.rb b/lib/mymoip/js_response.rb index eb15f59..bffe0b1 100644 --- a/lib/mymoip/js_response.rb +++ b/lib/mymoip/js_response.rb @@ -15,5 +15,13 @@ class JsResponse } 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/test/lib/test_js_response.rb b/test/lib/test_js_response.rb index c54673f..92b2dad 100644 --- a/test/lib/test_js_response.rb +++ b/test/lib/test_js_response.rb @@ -1,7 +1,7 @@ require_relative '../test_helper' class TestJsResponse < Test::Unit::TestCase - def setup_with_success + def setup @js_response_params = { 'CodigoMoIP' => '0000.1234.5678', 'Mensagem' => 'Requisição processada com sucesso', @@ -18,8 +18,8 @@ def setup_with_success def test_js_response_params_mapping_and_methods_definition - setup_with_success 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' @@ -32,4 +32,15 @@ def test_js_response_params_mapping_and_methods_definition assert_equal subject.classification.code, '3' assert_equal subject.classification.description, 'Politica do banco emissor' end + + def test_success? + 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 \ No newline at end of file From 054b6a1ee96ce975412ebfe62775a4058bfae451 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Mon, 28 Jul 2014 17:37:49 -0300 Subject: [PATCH 16/18] avoiding generating methods that not appears on params --- lib/mymoip/js_response.rb | 1 + lib/mymoip/params_mapper.rb | 3 ++- test/lib/test_js_response.rb | 28 ++++++++++++++++++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/mymoip/js_response.rb b/lib/mymoip/js_response.rb index bffe0b1..5d095db 100644 --- a/lib/mymoip/js_response.rb +++ b/lib/mymoip/js_response.rb @@ -1,6 +1,7 @@ module MyMoip class JsResponse PARAMS_MAPPER = { + 'Codigo' => 'code', 'CodigoMoIP' => 'moip_code', 'Mensagem' => 'message', 'StatusPagamento' => 'payment_status', diff --git a/lib/mymoip/params_mapper.rb b/lib/mymoip/params_mapper.rb index c3eb8c6..b163e3f 100644 --- a/lib/mymoip/params_mapper.rb +++ b/lib/mymoip/params_mapper.rb @@ -1,7 +1,8 @@ module MyMoip module ParamsMapper def initialize(params) - self.class::PARAMS_MAPPER.values.each do |attribute| + self.class::PARAMS_MAPPER.values.each_with_index do |attribute, index| + next unless params.include?(self.class::PARAMS_MAPPER.keys[index]) value = params[self.class::PARAMS_MAPPER.key(attribute)] if attribute.is_a?(Hash) diff --git a/test/lib/test_js_response.rb b/test/lib/test_js_response.rb index 92b2dad..9a3e075 100644 --- a/test/lib/test_js_response.rb +++ b/test/lib/test_js_response.rb @@ -1,7 +1,7 @@ require_relative '../test_helper' class TestJsResponse < Test::Unit::TestCase - def setup + def setup_for_nested_methods @js_response_params = { 'CodigoMoIP' => '0000.1234.5678', 'Mensagem' => 'Requisição processada com sucesso', @@ -16,8 +16,19 @@ def setup } 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_params_mapping_and_methods_definition + 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' @@ -33,7 +44,20 @@ def test_js_response_params_mapping_and_methods_definition 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? From 9639fa73869203fe48aa2ade8d1ab739198b32a7 Mon Sep 17 00:00:00 2001 From: Hugo Maia Vieira Date: Tue, 29 Jul 2014 18:36:47 -0300 Subject: [PATCH 17/18] initialize predicted methods --- .gitignore | 2 ++ .ruby-version | 1 - lib/mymoip/params_mapper.rb | 10 ++++++---- test/lib/test_js_response.rb | 10 +++++++++- 4 files changed, 17 insertions(+), 6 deletions(-) delete mode 100644 .ruby-version 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/.ruby-version b/.ruby-version deleted file mode 100644 index e1b9401..0000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.0.0-p195 diff --git a/lib/mymoip/params_mapper.rb b/lib/mymoip/params_mapper.rb index b163e3f..56db476 100644 --- a/lib/mymoip/params_mapper.rb +++ b/lib/mymoip/params_mapper.rb @@ -2,7 +2,6 @@ module MyMoip module ParamsMapper def initialize(params) self.class::PARAMS_MAPPER.values.each_with_index do |attribute, index| - next unless params.include?(self.class::PARAMS_MAPPER.keys[index]) value = params[self.class::PARAMS_MAPPER.key(attribute)] if attribute.is_a?(Hash) @@ -17,8 +16,11 @@ def define_multiple_attributes(hash, value) method_name = hash.keys.first mapped_methods = hash[method_name] - obj = OpenStruct.new(Hash[ value.map { |k, v| [mapped_methods[k], v] } ]) - define_singleton_method method_name do obj end + 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 \ No newline at end of file +end diff --git a/test/lib/test_js_response.rb b/test/lib/test_js_response.rb index 9a3e075..f29e45c 100644 --- a/test/lib/test_js_response.rb +++ b/test/lib/test_js_response.rb @@ -27,6 +27,14 @@ def setup_for_one_level_nest_methods } 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) @@ -67,4 +75,4 @@ def test_success? assert_equal false, subject.success? assert_equal true, subject.failed? end -end \ No newline at end of file +end From db1f187d54a95c235f760ba004cc29ef830f7d52 Mon Sep 17 00:00:00 2001 From: Oswaldo S Ferreira Date: Tue, 26 Aug 2014 15:35:33 -0300 Subject: [PATCH 18/18] request timeout --- lib/mymoip/request.rb | 2 ++ test/lib/test_request.rb | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) 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/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