diff --git a/app/models/spree/payment_method/taler.rb b/app/models/spree/payment_method/taler.rb index fb89e42a1d..7c4953eac6 100644 --- a/app/models/spree/payment_method/taler.rb +++ b/app/models/spree/payment_method/taler.rb @@ -75,10 +75,10 @@ module Spree ActiveMerchant::Billing::Response.new(success, message) end - def credit(money, gateway_options) + def credit(money, response_code, gateway_options) amount = money / 100 # called with cents payment = gateway_options[:payment] - taler_order = taler_order(id: payment.response_code) + taler_order = taler_order(id: response_code) status = taler_order.fetch("order_status") raise "Unsupported action" if status != "paid" diff --git a/spec/models/spree/payment_method/taler_spec.rb b/spec/models/spree/payment_method/taler_spec.rb index 3b44f82a8d..a9e87bb0b6 100644 --- a/spec/models/spree/payment_method/taler_spec.rb +++ b/spec/models/spree/payment_method/taler_spec.rb @@ -69,7 +69,7 @@ RSpec.describe Spree::PaymentMethod::Taler do response_code: "taler-order-8", ) expect { - response = taler.credit(100, { payment: order.payments[0] }) + response = taler.credit(100, "taler-order-8", { payment: order.payments[0] }) expect(response.success?).to eq true }.to enqueue_mail(PaymentMailer, :refund_available) end @@ -85,7 +85,7 @@ RSpec.describe Spree::PaymentMethod::Taler do response_code: "taler-order-8", ) expect { - taler.credit(100, { payment: order.payments[0] }) + taler.credit(100, "taler-order-8", { payment: order.payments[0] }) }.to raise_error StandardError, "Unsupported action" end end diff --git a/spec/system/admin/payments_taler_spec.rb b/spec/system/admin/payments_taler_spec.rb index b6ab367ba0..bafabe2c89 100644 --- a/spec/system/admin/payments_taler_spec.rb +++ b/spec/system/admin/payments_taler_spec.rb @@ -25,7 +25,7 @@ RSpec.describe "Admin -> Order -> Payments" do login_as distributor.owner end - it "allows to refund a Taler payment" do + it "allows to void a Taler payment" do order_status = { order_status: "paid", contract_terms: { @@ -49,4 +49,35 @@ RSpec.describe "Admin -> Order -> Payments" do expect(page).not_to have_link "Void" end end + + it "allows to credit a Taler payment" do + order_status = { + order_status: "paid", + contract_terms: { + amount: "KUDOS:2", + } + } + order_endpoint = "https://taler.example.com/private/orders/taler-id-1" + refund_endpoint = "https://taler.example.com/private/orders/taler-id-1/refund" + stub_request(:get, order_endpoint).to_return(body: order_status.to_json) + stub_request(:post, refund_endpoint).to_return(body: "{}") + + visit spree.admin_order_payments_path(order.number) + + within row_containing("Taler") do + expect(page).to have_text "COMPLETED" + expect(page).to have_link "Credit" + + click_link class: "icon-credit" + + expect(page).to have_text "COMPLETED" + expect(page).not_to have_link "Credit" + end + + # Our payment system creates a new payment to show the credit. + within row_containing("$-9.75") do + # TODO: don't offer to void a credited amount. + expect(page).to have_link "Void" + end + end end