From 23a4ca593365844bce269bd249cff2a2b03da6c2 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Fri, 20 Mar 2026 15:47:59 +1100 Subject: [PATCH] Add additional Taler token requests to specs --- ...eference_and_retrieves_a_URL_to_pay_at.yml | 155 ++++++++++++------ .../taler/_id/completes_the_order.yml | 61 ++++++- .../models/spree/payment_method/taler_spec.rb | 14 +- spec/system/admin/payments_taler_spec.rb | 2 + 4 files changed, 177 insertions(+), 55 deletions(-) diff --git a/spec/fixtures/vcr_cassettes/Spree_PaymentMethod_Taler/_external_payment_url/creates_an_order_reference_and_retrieves_a_URL_to_pay_at.yml b/spec/fixtures/vcr_cassettes/Spree_PaymentMethod_Taler/_external_payment_url/creates_an_order_reference_and_retrieves_a_URL_to_pay_at.yml index 5c658e01f3..c454945912 100644 --- a/spec/fixtures/vcr_cassettes/Spree_PaymentMethod_Taler/_external_payment_url/creates_an_order_reference_and_retrieves_a_URL_to_pay_at.yml +++ b/spec/fixtures/vcr_cassettes/Spree_PaymentMethod_Taler/_external_payment_url/creates_an_order_reference_and_retrieves_a_URL_to_pay_at.yml @@ -1,54 +1,5 @@ --- http_interactions: -- request: - method: post - uri: https://backend.demo.taler.net/instances/sandbox/private/orders - body: - encoding: UTF-8 - string: '{"order":{"amount":"KUDOS:10.0","summary":"Open Food Network order","fulfillment_url":"http://test.host/payment_gateways/taler/61"},"create_token":false}' - headers: - Authorization: - - "" - Accept: - - application/json - User-Agent: - - Taler Ruby - Content-Type: - - application/json - Accept-Encoding: - - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 - response: - status: - code: 200 - message: OK - headers: - Server: - - nginx/1.26.3 - Date: - - Thu, 22 Jan 2026 04:43:32 GMT - Content-Type: - - application/json - Content-Length: - - '42' - Connection: - - keep-alive - Access-Control-Allow-Origin: - - "*" - Access-Control-Expose-Headers: - - "*" - Cache-Control: - - no-store - Via: - - 1.1 Caddy - Strict-Transport-Security: - - max-age=63072000; includeSubDomains; preload - body: - encoding: UTF-8 - string: |- - { - "order_id": "2026.022-0284X4GE8WKMJ" - } - recorded_at: Thu, 22 Jan 2026 04:43:33 GMT - request: method: get uri: https://backend.demo.taler.net/instances/sandbox/private/orders/2026.022-0284X4GE8WKMJ @@ -103,4 +54,108 @@ http_interactions: } } recorded_at: Thu, 22 Jan 2026 04:43:34 GMT -recorded_with: VCR 6.3.1 +- request: + method: post + uri: https://backend.demo.taler.net/instances/sandbox/private/token + body: + encoding: UTF-8 + string: '{"scope":"write"}' + headers: + Authorization: + - "" + Accept: + - application/json + User-Agent: + - Taler Ruby + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx/1.26.3 + Date: + - Fri, 20 Mar 2026 04:31:47 GMT + Content-Type: + - application/json + Content-Length: + - '258' + Connection: + - keep-alive + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - "*" + Cache-Control: + - no-store + Via: + - 1.1 Caddy + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: ASCII-8BIT + string: |- + { + "access_token": "secret-token:J38S28NEJ6T07H1WP60F3T6PPWQYNKMR251TEZEX3CXP3SH54210", + "token": "secret-token:J38S28NEJ6T07H1WP60F3T6PPWQYNKMR251TEZEX3CXP3SH54210", + "scope": "write", + "refreshable": false, + "expiration": { + "t_s": 1774067507 + } + } + recorded_at: Fri, 20 Mar 2026 04:31:48 GMT +- request: + method: post + uri: https://backend.demo.taler.net/instances/sandbox/private/orders + body: + encoding: UTF-8 + string: '{"order":{"amount":"KUDOS:10.0","summary":"Open Food Network order","fulfillment_url":"http://test.host/payment_gateways/taler/198"},"create_token":false}' + headers: + Authorization: + - "" + Accept: + - application/json + User-Agent: + - Taler Ruby + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx/1.26.3 + Date: + - Fri, 20 Mar 2026 04:31:48 GMT + Content-Type: + - application/json + Content-Length: + - '42' + Connection: + - keep-alive + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - "*" + Cache-Control: + - no-store + Via: + - 1.1 Caddy + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "order_id": "2026.079-0189PJNWMX6JA" + } + recorded_at: Fri, 20 Mar 2026 04:31:48 GMT +recorded_with: VCR 6.4.0 diff --git a/spec/fixtures/vcr_cassettes/payment_gateways/taler/_id/completes_the_order.yml b/spec/fixtures/vcr_cassettes/payment_gateways/taler/_id/completes_the_order.yml index d84ef9f88a..a6355acd98 100644 --- a/spec/fixtures/vcr_cassettes/payment_gateways/taler/_id/completes_the_order.yml +++ b/spec/fixtures/vcr_cassettes/payment_gateways/taler/_id/completes_the_order.yml @@ -47,6 +47,61 @@ http_interactions: "detail": "taler-order-id:12345" } recorded_at: Sat, 24 Jan 2026 00:51:31 GMT +- request: + method: post + uri: https://backend.demo.taler.net/instances/sandbox/private/token + body: + encoding: UTF-8 + string: '{"scope":"write"}' + headers: + Authorization: + - "" + Accept: + - application/json + User-Agent: + - Taler Ruby + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx/1.26.3 + Date: + - Fri, 20 Mar 2026 04:52:23 GMT + Content-Type: + - application/json + Content-Length: + - '258' + Connection: + - keep-alive + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - "*" + Cache-Control: + - no-store + Via: + - 1.1 Caddy + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: ASCII-8BIT + string: |- + { + "access_token": "secret-token:176N5XTVVSR98FE6V4QR2Y35HKS61ZW5CK1BC7YEZYHX9M41N5GG", + "token": "secret-token:176N5XTVVSR98FE6V4QR2Y35HKS61ZW5CK1BC7YEZYHX9M41N5GG", + "scope": "write", + "refreshable": false, + "expiration": { + "t_s": 1774068743 + } + } + recorded_at: Fri, 20 Mar 2026 04:52:23 GMT - request: method: get uri: https://backend.demo.taler.net/instances/sandbox/private/orders/2026.020-03R3ETNZZ0DVA @@ -70,7 +125,7 @@ http_interactions: Server: - nginx/1.26.3 Date: - - Sat, 24 Jan 2026 00:55:33 GMT + - Fri, 20 Mar 2026 04:52:24 GMT Content-Type: - application/json Content-Length: @@ -205,5 +260,5 @@ http_interactions: "refund_details": [], "order_status_url": "https://backend.demo.taler.net/instances/sandbox/orders/2026.020-03R3ETNZZ0DVA" } - recorded_at: Sat, 24 Jan 2026 00:55:32 GMT -recorded_with: VCR 6.3.1 + recorded_at: Fri, 20 Mar 2026 04:52:24 GMT +recorded_with: VCR 6.4.0 diff --git a/spec/models/spree/payment_method/taler_spec.rb b/spec/models/spree/payment_method/taler_spec.rb index fc52541693..81f50b1a81 100644 --- a/spec/models/spree/payment_method/taler_spec.rb +++ b/spec/models/spree/payment_method/taler_spec.rb @@ -10,16 +10,18 @@ RSpec.describe Spree::PaymentMethod::Taler do ) } let(:backend_url) { "https://backend.demo.taler.net/instances/sandbox" } + let(:token_url) { "#{backend_url}/private/token" } describe "#external_payment_url", vcr: true do it "creates an order reference and retrieves a URL to pay at" do order = create(:order_ready_for_confirmation, payment_method: taler) url = subject.external_payment_url(order:) - expect(url).to eq "#{backend_url}/orders/2026.022-0284X4GE8WKMJ" + expect(url).to start_with "#{backend_url}/orders/" + expect(url).to match "orders/20...[0-9A-Z-]{17}$" payment = order.payments.last.reload - expect(payment.response_code).to match "2026.022-0284X4GE8WKMJ" + expect(payment.response_code).to match "20...[0-9A-Z-]{17}$" end end @@ -29,6 +31,10 @@ RSpec.describe Spree::PaymentMethod::Taler do let(:payment) { build(:payment, response_code: "taler-order-7") } let(:order_url) { "#{backend_url}/private/orders/taler-order-7" } + before do + stub_request(:post, token_url).to_return(body: { token: "12345" }.to_json) + end + it "returns an ActiveMerchant response" do order_status = "paid" stub_request(:get, order_url).to_return(body: { order_status: }.to_json) @@ -57,6 +63,10 @@ RSpec.describe Spree::PaymentMethod::Taler do "taler://refund/backend.demo.taler.net/instances/sandbox/taler-order-8/" } + before do + stub_request(:post, token_url).to_return(body: { token: "12345" }.to_json) + end + it "starts the refund process" do order_status = { order_status: "paid", diff --git a/spec/system/admin/payments_taler_spec.rb b/spec/system/admin/payments_taler_spec.rb index b6ab367ba0..2d08f419f5 100644 --- a/spec/system/admin/payments_taler_spec.rb +++ b/spec/system/admin/payments_taler_spec.rb @@ -32,8 +32,10 @@ RSpec.describe "Admin -> Order -> Payments" do amount: "KUDOS:2", } } + token_endpoint = "https://taler.example.com/private/token" 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(:post, token_endpoint).to_return(body: { token: "abc" }.to_json) stub_request(:get, order_endpoint).to_return(body: order_status.to_json) stub_request(:post, refund_endpoint).to_return(body: "{}")