From c115ab7a0d713bf44e8424de9e1b84c0e4ac2f73 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Wed, 28 Jan 2026 15:03:56 +1100 Subject: [PATCH] Translate Taler payment status to error message --- app/models/spree/payment_method/taler.rb | 3 +- config/locales/en.yml | 3 ++ .../models/spree/payment_method/taler_spec.rb | 32 +++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/app/models/spree/payment_method/taler.rb b/app/models/spree/payment_method/taler.rb index 273b11ee9d..d50625b309 100644 --- a/app/models/spree/payment_method/taler.rb +++ b/app/models/spree/payment_method/taler.rb @@ -56,8 +56,9 @@ module Spree taler_order = client.fetch_order(payment.response_code) status = taler_order["order_status"] success = (status == "paid") + message = I18n.t(status, default: status, scope: "taler.order_status") - ActiveMerchant::Billing::Response.new(success, status) + ActiveMerchant::Billing::Response.new(success, message) end private diff --git a/config/locales/en.yml b/config/locales/en.yml index 1d081df210..e34ed5c0d2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -288,6 +288,9 @@ en: success_code: disconnected: "Stripe account disconnected." + taler: + order_status: + claimed: "The payment request expired. Please try again." activemodel: errors: messages: diff --git a/spec/models/spree/payment_method/taler_spec.rb b/spec/models/spree/payment_method/taler_spec.rb index 1d9bf77ec8..fb314043b1 100644 --- a/spec/models/spree/payment_method/taler_spec.rb +++ b/spec/models/spree/payment_method/taler_spec.rb @@ -5,20 +5,48 @@ require 'spec_helper' RSpec.describe Spree::PaymentMethod::Taler do subject(:taler) { Spree::PaymentMethod::Taler.new( - preferred_backend_url: "https://backend.demo.taler.net/instances/sandbox", + preferred_backend_url: backend_url, preferred_api_key: "sandbox", ) } + let(:backend_url) { "https://backend.demo.taler.net/instances/sandbox" } describe "#external_payment_url", vcr: true do it "retrieves a URL to pay at and stores it on the payment record" do order = create(:order_ready_for_confirmation, payment_method: taler) url = subject.external_payment_url(order:) - expect(url).to match %r{\Ahttps://backend.demo.taler.net/instances/sandb} + expect(url).to start_with backend_url payment = order.payments.last.reload expect(payment.response_code).to match "2026.022-0284X4GE8WKMJ" expect(payment.redirect_auth_url).to eq url end end + + describe "#purchase" do + let(:money) { 100 } + let(:source) { taler } + let(:payment) { build(:payment, response_code: "taler-order-7") } + let(:order_url) { "#{backend_url}/private/orders/taler-order-7" } + + it "returns an ActiveMerchant response" do + order_status = "paid" + stub_request(:get, order_url).to_return(body: { order_status: }.to_json) + + response = taler.purchase(nil, nil, payment:) + + expect(response.success?).to eq true + expect(response.message).to eq "paid" + end + + it "translates error messages" do + order_status = "claimed" + stub_request(:get, order_url).to_return(body: { order_status: }.to_json) + + response = taler.purchase(nil, nil, payment:) + + expect(response.success?).to eq false + expect(response.message).to eq "The payment request expired. Please try again." + end + end end